例如,在Yii2框架中,yii\filters\AccessControl
该类init()
从其父类重写一个函数yii\base\Object
.这个Object类又有一个像这样的构造方法:
Class Object implements Configurable { public function __construct($config = []) { if (!empty($config)) { Yii::configure($this, $config); } $this->init(); // calls the method defined below } } // and the definition of this init function ... public function init() { }
现在没有明显的使用编写这样一个空函数,除非你想用它来初始化他/她将来可能需要的一些属性.
但是那个__construct()
方法的用法完全一样!我需要了解这种init()
方法是如何有用的.
原因很简单:他们期待你扩展课程
所以你会做这样的事情
class Bob extends Object { public function init() { $this->setup_something(); } }
因此Bob
扩展Object
方法Bob
就是被调用的方法.如果您不需要初始化某些内容,则跳过定义,基类将调用空方法.
这使您不必做一些可能更混乱的事情:覆盖构造函数
class Bob extends Object { public function __construct($config = []) { $this->setup_something(); } }
现在,这很混乱,因为有很多人会错过一些关键的东西(我故意省略了这个例子):不会调用父构造函数(你可以通过拥有它来实现parent::__construct($config)
).因此,通过单独设置,init()
您可以完全避免混乱.有一个明确的方法来进行自己的设置.