2016-08-18 143 views
1

在我的PHP項目中,我有一些函數,在某些情況下,我想在try-catch塊下調用,有些情況下不在try-catch塊下。 現在我想寫一個函數,它獲取一些函數作爲參數,調用它並在異常情況下返回false。PHP函數作爲函數的參數

大概這樣的代碼,並支持'someFunction'的不同數量的參數。

function tryTo($someFunctionName) { 
    try { 
     return someFunctionName(); 
    } catch (Exception $error) { 
     return false; 
    } 

如何組織?

+1

除了缺少美元符號,這段代碼有什麼問題? – trincot

+0

當然,您可能還需要考慮將參數傳遞給您要調用的函數 –

+0

是的,我想用參數調用try-catch塊內的函數。 –

回答

3

您需要通過變量來定義你的原始功能Closures,使他們都表示,並可以作爲函數參數進行傳遞。

下面是示例代碼:

function myFunc ($arg) { 
    echo "called myFunc with '$arg' as argument"; 
} 

// create a Closure for it 
$myFunc = function ($arg) { myFunc($arg); }; 

function tryTo($someFunctionName, $arg) { 
    try { 
     return $someFunctionName($arg); 
    } catch (Exception $error) { 
     return false; 
    } 
} 

// call tryTo passing the Closure and the argument 
echo tryTo($myFunc, "test"); 

隨着PHP 5.6的,你也可以使用spread operator這使得它成爲一塊蛋糕,以支持多個參數。這樣一個tryIt功能,可以把主機換用不同數量的參數功能:

function tryTo($someFunctionName, ...$args) { 
    try { 
     return $someFunctionName(...$args); 
    } catch (Exception $error) { 
     return false; 
    } 
} 
-1
<?php 
function tryTo($someFunctionName) { 
    try { 
    return $someFunctionName(); 
} catch (Exception $error) { 
    return false; 
} 

// call tryTo function by passing function name 
tryTo(functionName); 
?> 
+0

OP爲什麼要「使用此代碼」?一個**好的答案**總是會解釋做了什麼以及爲什麼這樣做, 不僅適用於OP,而且適用於SO的未來訪問者,可能會發現此問題並正在閱讀您的答案。 – RiggsFolly

+0

如果我想用參數調用'someFunction',我該怎麼辦? –

+0

請不要發佈只有代碼的答案。總是添加一個解釋。 – DanFromGermany

0

PHP允許你調用了一些事情,如果他們的功能 - 這包括:

  • 函數名作爲字符串(例如"myFunc"
  • 包含函數名作爲第一個元素和參數數組作爲第二元件(例如["myFunc", ["arg1", "arg2"]]
  • 陣列containin陣列g的對象作爲第一元件和參數數組作爲第二元件(例如[new MyClass(), ["arg1", "arg2"]])的實施__invoke()魔術方法
  • 瓶蓋類
  • 實例/匿名功能

所有這些可以是由callable typehint表示。因此,實現你的功能,例如:

tryTo(callable $callable) { 
    try { 
     $callable(); 
    catch(\Exception $ex) { 
     return false; 
    } 
} 

將允許您使用tryTo()什麼 PHP考慮調用和執行,無論你通過可用於調用一個函數。

所以下面的工作:

tryTo('myFunc'); // Equivalent to myFunc(); 
tryTo('MyClass::myFunc'); // Equivalent to MyClass::myFunc(); 
tryTo(['myFunc', ['myArg', 'myOtherArg']]; // Equivalent to myFunc('myArg', 'myOtherArg'); 
tryTo([new MyClass(), 'myFunc']); // Equivalent to (new MyClass())->myFunc(); 
tryTo(function() { echo 'test'; }); // executes whatever closure you pass 

你可以看到here以獲取更多信息。

這就是說,我認真質疑用例這樣的一個功能 - 通常,異常應該不會發生,除非什麼是錯的,像打開你到靜音故障使用功能。最起碼,你應該記錄發生的,所以你可以看到,出事了異常,但在我看來,無論他們是相關的,你應該處理特殊情況例外。然而,這完全是一個完全不同的討論,並沒有回答你的問題。

+0

在我的情況下,我自己拋出Exceptions來處理它們。 –