忘了晚期静态绑定,我需要晚期静态__file________________________________________________________________

StackOverflow https://stackoverflow.com/questions/2718820

我正在寻找 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;
    }
}

?>

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

<?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.

?>

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

有其他方法可以获取宣布课程的文件的路径吗?

有帮助吗?

解决方案

如果您不使用该怎么办 __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();

您仍然必须重新列入每个类中的属性,而不是方法

其他提示

您是否尝试将其分配为班级的静态成员?

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

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

您可以使用 debug_backtrace(). 。不过,您可能不想。

测试:

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

不起作用。

似乎在加载课程时注册了常数,这不是“迟到”。

不确定以前是可能的,但是今天对我最好的是使用反思:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top