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