我需要从它的父类确定子类的文件路径。所以像这样的代码:
abstract class Parent {
/**
* @injected $this->__construct()
*/
protected $child_name = null;
public function sayHi() {
$path = ???;
echo 'I am saying hi from file '.$path.'!';
}
}
class ChildA extends Parent {}
class ChildB extends Parent {}
$a = new ChildA;
$b = new ChildB;
$a->sayHi();
$b->sayHi();
…输出如下:
I am saying hi from file lib/childA/plugin.php!
I am saying hi from file lib/childB/plugin.php!
对于这个特殊的问题有很多答案,但是每个反射方法都像这样:
- 如何从继承方法获得派生类的路径?
有人告诉我,永远不要在生产代码中使用反射类。所以现在,我正试图找出该走哪条路:
1)约定优于配置:硬编码函数的期望子路径。
public function sayHi() {
$path = 'lib/'.$this->child_name.'/plugin.php';
}
2)在每个子类中都有一个属性,它将使用一个魔法常数。这似乎有点枯燥,然而,因为我将有很多子类。
class ChildA extends Parent {
protected $path = __FILE__;
}
3)反射方法的设置。
你有什么建议吗?
更新我正在获得子类的文件路径,因为这样,我需要包含类的默认配置的文件。配置文件只返回array
,所以我不能在这里使用spl_autoload
功能…
更新2
为了说明实际问题:
| - Abstracts
| | - APlugin.php
| - PluginStart
| | - PluginStart.php
| | - config.php
| - PluginTheme
| | - PluginTheme.php
| | - config.php
SayHi()
方法从APlugin.php应该以某种方式找到路径config.php的每个子类。
TL;博士
是否有可能在不使用反射方法的情况下从父类确定子类的路径?
对不起,我问了一个已经回答过的问题(至少在某种程度上)!谢谢你的宝贵时间。
最合理的实现可能是:
abstract class Parent {
abstract protected function getPathToConfigFile();
...
}
class Child extends Parent {
protected function getPathToConfigFile() {
return __DIR__ . '/config';
}
}
您不应该把这个问题留给文件系统中的隐式关系,它可能会使系统在以后变得过于不灵活。