从父类确定子类的路径



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

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';
    }
}

您不应该把这个问题留给文件系统中的隐式关系,它可能会使系统在以后变得过于不灵活。

相关内容

  • 没有找到相关文章

最新更新