从扩展构造中获取子类信息

时间:2011-01-18 20:24:28

标签: php oop

我不太确定如何制定我的问题,所以提前抱歉这个无信息的标题 所以这就是问题所在。我在同一目录中有几个文件,每个文件都是一个类持有者。当我继承我需要知道的哪个类在哪个文件(或更像文件夹)时,我会这样做 我真的不喜欢我遇到的解决方案,但仍然要证明我的意思。

foo.php

class Foo {
}

bar.php

include_once 'bootstrap.php' ;

class Bar extends Foo {
}

$bar = new Bar() ;

bootstrap.php中

function __autoload( $class ) {
    $trace = debug_backtrace() ;
    // Here i've got the directory i need:
    $folder = dirname( $trace[ 0 ][ 'file' ] ) ; 
}

是否有其他(正确的)获取文件夹名称的方法,因为它实际上并不适用于此类操作。从性能的角度来看也不好。

限制:应该适用于php 5.2.12

2 个答案:

答案 0 :(得分:0)

$folder = dirname(__FILE__)不能胜任这项工作?

答案 1 :(得分:0)

魔术常量__FILE__报告调用它的文件的文件名(带路径)(参见PHP docs):

  

__FILE__:文件的完整路径和文件名。如果在include中使用,则返回包含文件的名称。从PHP 4.0.2开始,__FILE__总是包含已解析符号链接的绝对路径,而在旧版本中,它在某些情况下包含相对路径。

这意味着您可以创建一个返回类文件名的方法。

例如,在'test-folder / Foo.php'中:

class Foo {

   function getFile() {
      return __FILE__;
   }

}

在'Bar.php`中:

include 'test-folder/Foo.php';

class Bar extends Foo {

   function getParentFile() {
      return parent::getFile();
   }

}

$bar = new Bar();

echo dirname($bar ->getParentFile());
// result: C:\wamp\www\test-folder

编辑:好的,所以如果你想在创建之前找出父类的位置,这应该有效(使用Reflection):

$reflectedBar = new ReflectionClass('Bar');
$reflectedBarParent = $reflectedBar->getParentClass();
$filename = $reflectedBarParent->getFileName();