2016-03-17 75 views
2

在我的代碼中,我有兩個類 - 第一個「Foo」啓動第二個「Bar」...我想要做的是找到使用父函數和變量的一些方法。通過類遞歸進行函數調用?

class Bar { 
    function __construct() { 
     /* 
     * From within this function, how do I access either the returnName() function 
     * OR the $this -> name variable from the class above this? 
     * The result being: 
     */ 
     $this -> name = parent::returnName(); 
     $this -> else = parent -> name; 
    } 
} 

class Foo { 
    function __construct() { 
     $this -> name = 'Fred'; 
     $this -> var = new Bar(); 
    } 

    function returnName() { 
     return $this -> name; 
    } 
} 

$salad = new Foo(); 

我意識到「父」的語法是指一個實現或擴展,但是有可能使用這種方法嗎?

回答

3

您可以在Bar

<?php 
class Bar { 
    function __construct($fooClass) { 
     /* 
     * From within this function, how do I access either the returnName() function 
     * OR the $this -> name variable from the class above this? 
     * The result being: 
     */ 
     $this -> name = $fooClass->returnName(); 
     $this -> else = $fooClass -> name; 
    } 
} 

class Foo { 
    function __construct() { 
     $this -> name = 'Fred'; 
     $this -> var = new Bar($this); 
    } 

    function returnName() { 
     return $this -> name; 
    } 
} 

$salad = new Foo(); 
+0

謝謝,我知道我會做這個 - 雖然我沒有想通過作爲一個論據,除非我絕對必須。 – lsrwLuke

+0

[debug_backtrace()](http://php.net/manual/en/function.debug-backtrace.php)查看我的答案,查看您的課程示例; –

+0

對於Daan,Bar類現在是試圖使用來自Foo的函數,「調用未定義的方法Bar :: returnName()」。解決這個問題? – lsrwLuke

0

處理構造注入$this(Foo類)小心

這不是100%乾淨的解決方案,但會奏效。你的代碼應該很好地記錄下來,以避免將來的混淆。

有一個叫非常酷的功能debug_backtrace()

它爲您提供有關就該好好給這個函數的所有調用,包括文件名,它被稱爲線,被調用的函數,類信息和對象名稱和參數。

這裏是你如何使用它:

class Bar { 
    function __construct() { 

     //get backtrace info 
     $trace = debug_backtrace(); 
     //get the object from the function that called class 
     //and call the returnName() function 
     $this->name = $trace[1]['object']->returnName(); 
     echo $this->name; 

     //want more info about backtrace? use print_r($trace); 
    } 
} 

class Foo { 
    function __construct() { 
     $this -> name = 'Fred'; 
     $this -> var = new Bar(); 
    } 

    function returnName() { 
     return $this -> name; 
    } 
} 

$salad = new Foo(); 

結果:

弗雷德

+0

我的問題的功能部分是目前最重要的答案,雖然這似乎可能是最好的變量 - 我是否認爲這將比調用Bar時使用$ this作爲參數慢? – lsrwLuke

+0

你可以嘗試一個基準測試,但它工作得很快。我在一些應用程序中使用debug_backtrace(),整個頁面加載時間不會超過0.08秒。編輯:也請看看這裏:[PHP的debug_backtrace在生產代碼中獲取有關調用方法的信息?](http://stackoverflow.com/a/347014/3338286) –

+0

謝謝!仍然在考慮讓功能工作,如果需要,我一定會使用它。 – lsrwLuke