【发布时间】:2010-01-17 07:03:29
【问题描述】:
注意:我已将这篇文章压缩到我的个人 wiki 中:http://wiki.chacha102.com/Lambda - 享受
我在 PHP 中使用 Lambda 样式函数时遇到了一些问题。
首先,这是可行的:
$foo = function(){ echo "bar"; };
$foo();
第二,这可行:
class Bar{
public function foo(){
echo "Bar";
}
第三,这行得通:
$foo = new stdClass;
$foo->bar = function(){ echo "bar"; };
$test = $foo->bar;
$test();
但是,这不起作用:
$foo = new stdClass;
$foo->bar = function(){ echo "bar"; };
$foo->bar();
而且,这不起作用
class Bar{
public function foo(){
echo "Bar";
}
$foo = new Bar;
$foo->foo = function(){ echo "foo"; };
$foo->foo(); // echo's bar instead of Foo.
我的问题是为什么?,我如何保证这两个:
$foo->bar = function(){ echo "test"; };
$foo->bar();
还有这个
$foo = new Bar;
$foo->bar();
被正确调用了吗?如果您可以指出说明此问题发生原因的文档,则加分。
【问题讨论】:
-
这更多地与您无法在 PHP 中动态覆盖类的方法有关,这一次又一次让我感到沮丧。我最终使用数组(或许多其他“解决方案”之一)来动态构建包含数据和函数的“事物”。数组不能很好地用于自动完成,并且您会丢失许多其他功能。从你问到现在已经 10 年了,没有什么明显的变化。如果要在对象实例化后重新定义方法,则必须改用属性(即,您根本无法重新定义方法),并且必须以不同的方式调用属性。