在PHP中获取继承类的路径名

时间:2010-10-27 16:08:56

标签: php pathname

我正在尝试获取从超类继承的PHP类的绝对路径名。看起来应该很简单。我认为下面的代码尽可能简洁地解释了它:

// myapp/classes/foo/bar/AbstractFoo.php
class AbstractFoo {

    public function getAbsolutePathname() {
        // this always returns the pathname of AbstractFoo.php
        return __FILE__;
    }

}


// myapp/classes/Foo.php
class Foo extends AbstractFoo {

    public function test() {
        // this returns the pathname of AbstractFoo.php, when what I
        // want is the pathname of Foo.php - WITHOUT having to override
        // getAbsolutePathname()
        return $this->getAbsolutePathname();
    }

}

我不想覆盖getAbsolutePathname()的原因是会有很多类扩展AbstractFoo,在文件系统的许多不同位置(Foo实际上是一个模块)似乎就像违反DRY一样。

3 个答案:

答案 0 :(得分:5)

好吧,你可以使用reflection

public function getAbsolutePathname() {
    $reflector = new ReflectionObject($this);
    return $reflector->getFilename();
}

我不确定这是否会返回完整路径,或者仅返回文件名,但我没有看到任何其他相关方法,所以试一试......

答案 1 :(得分:1)

据我所知,这方面没有干净的解决方法。神奇常量__FILE____DIR__在解析期间被解释,并且不是动态的。

我倾向于做的是

class AbstractFoo {

    protected $path = null;

    public function getAbsolutePathname() {

        if ($this->path == null) 
              die ("You forgot to define a path in ".get_class($this)); 

        return $this->path;
    }

}


class Foo extends AbstractFoo {

  protected $path = __DIR__;

}

答案 2 :(得分:0)

您可以使用debug_backtrace破解某些内容,但仍需要您显式覆盖每个子类中的父函数。

在每个子类中将函数定义为return __FILE__;要容易得多。 __FILE__将始终替换为找到它的文件名,否则无法执行此操作。