2013-12-16 199 views
2

在PHP中,可以識別包含該對象的變量的名稱?例如:PHP是否可以識別包含該對象的變量的名稱?

class Foo { 

    public function IdentifyContainer() { 
     //PHP to identify variable containing Foo. 
    } 

} 

$bar = new Foo(); 
echo $bar->IdentifyContainer(); // This should echo "bar"; 

我不知道,如果可以做到這一點或沒有,但如果它可以,因爲我有被稱爲在單一頁面加載同一個類的4個實例,我」這將真正幫助我試圖找出他們全部。

編輯

我應該提到原來這純粹是爲了調試。 debug_backtrace爲我工作。感謝大家誰建議它:)。

+2

是甚至邏輯鑑於你可以有多個引用指向相同objec T' – Bathsheba

+0

@bath:像'$ enemy1 = new BadGuy(); $ enemy2 = new BadGuy(); ......在某種情況下,在一場比賽中可能是有道理的,但我想不出任何 - 週一上午霧對於生產力總是很好。 –

+0

在這種情況下應該是什麼結果? '$ container-> getObject() - > getContainer()' –

回答

3

不,沒有任何理智的方式。沒有任何理由這樣做。不,即使你認爲你有一個很好的理由,你也不會。由於完全有可能一次將對象分配給多個變量,因此對象(或任何其他值)與分配給它的變量之間不存在內在聯繫。變量不是「容器」,變量是算法中的一個佔位符,可讓您引用更改(可變)值。

+0

沒有很好的理由?試圖找出這被稱爲4次的地方呢?如果我用4個不同的變量創建一個類,我有4個不同的實例。我正在努力減少這個數字。 – Styphon

+1

@Styphon:用於調試?試試這個:['debug_print_backtrace'](http://www.php.net/manual/en/function.debug-print-backtrace.php) –

+0

需要知道一個對象實例化了多少次? – MarcoS

2

有沒有簡單的方法來做到這一點。

但理論上可行(這並不意味着,你應該這樣做..)。您可以使用debug_backtrace來獲取調用堆棧以獲取調用腳本的文件和行號。有了這些信息,你可以打開php文件(fopen等)來獲取行內容和正則表達式,你可以得到var的名字,調用你的方法。

坡口的概念:

function getCallingVarName() { 
    $trace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2); 
    array_shift($trace); 
    $call = $trace[0]; 
    $file = $call['file']; 
    $fnc = $call['function']; 
    $lines = file($file); 
    $line = $lines[$call['line'] - 1]; 
    if (preg_match('~\$([^-]+)->' . $fnc . '\(~', $line, $m)) { 
     return $m[1]; 
    } 
} 

因此,有可能 - 但有些理由不這樣做:

  • 這是慢!
  • 這是不安全的(有人可以把多個語句在同一行的PHP文件)

某些原因你shoul'd做到這一點在所有:

$a = new A(); 
$b = $a; 

讓你有多個瓦爾,指向相同的參考,但你想要你的代碼表現不同,如果你打電話$a->test()$b->test() - 聲音非常非常容易出錯。

相關問題