在我的php项目中,我有一些函数,在某些情况下我想在try-catch块下调用,在某些情况下不在try-catch块下。 现在我想编写一个函数,它将一些函数作为参数,调用它并在异常的情况下返回false。
大致类似这样的代码并且支持'someFunction'的不同数量的参数。
function tryTo($someFunctionName) {
try {
return someFunctionName();
} catch (Exception $error) {
return false;
}
如何组织?
答案 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);
?>