忘了晚期静态绑定,我需要晚期静态__file________________________________________________________________
-
01-10-2019 - |
题
我正在寻找 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());
不隶属于 StackOverflow