构造函数如何在没有创建对象的情况下调用?为什么构造函数没有以相同的方式再次调用?
问题描述:
我使用PHP 7.1.11构造函数如何在没有创建对象的情况下调用?为什么构造函数没有以相同的方式再次调用?
考虑下面的工作代码和它的输出:
<?php
class butto {
public static $instance;
private function __construct() {
echo 'Contruct of butto class called</br>';
}
public static function get_instance() {
if(!static::$instance instanceof static) {
static::$instance = new static();
}
return static::$instance;
}
public function test() {
echo 'test function called</br>';
}
}
class B extends butto {
public static $instance;
protected function __construct() {
echo 'Construct of Class B called</br>';
}
public static function get_class_name() {
return __CLASS__;
}
}
butto::get_instance()->test();
B::get_instance()->test();
B::get_instance()->test();
/*Output : Contruct of butto class called
test function called
Construct of Class B called
test function called
test function called*/
?>
如果你看一下代码观察,你会知道,无论是类的构造函数即使没有创建任何类的对象也会被调用。
即使我静态访问任何静态方法,构造函数也会被调用。到目前为止,我知道构造函数只能在创建对象时调用,因为构造函数的目的是将初始值设置为对象属性,并在创建对象时立即使用。
那么这怎么可能?以这种方式使用构造函数有什么好处,即访问时不需要创建对象?
考虑下面的代码行:
B::get_instance()->test();
B::get_instance()->test();
我的问题是,为什么B类的构造函数获取调用仅前行?
它应该被再次调用第二行。
为什么它表现得如此怪异?
答
因为您的get_instance()
本身具有这种逻辑。您正在将实例分配给您的静态变量。静态变量在同一类的不同实例之间“共享”。因此,当您第一次调用函数get_instance()
时,您正在创建对象并将其存储在您的静态变量$instance
中。下次当你调用相同的函数时,你的if条件结果是错误的,因此不需要创建一个新的对象/实例。再看看下面的代码:
public static function get_instance() {
if(!static::$instance instanceof static) {
static::$instance = new static();
}
return static::$instance;
}
它不是行为怪异的方式,但它的行为表现为你的代码要求它的行为。
但是你*在静态方法':: get_instance()'中构造对象!那么,你在说什么?!此外,'static :: $ instance'和'new static()',也可以引用'butto'的任何潜在衍生物(与'self :: $ instance'和'new self()'对比),所以解释为什么他们各自的构造函数也被调用,如果从他们自己的上下文中调用。 –
另请参阅https://stackoverflow.com/questions/203336/creating-the-singleton-design-pattern-in-php5的答案。 – localheinz