2012-10-11 42 views
1

有沒有辦法在PHP中做到這一點?作爲默認參數的PHP匿名函數?

//in a class 
public static function myFunc($x = function($arg) { return 42+$arg; }) { 
    return $x(8); //return 50 if default func is passed in 
} 
+0

請問爲什麼要這樣做? – tradyblix

+0

好吧,我有一個通用的實用函數,它將匿名函數作爲參數(具體來說,它根據某些規則將函數中的各種對象轉換爲各種數組)。我想要一個默認操作。那是過分的要求? = x – Arcymag

+0

編號默認參數只能是常數值,不能是表達式,也不能是對象。 – mario

回答

6

PHP函數默認參數只能是標量或數組類型的:

默認值必須是常量表達式,而不是(例如)一個變量,類成員,或者一個函數調用。

From: PHP Manual/Function Arguments/Default argument values

如何:

public static function myFunc($x = null) { 

    if (null === $x) { 
     $x = function($arg) { return 42 + $arg; }; 
    } 

    return $x(8); //return 50 if default func is passed in 
} 
+0

答案接受,因爲鏈接到PHP手冊,其中說:「默認值必須是一個常量表達式,而不是(例如)變量,類成員或函數調用。」謝謝。我早些時候有過這樣的事情,我希望有一個語言功能。猜不= =( – Arcymag

+0

我也建議在函數簽名中聲明'$ x'的類型,因爲傳入一個字符串會導致發生$ x(8)'時發生錯誤,我個人會聲明類型爲'Closure'確保它是一個匿名函數,但'callable'也可以工作並且更靈活一些(並且容易出錯)。所以'myFunc(Closure $ x = null)'或'myFunc(callable $ x = null )',如果你嘗試過'myFunc(「test」),那麼要麼會拋出一個可捕獲的致命錯誤;'如果這個類型沒有被聲明,那麼會出現一個不可捕獲的致命錯誤 – Anthony

3

您可以使用func_num_argsfunc_get_arg

//in a class 
public static function myFunc() { 
    if (func_num_args() >= 1) { 
     $x = func_get_arg(0); 
    } else { 
     $x = function($arg) { return 42+$arg; } 
    } 
    return $x(8); //return 50 if default func is passed in 
} 

但我tradyblix,你可以只處理數據作爲

同意
//in a class 
public static function myFunc() { 
    if (func_num_args() >= 1) { 
     $x = func_get_arg(0); 
     $retval = $x(8); 
    } else { 
     $retval = 42 + 8; 
    } 
    return $retval; //return 50 if default func is passed in 
} 
+0

不知道func_num_args和func_get_arg。慶典。 – Arcymag