【问题标题】:How to use an instance of a class within another class in PHP 7如何在 PHP 7 中的另一个类中使用一个类的实例
【发布时间】:2020-06-30 11:18:43
【问题描述】:

我有一个看似简单的查询,但我在其他地方没有找到答案。 我有 2 个类,一个称为 DB,它本质上连接到数据库,然后可以运行查询。我在文档顶部实例化它 $db= new DB;然后我可以在整个页面中对数据库运行一系列查询。 我遇到的问题是我想在另一个名为 User 的类中使用这个实例。 我知道我可以再次实例化,但这没有意义,或者在实例化用户时传递数据库实例,例如 $user = new User($db);但是考虑到 $db 实例将被我要创建的大多数类使用,我认为有更好的解决方案可以将其导入其他类。 我查看了全局路线,但我读到这是不好的做法 + 我遇到了意外的全局错误

class User{
    global $db;

    public function __construct()
    {
        var_dump($this-> db);
    }//end constructor
}//end class

【问题讨论】:

  • global 在那里的关键字无效。您只能在函数中使用它。是的,这是个坏主意,new User($db) 是最好的主意。 (User 是否应该直接访问数据库是另一个话题;如果您遵循 Active Record 模式,则可以,否则不可以。)

标签: php oop


【解决方案1】:

由于您的数据库客户端将被实例化一次,然后在其他任何地方使用,我最初的想法是建议将其作为构造函数参数(依赖注入)传递,但由于您不喜欢这种方法,我建议您制作数据库客户端一个单例类,这意味着它只能被实例化一次,任何后续尝试都会在任何地方返回相同的实例。

您可以在Creating the Singleton design pattern in PHP5 看到有关 PHP 中单例类的详细回复。

作为一个简单的示例,您的数据库看起来与此类似:

final class DB
{
    public static function getInstance()
    {
        static $inst = null;

        if ($inst === null) {
            $inst = new self();
        }

        return $inst;
    }

    private function __construct()
    {
        // your code here ...
    }

    // your code here ...
}

然后,在您的 User 类上,您将获得 DB 类实例:

class User {
    // your code here ...

    public function doSomething() {
        $db = DB::getInstance();

        // your code here ...
    }
}

【讨论】:

  • 谢谢,我希望有一种简单的方法来检索实例,我会将其保留在函数中
【解决方案2】:

PHP 不像 Javascript 那样处理作用域,你的 $db 是未定义的。

变量的范围是定义它的上下文。大多数情况下,所有 PHP 变量只有一个作用域。这个单一范围也涵盖了包含和必需的文件 […] 在用户定义的函数中,引入了本地函数范围。默认情况下,函数内使用的任何变量都仅限于本地函数范围。

来源http://php.net/manual/en/language.variables.scope.php

这意味着 PHP 中只有一个全局作用域和一个函数/方法作用域。所以,要么将 $db 实例作为协作者传递给方法

class User{

    public function __construct() {}

    public function getInfo(Database $db) {
        $db->query( /* ... */ );
    }
}

$user = new User();
$db = new Database();
$user->getInfo($db);

或者在构造函数中传递(依赖注入)

class User{
    private $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function getInfo() {
        $this->db->query( /* ... */);
    }
}

$db = new Database();
$user = new User($db);
$user->getInfo();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2013-09-19
    • 2020-10-16
    • 1970-01-01
    • 2015-08-26
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多