在类声明中使用外部对象-PHP

在类声明中使用外部对象-PHP,php,mysql,class,Php,Mysql,Class,假设我有两个PHP类:User&Connection 从他们的名字可以明显看出他们的所作所为 现在假设我有以下代码: User.php <?php class User { static function get_email( $user_id ) { $conn_object = new Connection(); $connection = $conn_object->connection; // do stuff w

假设我有两个PHP类:
User
&
Connection

从他们的名字可以明显看出他们的所作所为

现在假设我有以下代码:

User.php

<?php

class User {

    static function get_email( $user_id ) {
        $conn_object = new Connection();
        $connection  = $conn_object->connection;
        // do stuff with the connection object
    }

}

?>
<?php

class Connection {

    public $connection;

    public function __construct() {
        $this->connection = // connect to the database here
    }

}

?>
<?php

require "Connection.php";
require "User.php";

$email = User::get_email( 4 ); // this doesn't work

?>
main.php

<?php

class User {

    static function get_email( $user_id ) {
        $conn_object = new Connection();
        $connection  = $conn_object->connection;
        // do stuff with the connection object
    }

}

?>
<?php

class Connection {

    public $connection;

    public function __construct() {
        $this->connection = // connect to the database here
    }

}

?>
<?php

require "Connection.php";
require "User.php";

$email = User::get_email( 4 ); // this doesn't work

?>

记住类通过继承或依赖注入共享方法或属性

<?php

class Connection {

    protected $connection;
    //we changed protected because only direct inherit can acces

    public function __construct() {
        $this->connection = // connect to the database here
   }

}

<?php

include connection.php...

class User extends Connection{

      function __construct(){
        parent::contruct();
      }

    static function get_email( $user_id ) {

        $this->connection->yourDbstuff ;
        // do stuff with the connection object
    }

}

?>

仅供参考:我试图回答一个问题,就好像我是第一次问这个问题一样,并尝试包含一些没有你或我那么多知识的人所需要的信息。这让那些刚刚学会寻找答案的人更容易

需要“Connection.php”

需要“User.php”

$email=User::get_email(4);//这不起作用

“::”引用了一个父方法,因此如果您没有使用User类扩展Connection类,它将无法工作。即使你有,它也不能保证有效,这更可能意味着我在尝试时做了错事

要使用外部连接对象,需要将连接对象传递给用户对象,以便用户对象可以按如下方式使用连接对象

$thisConnection=新连接()
$thisUser=新用户()
$thisUser=新用户($thisConnection)
$thisUser->setConnection($thisConnection)

然后,在用户类中,需要一个方法或一组方法来复制连接类中的方法

然而,正如Joaquin Javi所提到的,面向对象编程使用继承,子对象继承并访问父对象方法

此外,通过使用user类扩展connection类,您可以节省大量的代码

另一方面,如果您有不想使用extends和继承快捷方式的特定原因,则需要将Connection对象传递给User对象

需要明确的是,当您使用user类扩展Connection类时,user类将继承Connection类的方法以及变量,只要它们设置为public或protected,并且您将能够访问任何变量或方法,例如get_email方法,如下所示:

$thisUser->获取电子邮件(4)

希望这有帮助。
Scott提供这些错误。您的代码运行没有错误。已删除所有“帮助”和“感谢”语句将
连接
对象注入
用户
对象似乎是实现此目的的最佳方式。不过,附带的问题是:如果我有一个父类,它有一个
私有保护的
变量,那么子类仍然可以访问该变量吗?感谢您的帮助。无论出于何种原因,如果变量或方法设置为private,则childclass/子类将无法访问它。