我正在尝试编写一个方法,我可以在使用该文件的完整路径的扩展类中使用。但是,当我使用__FILE__
时,我只返回定义继承方法的类的路径。这是一个例子:
foo.php
class foo
{
public function getFullFile()
{
return __FILE__;
}
}
bar.php
class bar extends foo
{
public function getFile()
{
return __FILE__;
}
}
使用example.php
$foo = new foo();
echo $foo->getFullFile() . PHP_EOL;
$bar = new bar();
echo $bar->getFullFile() . PHP_EOL;
echo $bar->getFile() . PHP_EOL;
运行example.php的输出:
/my/full/path/foo.php
/my/full/path/foo.php
/my/full/path/bar.php
这是预期的行为吗?有没有更好的方法来实现这一目标?我做了一件非常愚蠢的事吗?
答案 0 :(得分:6)
您不能引用__FILE__
(对于said reasons),但您可以参考文件中已定义当前对象的类:
class foo
{
public function getFullFile()
{
$c = new ReflectionClass($this);
return $c->getFileName();
}
}
答案 1 :(得分:2)
__FILE__
始终是引用常量的文件。这是出于调试目的,您可以轻松地返回到使用__FILE__
的代码所在的确切文件。当定义位于'foo.php'时,将它放在'bar.php'中是没用的。
答案 2 :(得分:2)
有些代码说的超过千言万语......
B.php
<?
class B {
public function bar() {
return __FILE__;
}
}
a.php只会
<?
require "B.php";
class A extends B {
public function foo() {
echo parent::bar();
}
}
$a = new A();
$a->foo();
joe @ joe-desktop:〜$ php A.php
/home/joe/B.php
答案 3 :(得分:1)
我想如果你想让$bar->getFullFile()
返回bar.php,你必须将该函数添加到bar.php。
public function getFullFile() {
return parent::getFullFile();
}
答案 4 :(得分:1)
有关这些“神奇常数”的更多信息,请参阅http://php.net/manual/en/language.constants.predefined.php。如果我没有弄错,这些神奇的常量是一种宏,并在编译时确定,而不是运行时。
答案 5 :(得分:1)
这是预期的行为__FILE__
将始终评估为解释程序找到它的文件的文件名。与其他魔术常量相同(__METHOD__
,__CLASS__
,__LINE__
等)
据我所知,你不可能做到这一点。
答案 6 :(得分:0)
只需使用debug_backtrace()
PHP函数。使用示例(我的库函数my_die放在一些包含的php文件中,但报告了调用者的位置!):
function my_die($msg)
{
$bt = debug_backtrace();
$file = $bt[0]["file"];
$line = $bt[0]["line"];
$func = $bt[1]["function"];
# session info also!!!
$user = $_SESSION['user'];
error_log('Died in ' . $file . ': ' . $line . ': function ' . $func .
"(): user='{$user}': ip='{$_SERVER['REMOTE_ADDR']}': " . $msg .
" (browser: '{$_SERVER['HTTP_USER_AGENT']})'");
die($msg);
}