为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
紫衣仙女 2023-07-07 10:41:29
我有一个看似简单的查询,但我在其他地方没有找到答案。我有 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
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

作为一个简单的示例,您的数据库将类似于以下内容:

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 ...

    }

}


查看完整回答
反对 回复 2023-07-07
?
GCT1015

TA贡献1827条经验 获得超4个赞

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();


查看完整回答
反对 回复 2023-07-07
  • 2 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信