如何在 PHP 7 中的另一个类中使用一个类的实例

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


class User{

    global $db;


    public function __construct()

    {

        var_dump($this-> db);

    }//end constructor

}//end class


紫衣仙女
浏览 114回答 2
2回答

MMTTMM

由于您的数据库客户端将被实例化一次,然后在其他地方使用,我最初的想法是建议将其作为构造函数参数传递(依赖注入),但由于您不喜欢这种方法,所以我建议将您的数据库客户端设置为单例类,这意味着它只能实例化一次,任何后续尝试都将在各处返回相同的实例。作为一个简单的示例,您的数据库将类似于以下内容: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 ...    }}

GCT1015

PHP 不像 Javascript 那样处理范围,你的 $db 是未定义的。变量的作用域是定义它的上下文。大多数情况下,所有 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();
打开App,查看更多内容
随时随地看视频慕课网APP