Php 从父类确定子类的路径而不进行反射-可能吗?

Php 从父类确定子类的路径而不进行反射-可能吗?,php,reflection,subclass,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.'!';

我需要从父类确定子类的文件路径。所以代码如下:

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!
对于这个特殊问题有很多答案,但是每一个反射方法都是这样的:

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();
有人告诉我,您永远不应该在生产代码中使用反射类。因此,现在,我正试图找出该走哪条路:

1) 约定优先于配置:硬编码预期的函数子路径

public function sayHi() {

    $path = 'lib/'.$this->child_name.'/plugin.php';

}
2) 在每个子类中都有一个属性,它将使用一个神奇常量。不过,这似乎有点乏味,因为我将有很多儿童课程

class ChildA extends Parent {

    protected $path = __FILE__;

}
3) 反射方法的设置

4) 你有什么建议吗

更新 我正在获取子类的文件路径,因为这样,我需要将该文件包含在类的默认配置中。带有配置的文件只返回一个
数组
,因此我不能在这里使用
spl\u autoload
功能

更新2 为了说明实际问题:

| - Abstracts
|   | - APlugin.php
| - PluginStart
|   | - PluginStart.php
|   | - config.php
| - PluginTheme
|   | - PluginTheme.php
|   | - config.php
APlugin.php中的
SayHi()
方法应该为每个子类找到config.php的路径

TL;博士 是否可以在不使用反射方法的情况下从父类确定子类的路径


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

最明智的实施可能是:

abstract class Parent {

    abstract protected function getPathToConfigFile();

    ...

}

class Child extends Parent {

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

}

您不必将此问题留给文件系统中的隐式关系来解决,这可能会使系统在以后变得过于死板。将所有可以显式显示的内容都显式化。

所以听起来像是在使用自动加载并想要获取文件路径?或者您只是想获取类名/名称空间吗?通过子类的文件路径,我需要使用子类的默认配置确定不同文件的位置,该子类只返回一个数组。这就是为什么我不能在这种情况下使用自动加载器…好吧,那么所有这些类是生活在一个巨大的文件中还是每个类都有一个文件?@Machavity:请参阅更新!是的,这绝对是一条路,尽管我希望避免在所有子类中指定函数(因为会有很多子类)。我会把这个问题留待一段时间,如果有什么更干燥的方法来解决这个问题,如果没有,我会走这条路。谢谢我不知道有什么方法可以不经过思考就去做,这似乎是下一个最明智的选择。如果您需要干燥此文件,我建议实现
getPathToConfigFile
以使用
ReflectionClass
获取路径,并使方法保持可重载状态以获得最大的灵活性。因此,在生产代码中使用反射方法“可以”吗?这超出了这个问题的范围,但我也找不到一个具体的答案(除了“大肥肉”不)。如果使用适度,我认为它是可以的。反射基本上是一种进行元编程的工具,其中代码可以对代码进行推理。您不应该对此发疯,尤其是在PHP中,它不太适合元编程。但是,在我看来,干掉一些重复性太高的代码没问题。我偶尔会用它来进行健全性检查,比如检查值是否是类中定义的常量之一等等。感谢您与我一起讨论所有可能的解决方案!我想我会接受一些代码重复,并在最后选择选项1——正如您所指出的,当配置文件位于其他位置时,可能总是会出现这种情况。祝您有个美好的一天!