2012-02-08 38 views
1

我想在類中爲PHP中的數組分配匿名函數,但是我一直在語法錯誤上磕磕絆絆。是否可以在類範圍中定義一個匿名函數?

class Stuff { 
    private $_preference_defaults = array(
    'cookie' => true, 
    'session' => true, 
    'database' => true, 
    'filter' => function($input) { return true; }, 
    'sanitizer' => function($input) { return $input; }, 
); 
}; 

會拋出unexpected T_FUNCTION語法錯誤,並不要緊陣列是否是靜態的。我絕望了,並試圖做它的「舊」的方式:

class Stuff { 
    private $_preference_defaults = array(
    'cookie' => true, 
    'session' => true, 
    'database' => true, 
    'filter' => create_function('$input', 'return true;'), 
    'sanitizer' => create_function('$input', 'return $input;'), 
); 
}; 

而這導致了unexpected '(', expecting ')'語法錯誤。但是,如果我定義的時間提前的功能,它確實工作:

class Stuff { 
    function _preference_default_filter($input) { 
    return true; 
    } 
    function _preference_default_sanitizer($input) { 
    return true; 
    } 
    private $_preference_defaults = array(
    'cookie' => true, 
    'session' => true, 
    'database' => true, 
    'filter' => _preference_default_filter, 
    'sanitizer' => _preference_default_sanitizer, 
); 
}; 

然後我可以調用類方法中的那些功能:

function do_stuff($foo) { 
    return $this->{$this->_preference_defaults['filter']}($foo); 
} 

這不僅是在我的腦海裏,它帶有糟糕的風格,我可以想象這種欺騙會在未來引起頭痛。

  1. 我是否無法在類(靜態)範圍創建匿名函數? (我想也許是因爲在這種情況下無法創建一個有效的Closure對象?)
  2. 是否還有更多... PHP ...意味着同一目的?也就是說,是否有一種「更好」的方式將簡單的默認回調分配給類範圍中的數組值?我提供的最後一部分工作確實完成了工作,但我更希望有一個解決方案,不會讓我向驗光師詢問更強大的處方。

回答

1

我無法在類(靜態)作用域創建一個匿名函數嗎? (我想也許是因爲一個有效的封閉對象不能在這種背景下產生的呢?)

是的,因爲類屬性的初始值應在解析步是已知的,而函數調用和匿名函數需要運行時

也看到這裏獲取更多詳細信息:https://stackoverflow.com/a/9029556/251311

並不能得到你的第二個問題:-S

+0

有道理;謝謝! – 2012-02-08 13:10:59

1

這確實是行不通的。在這期間,可以說,申報階段你通常不會做很多奇特的事情。

但是..因爲你的屬性只是私有的,而不是靜態的..只需在構造函數中聲明所有內容。問題解決了!

這句法:

'sanitizer' => _preference_default_sanitizer, 

實在是太差了。隨着E_NOTICE你都會覺得它覆羽_preference_default_sanitizer爲一個字符串第一,這就是爲什麼可能工作。

+0

現貨 - 但@zerkms擊敗你。不管怎麼說,還是要謝謝你! – 2012-02-08 13:11:16

0

只需將方法名稱設置爲字符串即可。

class Stuff { 
    private $_preference_defaults = array(
    'cookie' => true, 
    'session' => true, 
    'database' => true, 
    'filter' => '_preference_default_filter', 
    'sanitizer' => '_preference_default_sanitizer', 
); 

    function _preference_default_filter($input) { 
    return true; 
    } 

    function _preference_default_sanitizer($input) { 
    return true; 
    } 
}; 

然後調用由:

function do_stuff($foo) { 
    return $this->{$this->_preference_defaults['filter']}($foo); 
} 

或者

function do_stuff($foo) { 
    return call_user_func(array($this, $this->_preference_defaults['filter']), $foo); 
} 
+0

這只是一個扔石頭從我已經 - 這似乎有點脆? – 2012-02-08 13:09:26

相關問題