2016-08-18 146 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来处理它们。 –