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

时间:2014-07-07 19:24:16

标签: php oop inheritance constructor

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

我的意思的一个示例如下,__construct类的user显式调用查询(仅当__construct database方法时才会生效已经调用过类)。

<?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构造之外执行此操作?:

private static $mysqli = new mysqli(...);

或者我要以完全错误的方式实施我的模型?

1 个答案:

答案 0 :(得分:1)

我会说依赖注入而不是继承。想想is a关系继承通常意味着什么。例如,类cat可以继承自类mammal。这对于猫is a哺乳动物来说是有道理的。

在你的情况下,这真的没有意义。当您实例化用户类时,可能会在构造函数中传入一个数据库对象。

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对象,而无需多次调用构造函数。