Php函数作为函数的参数

时间:2016-08-18 08:00:40

标签: php function parameters

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

大致类似这样的代码并且支持'someFunction'的不同数量的参数。

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

如何组织?

3 个答案:

答案 0 :(得分: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 :(得分:0)

PHP允许您调用许多东西,就像它们是函数一样 - 包括:

  • 函数名称为字符串(例如"myFunc"
  • 包含函数名作为第一个元素的数组和作为第二个元素的参数数组(例如["myFunc", ["arg1", "arg2"]]
  • 包含对象作为第一个元素的数组和作为第二个元素的参数数组(例如[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了解详情。

那就是说,我严肃地质疑这样一个函数的用例 - 通常情况下,除非出现问题,否则不应该发生异常,并且使用类似的函数可以打开你的静默失败。至少,您应该记录发生的异常,以便您可以看到出现问题,但在我看来,您应该在他们相关的任何地方处理特定的例外情况。然而,这完全是一个完全不同的讨论,并没有回答你的问题。

答案 2 :(得分:-1)

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

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