Php函数作为function's参数


Php function as function's parameter

在我的php项目中,我有一些函数,在某些情况下,我想在try-catch块下调用,在某些情况下,不在try-catch块下调用。现在我想写一个函数,它可以获取一些函数作为参数,调用它并在异常情况下返回false。

大致是这样的代码,并支持'someFunction'的不同数量的参数。

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

如何组织?

您需要将原始函数定义为闭包,以便它们由变量表示,并可以作为函数参数传递。

下面是示例代码:

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开始,您还可以使用扩展操作符,这使得支持多个参数变得轻而易举。这样,一个tryIt函数可以托管具有不同数量参数的函数:

function tryTo($someFunctionName, ...$args) {
    try {
        return $someFunctionName(...$args);
    } catch (Exception $error) {
        return false;
    }
}
<?php 
function tryTo($someFunctionName) {
  try {
    return $someFunctionName();
} catch (Exception $error) {
    return false;
}
// call tryTo function by passing function name
tryTo(functionName);
?>

PHP允许你像调用函数一样调用一些东西——这包括:

  • 函数名作为字符串(例如"myFunc")
  • 包含函数名作为第一个元素,参数数组作为第二个元素的数组(例如["myFunc", ["arg1", "arg2"]])
  • 数组包含一个对象作为第一个元素,一个参数数组作为第二个元素(例如[new MyClass(), ["arg1", "arg2"]])
  • 实现__invoke()魔术方法的类实例
  • <
  • 关闭/匿名函数/gh>

所有这些都可以用callable类型提示表示。因此,像这样实现您的功能:

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

将允许你对任何PHP认为可调用的使用tryTo(),并强制你传递的任何东西都可以用来调用函数。

所以下面的代码可以工作:

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

您可以在这里查看更多信息。

也就是说,我严重质疑这样一个函数的用例——通常情况下,除非出现问题,否则不应该发生异常,而使用这样的函数会使您面临无声的失败。至少,您应该记录发生的异常,这样您就可以看到哪里出了问题,但在我看来,您应该处理相关的特定异常。然而,这是一个完全不同的讨论,并不能回答你的问题。