2011-08-01 54 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" 

实例化。