質問

私は、スーパークラスから継承することを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__はいつもそれがそうでなければ行うようにする方法はありません、それが発見されているファイル名に置き換えられます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top