PHP中调用stdClass匿名对象的闭包方法报错如何解决?
错误原因
PHP 中stdClass的属性存储和类方法解析是两套独立逻辑:你赋值给$obj->Greeting的是一个闭包类型的普通属性,但当你使用$obj->Greeting()语法调用时,PHP 会优先在stdClass类的方法列表中查找Greeting方法,不会自动将其识别为属性存储的闭包执行,因此会抛出未定义方法的错误。
正确实现方式
以下是几种常用的可行方案:
- 方案1:用括号包裹属性读取操作,显式指定先取属性值再执行闭包
$obj = new stdClass(); $obj->Greeting = function (string $d){return "Hello ".$d;}; $greetings = ($obj->Greeting)("world!");
- 方案2:通过
call_user_func执行闭包属性
$greetings = call_user_func($obj->Greeting, "world!");
- 方案3:PHP 7+ 版本可使用匿名类实现,符合常规面向对象调用习惯,无需特殊语法处理
$obj = new class { public function Greeting(string $d): string { return "Hello ".$d; } }; $greetings = $obj->Greeting("world!");
内容的提问来源于stack exchange,提问作者Kemsikov
相关产品推荐
相关产品推荐

