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

时间:2010-04-27 04:53:00

标签: php inheritance php-5.3 late-static-binding

我正在寻找get_called_class()的{​​{1}}等价物......可能类似于__FILE__

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

get_included_file()

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

<?php

class A {

    protected $baseDir;

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

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

?>

现在,我可以做一些贫民窟,比如将<?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. ?> 添加到每个扩展类中,但这似乎有点......贫民窟。毕竟,我们谈论的是PHP 5.3,对吧?这不应该是未来吗?

是否有其他方法可以获取声明类的文件的路径?

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

您是否尝试将其指定为类的静态成员?

<?php
class Blah extends A {
    protected static $filename = __FILE__;
}

(未经测试,静态加上类继承变得非常有趣......)

答案 2 :(得分: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();

你仍然需要重新声明每个类中的属性,而不是方法

答案 3 :(得分:0)

您可以使用debug_backtrace()。但是你可能不想这样做。

答案 4 :(得分:0)

测试:

    protected static $filename = __FILE__; 
    static::$filename 

不起作用。

看起来这个常量是在加载类时注册的,而不是“迟到”。

以前不确定是否可能,但今天最适合我的是使用反射:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());