【问题标题】:Using an external object inside a class declaration - PHP在类声明中使用外部对象 - PHP
【发布时间】:2015-09-28 21:35:55
【问题描述】:

假设我有两个 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 中做类似的事情时,我得到了一堆错误。当我在User.php 文件中var_dump( $conn_object ); 时,我总是得到一个null,就像该文件甚至没有“看到”Connection 对象,或者知道它存在。

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

这种事情在PHP中是不允许做的吗?语言不允许在类中使用类吗?

【问题讨论】:

  • 提供这些错误。您的代码运行没有错误。
  • 删除了所有的“帮助”和“感谢”句子

标签: php mysql class


【解决方案1】:

仅供参考:我尝试像第一次提出问题一样回答问题,并尝试包含尽可能多的信息,以满足没有您或我这么多知识的人所需要的信息。这样会更容易对于那些刚刚学习寻找答案的人。

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-&gt;setConnection($thisConnection);

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

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

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

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

需要说明的是,当你用用户类扩展Connection类时,用户类将继承连接类的方法和变量,只要它们设置为public或protected,你就会被能够访问任何变量或方法,例如 get_email 方法,如下所示:

$thisUser-&gt;get_email( 4 );

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

【讨论】:

  • Connection 对象注入User 对象似乎是执行此操作的最佳方法。不过,附带问题:如果我有一个带有 private protected 变量的父类,子类仍然可以访问该变量吗?感谢您的帮助。
  • 无论什么原因,如果变量或方法设置为私有,子类/子类将无法访问它。
【解决方案2】:

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

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

}

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 2020-04-22
    • 2021-05-31
    • 2014-10-21
    • 2010-09-27
    • 2018-08-26
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多