一旦创建了扩展的对象,就调用类方法

时间:2017-11-14 11:03:20

标签: php

假设我们有以下类(简化):

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()显然不会那样工作,但我想知道我是如何做到这一点的。

4 个答案:

答案 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";
}