1

スーパークラスから継承する 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 に違反しているように見えるからです。

4

3 に答える 3

5

まあ、あなたはリフレクションを使うことができます:

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

それが完全なパスを返すのか、ファイル名だけを返すのかはわかりませんが、他に関連するメソッドが表示されないので、試してみてください...

于 2010-10-27T16:16:29.067 に答える
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__;

}
于 2010-10-27T16:10:53.013 に答える
0

で何かをハックすることもできますdebug_backtraceが、それでも各サブクラスで親関数を明示的にオーバーライドする必要があります。

return __FILE__;各サブクラス のように関数を定義する方がはるかに簡単です。__FILE__常にそれが見つかったファイル名に置き換えられます。それ以外の方法はありません。

于 2010-10-27T16:10:37.867 に答える