如何解决在PHP中通过引用传递函数
| 是否可以通过引用传递函数? 像这样:function call($func){
$func();
}
function test(){
echo \"hello world!\";
}
call(test);
我知道您可以做\'test\'
,但是我并不是真的想要那个,因为我需要通过引用传递函数。
通过匿名函数这样做的唯一方法是吗?
说明:如果您从C ++调用,可以通过指针传递一个函数:
void call(void (*func)(void)){
func();
}
或在Python中:
def call(func):
func()
这就是我要完成的工作。
解决方法
到底值多少钱,这样的镜头怎么样? (是的,我知道这是一个在帖子中提到的匿名函数,但是我对大量的答复根本没有提到闭包/函数对象感到不满,因此,这主要是针对那些在此运行的人们的注意事项发布)。
我不使用PHP,但是使用闭包似乎可以在PHP 5.3(而不是PHP 5.2)中工作,如此处所示。我不确定有什么限制(如果有)。 (据我所知,关闭会吃掉你的孩子。你已经被警告过。)
function doIt ($fn) {
echo \"doIt\\n\";
return $fn();
}
function doMe () {
echo \"doMe\\n\";
}
// I am using a closure here.
// There may be a more clever way to \"get the function-object\" representing a given
// named function,but I do not know what it is. Again,I *don\'t use PHP* :-)
echo doIt(function () { doMe(); });
快乐的编码。
, call_user_func()
的问题是您正在传递被调用函数的返回值,而不是函数本身。
我也曾经遇到过这个问题,这是我想出的解决方案。
function funcRef($func){
return create_function(\'\',\"return call_user_func_array(\'{$func}\',func_get_args());\");
}
function foo($a,$b,$c){
return sprintf(\"A:%s B:%s C:%s\",$a,$c);
}
$b = funcRef(\"foo\");
echo $b(\"hello\",\"world\",123);
//=> A:hello B:world C:123
ideone.com演示
, 不,函数不是PHP中的一等值,它们不能通过其名称文字(您要的是)传递。甚至匿名函数或通过ѭ7创建的函数也会通过对象或字符串引用传递。
您可以将函数名称作为字符串传递,将对象方法的名称作为“ 8”数组传递,或者将匿名函数作为对象传递。这些都不传递指针或引用,它们只是传递函数的名称。所有这些方法都被称为“ 9”伪类型:http://php.net/callback
, function func1(){
echo \'echo1 \';
return \'return1\';
}
function func2($func){
echo \'echo2 \' . $func();
}
func2(\'func1\');
结果:
echo1 echo2 return1
, 在PHP 5.4.4(尚未测试较低版本或其他版本)中,您可以按照建议的方式进行操作。
以此为例:
function test ($func) {
$func(\'moo\');
}
function aFunctionToPass ($str) {
echo $str;
}
test(\'aFunctionToPass\');
该脚本将回显\“ moo \”,就像您直接调用\“ aFunctionToPass \”一样。
, 此Javascript一流函数的类似模式:
function add(first,second,callback){
console.log(first+second);
if (callback) callback();
}
function logDone(){
console.log(\'done\');
}
function logDoneAgain(){
console.log(\'done Again\');
}
add(2,3,logDone);
add(3,5,logDoneAgain);
可以通过以下方式在PHP中进行测试(在C9 IDE上用5.5.9-1ubuntu测试):
// first class function
$add = function($first,$second,$callback) {
echo \"\\n\\n\". $first+$second . \"\\n\\n\";
if ($callback) $callback();
};
function logDone(){
echo \"\\n\\n done \\n\\n\";
}
call_user_func_array($add,array(2,logDone));
call_user_func_array($add,array(3,6,function(){
echo \"\\n\\n done executing an anonymous function!\";
}));
结果:5完成9完成执行匿名功能!
参考:https://github.com/zenithtekla/unitycloud/commit/873659c46c10c1fe5312f5cde55490490191e168
, 你可以说
$fun = \'test\';
call($fun);
, 代替call(test);
,使用use17ѭ。
, 您可以通过在声明函数时将函数分配给局部变量来创建引用:
$test = function() {
echo \"hello world!\";
};
function call($func){
$func();
}
call($test);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。