-2

我正在使用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 类的构造函数?

第二行也应该再次调用它。

为什么它的行为如此奇怪?

4

1 回答 1

1

因为你get_instance()自己有这样的逻辑。您正在将实例分配给您的静态变量。静态变量在同一类的不同实例之间“共享”。因此,当您get_instance()第一次调用函数时,您正在创建对象并将其存储在静态变量$instance中。下次当您调用相同的函数时,您的 if 条件结果为假,因此不需要创建新的对象/实例。再看下面的代码:

public static function get_instance() {
  if(!static::$instance instanceof static) {
    static::$instance = new static();
  }
  return static::$instance;
}

它并没有以奇怪的方式表现,而是按照您的代码要求它表现的方式表现。

于 2017-12-03T04:47:37.083 回答