PHP __FILE__继承

时间:2011-08-08 17:06:34

标签: php inheritance

我正在尝试编写一个方法,我可以在使用该文件的完整路径的扩展类中使用。但是,当我使用__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

这是预期的行为吗?有没有更好的方法来实现这一目标?我做了一件非常愚蠢的事吗?

7 个答案:

答案 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);
}