2011-04-30 106 views
5

例如,我有這樣的代碼:爲什麼函數在PHP類數組項不起作用

<?php 
$A = array(
    'echoSmth' => function(){ 
     echo 'Smth'; 
    } 
); 

$A['echoSmth'](); // 'Smth' 
?> 

它工作正常! 但是如果$ A不只是一個變量,而是一個類的方法 - 比這不起作用:

<?php 

class AA { 

    public $A = array(
     'echoSmth' => function(){ // Parse Error here! 
      echo 'Smth'; 
     } 
    ); 

} 

// Fixed call: 
$t = new AA(); 
$t->A['echoSmth'](); 
// no matter what call, because error occurs early - in describing of class 

?> 

爲什麼它不工作? 它顯示: Parse error: syntax error, unexpected T_FUNCTION

P.S.對不起,我用我稱呼該方法的方式犯了一些錯誤,我很着急。但不管我怎麼打電話。錯誤ocurrs,即使我只是聲明類,而不致電

+2

嘗試T- $>一[ 'echoSmth']();沒有美元符號 – usoban 2011-04-30 15:04:46

+3

@usoban:a大寫。 – 2011-04-30 15:09:23

+0

@marcel對,我在看最後一行,其中a是小寫。我的壞:) – usoban 2011-04-30 15:11:59

回答

3

據我所知,在定義一個類成員時你不能有動態的東西,但是你可以像下面那樣動態地設置它。所以基本上,你不能這樣做,因爲你不能這樣做:public $A = functionname();

此外,你的呼叫簽名是不正確的,我已經在我的例子中修復它。

<?php 
class AA { 
    public $A = array(); 

    public function __construct() { 
     $a = function() { 
      echo 'Smth'; 
     }; 
     $this->A['echoSmth'] = $a; 
    } 
} 

$t = new AA(); 
$t->A['echoSmth'](); 

或者,也可以內__construct()限定整個陣列,包含方法(因此基本上移動您的代碼)。

2

我得到了這個工作。不知道爲什麼不允許直接聲明。

class AA { 
    var $A; 
    public function __construct() { 
     $this->A = array(
      'echoSmth' => function(){ 
       echo 'Smth'; 
      } 
     ); 
    } 
} 

$t = new AA(); 
$t->A['echoSmth'](); 

編輯:我也看到和糾正$t->$a第一,但我需要移動的聲明,以及使其工作。

+2

他有一個錯誤,他使用$ t - > $ a而不是$ t-> a。你的代碼是正確的,OP沒有。這裏沒有php問題,只是在訪問成員時出現一個簡單的錯誤。 – 2011-04-30 15:07:35

+1

@Michael錯誤,在定義$ A的值時定義閉包存在解析錯誤(但是,那是一個錯誤)。 – 2011-04-30 15:08:23

+0

這也是真的rudi,我撇開了課堂,並假設他確實沒有解析錯誤 - 顯然,你不能相信任何人這些天,謝謝指出:) – 2011-04-30 15:10:14

1

好,它還挺工作...

<?php 

    class Bleh 
    { 

     public $f = array(); 

     public function register($name , $func) 
     { 

      $this->f[ $name ] = $func; 

     } 

    } 


    $foo = new Bleh; 
    $foo->register('bar' , function(){ echo 'foobar'; }); 

    $foo->f['bar'](); 

?> 
相關問題