我正在寻找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,对吧?这不应该是未来吗?
是否有其他方法可以获取声明类的文件的路径?
答案 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());