从父级确定子类的路径没有反射 - 是否可能?

时间:2014-07-28 14:37:07

标签: php reflection subclass

我需要从其父级确定子类的文件路径。所以这样的代码:

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功能...

更新2

说明实际问题:

| - Abstracts
|   | - APlugin.php
| - PluginStart
|   | - PluginStart.php
|   | - config.php
| - PluginTheme
|   | - PluginTheme.php
|   | - config.php
来自APlugin.php的

SayHi()方法应该以某种方式为每个子类找到config.php的路径。

TL; DR

是否可以在不使用Reflection方法的情况下从父级确定子类的路径?

很抱歉,我问了一个已经回答的问题(至少有点问题)!谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

最苛刻的实施可能是:

abstract class Parent {

    abstract protected function getPathToConfigFile();

    ...

}

class Child extends Parent {

    protected function getPathToConfigFile() {
        return __DIR__ . '/config';
    }

}

您不应该将此归结为文件系统中的隐式关系,这可能会使系统在以后太不灵活。使所有可以明确显示的内容。