2015-11-25 44 views
0

看到這個,我有一個類使用另一個類的對象數組。如果我創建類的函數內部它的工作原理,如果我之外創建它,使用它像全球它不工作的數組...爲什麼全局數組無法識別,本地是? php

這一個工程:

//$titles = Title::all_by_id(1); 
class Book { 
    public function represent() { 
     $titles = Title::all_by_id(1); 
     //global $titles; 
     $title = $titles[$this->title_id]; 
     return $title->represent().'_'.$this->id; 
    } 
} 

這一個不:

$titles = Title::all_by_id(1); 
    class Book { 

     public function represent(){ 
      //$titles = Title::all_by_id(1); 
      global $titles; 
      $title = $titles[$this->title_id]; 
      return $title->represent().'_'.$this->id; 
     } 
    } 

它發出了一個錯誤:

PHP Fatal error: Call to a member function represent() on a non-object in

+0

你爲什麼要使用靜態函數? – goupil

+0

當你在類的外面說'$ titles'時,它是一個'Variable'。當你在類裏面說'$ titles'時,它的'Property'。類有一個範圍,範圍內的任何東西都可以被類使用。 –

+0

@Christian靜態函數有什麼問題?它從數據庫加載所有標題並將它們放入關聯數組id =>對象中,我更願意使用第二種方式,使用全局方式來避免多個數據庫查詢 –

回答

0

好吧,我解決它

包含Book類的文件在主流程中由函數包含,而不是直接包含在主流程中。所以我定義$ titles變量的上下文是該函數的上下文,並且調用book-> represent()不是同一個上下文的一部分,所以它不能識別$ titles ...解決方案是定義$ titles = Title: :all_by_id(1);在一些較大的背景下

對不起,困擾,關於上下文和全局問題