php - 将对象函数作为回调传递
问题描述
有没有办法将“方法引用”传递给接受回调的函数?
例如。:
function ex($callback){
$callback();
}
$obj = (object) ['f' => function(){echo "hello";}];
ex($obj->a)
显然这是一个非常简单的例子,图像有一个复杂的对象$obj
,里面有参数
解决方案
PHP 不像 Javascript 那样工作。
这段代码:
$obj = (object) ['f' => function(){echo "hello";}];
没有定义“具有方法的对象f()
”,它定义了“具有恰好是可调用类型的属性的f
对象”。
直接调用$obj->f();
会导致:
致命错误:未捕获的错误:调用未定义的方法 stdClass::f()
它需要特别处理,例如:
$func = $obj->f;
$func();
或者:
($obj->f)();
虽然这不是一个完全准确的陈述,但您可以认为可调用类型在实际调用之前需要相当于“被取消引用”。
你的例子是一个“成功的错误”,因为它试图使用 PHP 没有的“第一类函数”,但是在一个格式错误的对象上允许它不会失败。
使用适当的类:
function ex($callback){
$callback();
}
class Example {
public function f_instance() {
echo "instance call\n";
}
public static function f_static() {
echo "static call\n";
}
}
ex(['Example', 'f_static']);
$e = new Example();
ex([$e, 'f_instance']);
输出:
static call
instance call
参考:https ://www.php.net/manual/en/language.types.callable.php
推荐阅读
- python - Python - 硒元素返回“无”
- python - 从 CSV 文件创建字典
- excel - Teams/Sharepoint 中的 Excel 365 无法在我的一个共享文件中打开正确的修订版(我的团队中只有一个人)
- iis - iis 反向代理规则因相同的虚拟目录而失败
- android - ConstraintLayout 不尊重约束
- c# - StdOut 被垃圾邮件“C:\fakepath”警告整数除法可能慢得多,如果可能,请尝试使用 uints 通过 C# 使用 Selenium
- firebase - Flutter Cloud Firestore 插件:如何拒绝交易?
- google-apps-script - Google 表格插件无故被拒绝
- javascript - 如何使用从 POST 数据中获取列表 - Django
- android - 在房间 db kotlin 中选择查询?