2011-08-18 84 views
2

可能重複:
Call function of class ONE from class TWO without extend?訪問功能使用類對象的

爲什麼不起作用?

class A { 
     function one() { 
      echo "Class A"; 
     } 
    } 

    class B { 
     function two() { 
      echo "Class B"; 
      $a->one(); 
     } 
    } 


    $a = new A; 
    $b = new B; 

    $b->two(); 
+0

標題應該是:「它爲什麼要工作?」 - 也許錯誤報告有幫助,你應該得到一個致命的錯誤。 – hakre

+1

查找[變量範圍](http://php.net/manual/en/language.variables.scope.php) – Phil

回答

0

$a在您的示例中無法訪問Class B。請閱讀Variable Scope

嘗試:

class A { 
    public function one() { 
     echo "Class A"; 
    } 
} 

class B { 
    public function two() { 
     echo "Class B"; 
     $a = new A; 
     $a->one(); 
    } 
} 

$b = new B; 
$b->two(); 
0

這不起作用,因爲$a不是一個全局變量。 如果您事先聲明$a爲全球B類,它應該可以工作。

class B { 
     function two() { 
      global $a; 
      echo "Class B"; 
      $a->one(); 
     } 
    } 
+2

雖然這在技術上可行,但這是一件可怕的事情。最好將'$ a'作爲依賴關係傳遞給'B' – Phil

+0

我剛剛回答了這個問題。但是你是對的,如果可能的話應該避免這樣的事情。 – Karsten

0

如上所述,這是一個可變範圍問題。 B::two()的範圍不包括已在全局名稱空間中聲明的變量$a

要做的最好的事情是將$a改爲B作爲依賴項。將會有幾種方法可以做到這一點...

一次性使用的B::two()

public function two(A $a) 
{ 
    echo 'Class B'; 
    $a->one(); 
} 

然後

$b->two($a); 

由於B

class B 
{ 
    private $a; 

    public function __construct(A $a) 
    { 
     $this->a = $a; 
    } 

    public function two() 
    { 
     echo 'Class B'; 
     $this->a->one(); 
    } 
} 

屬性然後

$b = new B($a); 
$b->two();