现有类对象中的PHP匿名函数声明
可能重复:现有类对象中的PHP匿名函数声明,php,oop,Php,Oop,可能重复: 我编写PHP已经有相当一段时间了,PHP5.3匿名函数就是其中之一,它认为在构建一些简单脚本时可以帮助您解决很多问题。但是,我无法理解为什么下面的示例不起作用 $db = new PDO([..]); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $db->die = function($str){ die(var_dump( $str )); }; $db->die
我编写PHP已经有相当一段时间了,PHP5.3匿名函数就是其中之一,它认为在构建一些简单脚本时可以帮助您解决很多问题。但是,我无法理解为什么下面的示例不起作用
$db = new PDO([..]);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$db->die = function($str){ die(var_dump( $str )); };
$db->die('[..]');
毕竟,我要做的就是在PDO实例的->die属性上声明匿名函数。这让我觉得这是一个PHP错误。根据这个问题的答案: 这是由于设计(或设计错误)。这里提供了一些解决方案建议。此方法有效:
class Foo{
public $bar;
}
$foo = new Foo;
$foo->bar = function(){
echo "Hello, world\n";
};
call_user_func($foo->bar);
将函数指定给属性不会将属性更改为函数。要执行存储在属性中的函数,必须使用uuu call Magic方法:
class Foo extends PDO {
function __call($function, $args) {
return call_user_func_array($this->{$function}, $args);
}
}
$db = new Foo([..]);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$db->die = function($str){ die(var_dump( $str )); };
$db->die('[..]');
会发生什么?
newpdo([..])
代表什么?它只会产生致命错误:调用[..]行[..]中未定义的方法PDO::die()
这是另一种情况。我在实例启动后声明匿名函数。没有明显的理由让它失败。@Guy啊,没错。但是,第二个链接中的答案在任何情况下都应该适用?您是指\u call()
的“解决方法”吗?这需要扩展原始类,并且通常会停止匿名函数的概念。@不,我指的是call\u user\u func\u array()。但它一点也不优雅。这可以被视为一个设计缺陷,但我认为没有什么可以做的(除了向PHP开发人员抱怨这一点,并要求在将来的版本中修复它),无论如何,我会让答案继续存在几个小时,查看是否有人支持更合理的解释。您可以使用$func=$foo->bar更改call\u user\u func
$func()代码>