假设我们有以下类(简化):
class SuperConfig {
public $mainDir;
public function setDir() {
$this->mainDir = "path/to/dir";
}
}
该类应该在项目中的其他每个类中进行扩展,并且我确实需要执行父项的setDir()
函数。显然,我可以这样做:
class A extends SuperConfig() {
public function __construct() {
parent::setDir();
}
// ... other stuff is about to be done ...
}
我可以像这样访问子类中的属性:
class A extends SuperConfig {
public function doSomething() {
SuperConfig::mainDir;
}
}
这是一个可行的解决方案,但我得到了数百个课程,并且每个课程都这样做似乎很乏味。那么,有没有办法做这样的事情:
class SuperConfig {
public $mainDir;
public function __extend() {
$this->setDir();
}
public function setDir() {
$this->mainDir = "path/to/dir";
}
}
__extend()
显然不会那样工作,但我想知道我是如何做到这一点的。
答案 0 :(得分:2)
class SuperConfig {
public $mainDir;
public function __construct() {
$this->setDir(); // consider moving setDir's code here as well,
// unless you have a good reason for it to be a method
}
public function setDir() {
$this->mainDir = "path/to/dir";
}
}
您只需执行此操作,然后您希望所有子类调用父构造函数,如果它们将覆盖构造函数:
public function __construct() {
parent::__construct();
// more code
}
期望孩子们调用他们的父构造函数是完全合理的,除非他们故意将实例留在未知且可能处于破坏状态。
答案 1 :(得分:1)
将构造函数放在正在扩展的类中。
class SuperConfig {
public $mainDir;
public function __construct() {
$this->setDir();
}
public function setDir() {
$this->mainDir = "path/to/dir";
}
}
在任何扩展SuperConfig
的类中,如果他们也有构造函数,请确保包含parent::__construct();
以便调用setDir
。
答案 2 :(得分:1)
阅读deceze的答案,找出问题的实际解决方案。
我想指出,您不应该从Config类扩展项目中的每个类。有几种方法可以改善它。
1。)创建一个静态配置类,您可以在任何地方调用它而无需创建
class SuperConfig {
protected static $mainDir = null;
public static function setMainDir($dir) {
self::$mainDir = $dir;
}
}
2。)创建一个特质而不是一个育儿类。
trait SuperConfig {
protected $mainDir = null;
public function setMainDir($dir) {
$this->mainDir = $dir;
}
}
然后您可以在课程中使用
class XYZ {
use SuperConfig;
public function doSomething() {
$this->setMainDir('path/to/your/dir/');
}
}
请注意,您也可以在构造函数中执行此操作(这是您想要的)。
我不是说这两个解决方案是最好的,但我不喜欢从配置类扩展所有类的想法。只是没有多大意义。想象一下,每次只能从一个类扩展,而你可以根据需要使用尽可能多的特性(并且还可以根据需要使用多个静态类)。
答案 3 :(得分:0)
嗯,在这种特殊情况下你只需要:
class SuperConfig {
public $mainDir = "path/to/dir";
}