質問
私は、スーパークラスから継承することを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()
を上書きしたくない理由は、(fooはモジュール実際にある)ファイルシステム上の潜在的に多くの異なる場所で、AbstractFooを拡張するクラスの多くがあるように起こっていることであり、それは、違反のように思えますDRYます。
解決
さて、あなたは反射を使用することができます:
をpublic function getAbsolutePathname() {
$reflector = new ReflectionObject($this);
return $reflector->getFilename();
}
私はよく分からないことはので、それを試してみて、完全なパスを返す、またはファイル名だけが、私は、他の関連するメソッドが表示されていないかどう...
他のヒント
私の知る限りでは、このためのクリーンな回避策はありません。魔法の定数__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__;
}
あなたはdebug_backtrace
で何かをハック可能性があり、それはまだ明示的に各サブクラスの親関数をオーバーライドする必要があります。
これは、各サブクラスでreturn __FILE__;
としての機能を定義するためにはるかに簡単です。 __FILE__
はいつもそれがそうでなければ行うようにする方法はありません、それが発見されているファイル名に置き換えられます。
所属していません StackOverflow