2011-08-08 25 views
3

我想寫一個方法,我可以在擴展類中使用該文件的完整路徑。然而,當我使用__FILE__我只拿回了被繼承的方法中定義的類路徑下面是一個例子:PHP __FILE__ inheritence

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 

這是預期的行爲嗎?有沒有更好的方法來完成這一點?我在做瘋狂愚蠢的事情嗎?

回答

5

您不能參考__FILE__(用於said reasons),但你可以參考當前對象的類已被中定義的文件:

class foo 
{ 
    public function getFullFile() 
    { 
     $c = new ReflectionClass($this); 
     return $c->getFileName(); 
    } 
} 
+0

與其他方法相比,這是一個更好的解決方案,因爲你可以調用getFullFile( )在父類中以在運行時獲取基文件名。其他解決方案只需要在基類中調用getFullFile()。 – alds

1

我想如果你想$bar->getFullFile()返回bar.php,你必須添加函數bar.php。

public function getFullFile() { 
    return parent::getFullFile(); 
} 
+0

不,我應該能夠調用吧:: getFullFile()沒有什麼特別的,因爲我擴展foo類。另外,bar是一個類,而不是一個方法。 – dmcnelis

+0

意思是使用方法名而不是bar,無論哪種方式,你都必須在bar中定義它如果你想'__FILE__'返回bar.php –

2

__FILE__始終是引用常量的文件。這是爲了調試目的,您可以輕鬆地返回到使用__FILE__的代碼所在的確切文件。當定義駐留在'foo.php'中時,說'bar.php'是無用的。

1

這是預期的行爲__FILE__將始終評估爲解釋器找到它的文件的文件名。同其他魔術常數一樣(__METHOD__,__CLASS__,__LINE__等) 據我所知,做你想做的事情是不可能的。

1

一些代碼說,超過一千字......

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(); 

喬@喬 - 桌面:〜$ PHP a.php只會

/home/joe/B.php 
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); 
}