首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保仅在PHP中为第一个实例调用父类的构造函数

确保仅在PHP中为第一个实例调用父类的构造函数
EN

Stack Overflow用户
提问于 2014-07-07 19:24:16
回答 1查看 107关注 0票数 1

我正在开发一个模型,其中我将有一个父类,名为database。这将具有直接在数据库上工作的方法。我将有一些其他类,它们将扩展database类以使用它的功能(访问数据库)。但是,这些类需要定义自己的__construct方法,database类将连接到其__construct方法中的数据库。

下面是我的一个例子,user类的user显式调用一个查询(只有在调用了database类的__construct方法时,查询才能工作)。

代码语言:javascript
复制
<?php
    class database {
        private $mysqli;

        function __construct() {
            $this -> mysqli = new mysqli(..login_details..);
        }

        public function query($query) {
            return $this -> mysqli -> query($query);
        }

    }

    class user extends database {

        function __construct() {
            $users = $this -> query("SELECT * FROM users");
            while($u = $users -> fetch_assoc()) {
                print_r($u);
            }
        }

    }

    $user = new user();

?>

一种方法是在子类中显式调用parent :: __constructor();,但我不希望它必须为每个继承的类重新连接到数据库,也就是说,我只希望它在类第一次继承它时连接。我该怎么做呢?我必须在database构造之外这样做吗?:

代码语言:javascript
复制
private static $mysqli = new mysqli(...);

还是我要用完全错误的方式实现我的模型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-07 19:41:08

我想说的是,使用依赖注入而不是继承。想想is a关系继承通常意味着什么。例如,类cat可以从类mammal继承。作为一只猫is a哺乳动物,这是有意义的。

这在你的情况下是不合理的。在实例化用户类时,可能会在构造函数中传递数据库对象。

代码语言:javascript
复制
class user{
         private $DB = null;

        function __construct(database $DB) {
            $this->DB = $DB;
            $users = $this -> DB -> query("SELECT * FROM users");
            while($u = $users -> fetch_assoc()) {
                print_r($u);
            }
        }

    }
$DB = new database();
$user = new user($DB);

有不止一种方法可以得到你想要的结果,我只是认为这是一种更合适的方法。此外,您还可以使用原始的database对象,而无需多次调用构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24618267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档