Oneliner在PHP中使用相同参数调用多个函数
我有两个或更多的函数总是采用相同的参数。参数是另一个函数调用的返回值 这是代码:Oneliner在PHP中使用相同参数调用多个函数,php,function,Php,Function,我有两个或更多的函数总是采用相同的参数。参数是另一个函数调用的返回值 这是代码: $result = getMyResult(); myFunction1($result); myFunction2($result); ... 问题 有没有办法用同一个参数在同一行上调用多个函数 我正在努力实现的一个例子: 要求 解决方案可以是过程式的,也可以是面向对象的 我不想将getMyResult()的返回值临时存储在变量中 我只想调用getMyResult()一次 我不想将函数调用包装在助手函数中*
$result = getMyResult();
myFunction1($result);
myFunction2($result);
...
问题
有没有办法用同一个参数在同一行上调用多个函数
我正在努力实现的一个例子:
要求
- 解决方案可以是过程式的,也可以是面向对象的
- 我不想将
的返回值临时存储在变量中getMyResult()
- 我只想调用
一次getMyResult()
- 我不想将函数调用包装在助手函数中*
function myHelperFunction($result) {
myFunction1($result);
myFunction2($result);
...
}
如果
myHelperFunction()
是最接近的解决方案,然后我很高兴听到这个消息。我做了更多的研究,我能找到的最符合我要求的答案是1:面向对象的方法和流畅的设置程序,或者2:使用辅助功能
(在此处找到解决方案1:)
解决方案1(3/4要求)使用方法创建一个类,并让每个方法返回对象本身
$result = getMyResult();
$myclass->myMethod1($result)->myMethod2($result)->...
唯一的“问题”是我必须将参数存储在临时变量中,因为我不想多次调用getMyResult()
解决方案2(3/4要求)辅助功能程序解决方案
function myHelperFunction($result) {
myFunction1($result);
myFunction2($result);
...
}
myHelperFunction(getMyResult());
唯一的“问题”是我必须定义一个调用所有其他函数的函数。这个函数不是动态的,因为如果不实现进一步的逻辑,我无法控制内部调用的函数的数量
结论
我找不到任何满足我所有要求的解决方案,我也无法确定目前是否还有其他解决方案。解决方案1和2都会使我的代码设计更容易。现在,我将用解决方案1解决这个问题,有趣的是,这个问题仍然悬而未决,没有一个真正令人满意的答案。下面是一个函数,它将调用任意数量的带有某些参数的函数 它不是一行程序,但一旦您编写了它,就再也不需要了(不需要每次都使用helper函数)。在PHP 7.4之前,它是这样的:
function for_effect() {
$args = func_get_args();
return function() use($args) {
$inner_args = func_get_args();
array_walk($args, function($fn) use ($inner_args){call_user_func_array($fn, $inner_args);});
};
}
$print_me = function() {
var_dump( func_get_args());
};
for_effect($print_me, $print_me)('Some argument');
在7.4之后,它有点好:
function for_effect() {
$args = func_get_args();
return function() use($args) {
$inner_args = func_get_args();
array_walk($args, fn($fn)=>call_user_func_array($fn, $inner_args));
};
}
答案是你问题的最后一行。
function for_effect() {
$args = func_get_args();
return function() use($args) {
$inner_args = func_get_args();
array_walk($args, fn($fn)=>call_user_func_array($fn, $inner_args));
};
}