我正在尝试获取从超类继承的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一样。
答案 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__
将始终替换为找到它的文件名,否则无法执行此操作。