我需要从其父级确定子类的文件路径。所以这样的代码:
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)毕竟设置反射方法。
4)你可能会建议什么?
我正在获取子类的文件路径,因为我需要包含该类的默认配置文件。配置文件只返回array
,因此我无法使用此处的spl_autoload
功能...
说明实际问题:
| - Abstracts
| | - APlugin.php
| - PluginStart
| | - PluginStart.php
| | - config.php
| - PluginTheme
| | - PluginTheme.php
| | - config.php
来自APlugin.php的 SayHi()
方法应该以某种方式为每个子类找到config.php的路径。
是否可以在不使用Reflection方法的情况下从父级确定子类的路径?
很抱歉,我问了一个已经回答的问题(至少有点问题)!谢谢你的时间。
答案 0 :(得分:1)
最苛刻的实施可能是:
abstract class Parent {
abstract protected function getPathToConfigFile();
...
}
class Child extends Parent {
protected function getPathToConfigFile() {
return __DIR__ . '/config';
}
}
您不应该将此归结为文件系统中的隐式关系,这可能会使系统在以后太不灵活。使所有可以明确显示的内容。