2011-08-01 108 views
0

我嘗試使用下面的PHP類:爲什麼這個php函數調用失敗?

<?php 

class Service { 

    public $code, $description; 

    public static $services = array(
     "A"   =>  "Shipping", 
     "B"  =>  "Manufacturing", 
     "C"   =>  "Legal", 
     "D"   =>  "Accounts Receivable", 
     "E"   =>  "Human Resources", 
     "F"   =>  "Security", 
     "G"   =>  "Executive", 
     "H"   =>  "IT" 
    ); 

    public function _construct($c, $d) { 
     $this->code = $c; 
     $this->description = $d; 
    } 

    public static function getDescription($c){ 
     return $services[$c]; 
    } 

    public static function generateServiceList() { 

     $service_list[] = array(); 

     foreach ($services as $k => $v){ 
      $service_list[] = new Service($k, $v); 
     } 

     return $service_list; 

    } 

} 

?> 

...以下列方式:

<?php 
    $services = Service::generateServiceList(); 
?> 

...但得到以下錯誤:

Warning: Invalid argument supplied for foreach() in /classes/service.php on line 31 

任何想法爲什麼?這是一種訪問問題嗎?謝謝。

回答

5

$services未定義。你的意思是self::$services

+0

不能 - generateServiceList函數和數組都是靜態的。 – rybosome

+0

好的,自我:: $服務 – RiaD

+0

是的,這是做到了。 – rybosome

1

$services變量在函數外聲明。當使用類,你必須使用$this關鍵字一樣,訪問它:

... 
foreach ($this->services as $k => $v){ 
... 

後來編輯:對於靜態變量,使用self::$services代替$this->services

+1

不可以 - generateServiceList函數和數組都是靜態的。 – rybosome

+0

是的。如果某些東西是靜態的,則不會綁定到對象引用。這意味着沒有$ this->服務,而是Service :: $服務數組。正確的答案是RiaD的答案。 – rybosome

+0

好吧,我沒有注意到static關鍵字。 – technology

1
foreach ($services as $k => $v){ 
      $service_list[] = new Service($k, $v); 
     } 

foreach ($this->services as $k => $v){ 
      $service_list[] = new Service($k, $v); 
     } 

要參考$類的服務,而不是函數的局部$服務。

0

我現在無法測試它,但我的直覺是移動$service未被實例化。我傾向於在這種情況下使用init變量的方法。在這種情況下,您可以創建另一種方法,使其生成

$services = array(
     "A"   =>  "Shipping", 
     "B"  =>  "Manufacturing", 
     "C"   =>  "Legal", 
     "D"   =>  "Accounts Receivable", 
     "E"   =>  "Human Resources", 
     "F"   =>  "Security", 
     "G"   =>  "Executive", 
     "H"   =>  "IT" 

實例化。