я использую 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;
}
Он не ведет себя странным образом, но ведет себя так, как ваш код попросил его вести себя.
Других решений пока нет …