我正在使用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 类的构造函数?
第二行也应该再次调用它。
为什么它的行为如此奇怪?