忘记后期静态绑定,我需要后期静态__FILE__

bob*_*cow 4 php inheritance late-static-binding php-5.3

我正在寻找get_called_class()相当于__FILE__......也许是类似的东西get_included_file()

我有一组类,想知道它们存在于哪个目录中.这样的东西:

<?php

class A {

    protected $baseDir;

    public function __construct() {
        $this->baseDir = dirname(__FILE__);
    }

    public function getBaseDir() {
        return $this->baseDir;
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

在其他一些文件中,在其他一些文件夹中......

<?php

class B extends A {
    // ...
}

class C extends B {
    // ...
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

// Annnd... all three return the same base directory.

?>
Run Code Online (Sandbox Code Playgroud)

现在,我可以做一些贫民窟,比如增加$this->baseDir = dirname(__FILE__)每一个扩展课程,但这似乎有点......贫民窟.毕竟,我们谈论的是PHP 5.3,对吧?这不应该是未来吗?

是否有另一种方法来获取声明类的文件的路径?

Gal*_*len 1

如果您不使用__FILE__单独的变量并将该变量设置__FILE__为每个类中怎么办

class A {

    protected static $baseDir;
    protected $filename = __FILE__; // put this in every file

    public function __construct() {

    }

    public function getBaseDir() {
        return dirname($this->filename) . '<br>'; // use $filename instead of __FILE__
    }   

}

require('bdir/b.php');
require('cdir/c.php');

class B extends A {
    protected $filename = __FILE__; // put this in every file
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();
Run Code Online (Sandbox Code Playgroud)

您仍然需要重新声明每个类中的属性,但不需要重新声明方法