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

时间:2015-09-28 21:35:56

标签: 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 with the connection object
    }

}

?>

Connection.php

<?php

class Connection {

    public $connection;

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

}

?>

main.php

<?php

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

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

?>

当我在main.php中做类似的事情时,我会遇到一堆错误。当我在var_dump( $conn_object );文件中User.php时,我总是得到一个null,就像文件甚至没有“看到”Connection对象一样,或者知道它存在。< / p>

但是,当我直接在Connection中使用main.php类时,我没有收到任何错误,一切都顺利进行。这意味着我的Connection对象没有任何语法错误或其他。

这种事情不允许在PHP中完成吗?该语言是否允许在类中使用类?

2 个答案:

答案 0 :(得分:0)

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

<?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
    }

}

?>

答案 1 :(得分:0)

仅供参考:我试着回答一个问题,就好像我是第一次问这个问题一样,尽量包含那些没有你或我那么多知识的人所需要的信息。这样可以更容易对于那些只是学习寻找答案的人。

require "Connection.php";

require "User.php";

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

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

要使用外部连接对象,您需要将连接对象传递给用户对象,以便用户对象可以使用连接对象,如下所示。

$thisConnection = new Connection(); $thisUser = new User(); $thisUser = new User($thisConnection); 要么 $thisUser->setConnection($thisConnection);

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

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

此外,通过使用用户类扩展连接类,可以节省大量编码。

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

为了清楚起见,当您使用用户类扩展Connection类时,只要将它们设置为public或protected,用户类将继承方法以及连接类的变量,并且您将成为能够访问任何变量或方法,如get_email方法,如下所示:

$thisUser->get_email( 4 );

希望这会有所帮助。 斯科特