Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写PHP构造函数会执行两次吗?_Php_Mysql_Oop - Fatal编程技术网

重写PHP构造函数会执行两次吗?

重写PHP构造函数会执行两次吗?,php,mysql,oop,Php,Mysql,Oop,我有一个类,它在其_construct()函数中打开数据库连接,并让其他类重写此方法 class db { __construct() { $this->db = new mysqli(); } } 然后 class theme extends db { __construct() { parent::__construct(); $doing_more_stuff; } } 我的问题是,当构造函数已经打开

我有一个类,它在其_construct()函数中打开数据库连接,并让其他类重写此方法

class db {
    __construct() {
        $this->db = new mysqli();
    }
}
然后

class theme extends db {
    __construct() {
        parent::__construct();
        $doing_more_stuff;
    }
}
我的问题是,当构造函数已经打开了一个数据库连接,例如,我让我的主题类重写这个构造函数(仅仅因为我在主题中需要一个自构造函数)时,数据库连接会被打开两次吗

我考虑在我的db类中构建一个控制函数,该函数看起来是否已经存在如下连接:

__construct() {
    if($no_connection) { $open_connection; } else { $use_opened_connection; }
}
那么,这是一个好的做法还是至少可以

谢谢


编辑:对不起,昨天我开始问另一个问题,因为它在缓存中,所以标题被更改。

不,它不会执行两次。在
新主题时
<代码>主题::_构造并且只执行
主题::_构造
,因为它覆盖了
db::_构造
。在该函数中,显式调用
parent::_构造一次,执行
db::_构造一次


通过添加一个
echo
语句来测试这一点很简单…

您可以使用一个静态成员来避免多个连接

大概是这样的:

class db {
    public static $_connection = false;

    public function __construct() {
        if (!self::$_connection) {
            self::$_connection = $this->connect();
        }
        return self::$_connection;
    }
}

我有一个类,它在其_construct()函数中打开数据库连接,并让其他类重写此方法。除了你的问题——虽然有很多答案,但这很好——我总是觉得这个问题很粗略。在实例化该类的第二次,将形成一个数据库连接,直到对象未实例化为止。在小型应用中,这是可以的。在大型应用程序中,这可能是灾难性的,或者会产生意想不到的后果。如果有50个对象,会发生什么?或者甚至5000?这有很多联系…所以只要主题一次只启动一次,可以吗?我也不需要检查它?我忘了:谢谢!但是还有其他类也使用db类,在这种情况下这是不相关的?好的,我将在db上尝试print_r(),谢谢:DOne
new
等于构造函数的一次执行。如果您有几个调用此构造函数的
new
,那么每次都会调用它。