Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
现有类对象中的PHP匿名函数声明_Php_Oop - Fatal编程技术网

现有类对象中的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()