2011-07-08 125 views
1

我想在Class_A的函數之一中使用Class_B函數。但是很多Class_B的功能包括導致問題的$this。這些都是類(每個類當然是在它自己的文件):實例化類和訪問不同類的方法

class Class_A 
{ 
    function hello() 
    { 
     require('class_b.php'); 
     echo 'Hello ' . Class_B::person(); 
    } 

    function bye() 
    { 
     require('class_b.php'); 
     echo 'Bye ' . Class_B::person(); 
    } 
} 

class Class_B 
{ 
    function person() 
    { 
     // various operations and variables 
     echo $this->get_user($id); 
    } 
} 

當我運行Class_A文件我得到Call to undefined method Class_A::person() in (...)因爲我覺得當我實例化Class_A類$這個值被改變。它否決了Class_B的值。我怎樣才能阻止呢?

另外,還有一個問題:如何從Class_A中的每個函數訪問Class_B?我不想重新宣佈這個班。我是否需要這樣做:

class Class_A 
{ 
    function function1() 
    { 
     require('class_b.php'); 
     $class_b = new Class_B(); 
     // code 
    } 

    function function2() 
    { 
     require('class_b.php'); 
     $class_b = new Class_B(); 
     // code 
    } 
} 

或者我需要使用構造函數還是其他?

回答

2

通過Class_B::person()您正在靜態調用該方法。所以你應該聲明person()方法是靜態的,並且不能使用$this,因爲你沒有Class_B的實例。

如果您需要Class_B的實例,只需創建它並將其存儲在class_B的構造中。

class Class_A { 
    private $b; 
    function __construct() 
    { 
    $this->b = new Class_B(); 
    }  
    function stuff() 
    { 
    $this->b->person(); 
    } 
+0

這很好。我試圖編輯你的帖子來添加最後的'}',但它不讓我! – hohner

1

請勿將require放入方法中。 include d文件中的代碼繼承了包含它的地方的範圍,並且在您的示例中發生了不好的事情。另外,對於類定義腳本,請考慮require_once而不是require,以避免多個定義。根據經驗,將所有include s和require s放在腳本的頂部。更好的是,建立一個類自動加載器,並將其註冊到auto_prepend腳本中。這樣,你就不必手動包含任何東西(至少不用於類定義)。

+0

[這裏](http://www.php.net/manual/en/language.oop5.autoload.php)是自動加載類的文檔。 –

0

您可能需要的是依賴注入,即將Class_B的對象傳遞給Class_A的構造函數,並將其作爲Class_A中的屬性。然後它可以在Class_A中作爲$this->classB或類似的。

// Include Class_B code outside the class. 
require_once('class_b.php'); 
class Class_A { 
    // Property to hold Class_B 
    public $b; 

    // Constructor 
    public function __construct($b) { 
    $this->b = $b; 
    } 

    public function function1(){ 
    // code 
    $this->b; 
    } 
    public function function2(){ 
    // code 
    $this->b; 
    } 
} 

// Now call your objects: 
// The Class_B which will be injected into A 
$b = new Class_B(); 
// Your Class_A, which holds an instance of Class_B as a property 
$a = new A($b);