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

你可以用 hack 一些东西debug_backtrace,但这仍然需要你显式地覆盖每个子类中的父函数。

return __FILE__;在每个子类中 定义函数要容易得多。__FILE__将始终替换为找到它的文件名,否则没有办法让它这样做。

于 2010-10-27T16:10:37.867 回答