php如何调用由数组转换成的类中的方法?

问题复现代码如下:

$arr["t"]="123";
$arr["fn"]=function(){
  echo "这个函数调用了";
};
$obj=(object)$arr;
foreach($obj as $f=>$v){ //遍历类中所有公共属性
  if($f=="fn"){
    $v();//成功调用到类中的函数
  }
}
echo $obj->t;//这样调用类中的变量是没问题的
$obj->fn();//但调用类中的方法不行

我用foreach遍历类中所有公共属性,用判断属性名的方法可以调用这个由数组转换成的类中的函数,但不能每次调用函数时都写个循环。

->调用类中的变量是没问题的,但类中的公开方法应该怎么调用(不写循环情况下)?

感觉这好像是基础问题,但尝试了各种办法都找不到答案

最佳答案

因为当你使用 $obj->fn() 的时候,这相当于是在调用 $obj 对象上的 fn 方法,而这里显然没有 fn 这个结构方法。

而当你使用 foreach 时,实际上 $obj->fn 他返回的是一个闭包函数,是闭包可以被调用,所以在这里只需要改成 ($obj->fn)(); 的形式调用就可以了。

2年前 评论
wsug (楼主) 2年前
讨论数量: 5

因为当你使用 $obj->fn() 的时候,这相当于是在调用 $obj 对象上的 fn 方法,而这里显然没有 fn 这个结构方法。

而当你使用 foreach 时,实际上 $obj->fn 他返回的是一个闭包函数,是闭包可以被调用,所以在这里只需要改成 ($obj->fn)(); 的形式调用就可以了。

2年前 评论
wsug (楼主) 2年前

感谢大家的回复,再次请教大佬,我数组定义时习惯用-作分割符,比如$arr["org-mode"]="最好的笔记工具";(没错,我就是emacs用户),这样转成对象后,对象的公共属性里也有用-分割的属性,可以用循环的方式调用到。

但是不符合php命名规则,用->调用时命名中有-号就报错。但对象中确实是有这个公共属性|方法的,这个又要如何才能调用得了这些属性|方法

2年前 评论
sanders
$arr["org-mode"]="最好的笔记工具";
$o=(object)$arr;
echo $o->{"org-mode"};
2年前 评论
wsug (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!