2014-09-06 58 views
-3

我的问题是这样的相似:Creating anonymous objects in phpPHP创建匿名对象,它扩展了一些

不同的是我想要一类由无名类进行扩展。

编辑:确定,不明确的,这里是个例子:我想它在某种程度上

$anonim_obj = new stdClass(array(
    "foo" => function() { echo "foo"; }, 
    "bar" => function($bar) { echo $bar; } 
)); 

$anonim_obj = new stdClass extends BaseClass (array(
    "foo" => function() { echo "foo"; }, 
    "bar" => function($bar) { echo $bar; } 
)); 
+0

你是什么意思?你的意思是你有一个班级,并想添加属性?您可以。在PHP中,这被称为对象重载(坏术语):'$ instance-> newProperty = 123;'在实例上创建一个新的公共属性。但是,真的,你不应该这样做。通过分配闭包来分配方法是可能的,但这更加错误,因为这些方法本身就是Closure对象的实例。此外:动态属性访问速度较慢,使您的代码更容易出错,难以维护 – 2014-09-06 16:14:32

+0

已更新,希望现在全部清除 – 2014-09-07 10:03:06

回答

1

什么你想要做的是impossibru!。无法完成,没办法。忘掉它。结束。
匿名对象实际上是stdClass的一个实例,但不能对其进行在线扩展。你能做什么,但是,是创建基础类的一个实例你想要的stdClass从扩展和重载它(这是一个坏主意海事组织,但它是poissible):

$anonObj = new BaseClass();//create "parent" instance 
$anonObj->foo = function() 
{ 
    echo 'foo'; 
}; 
$anonObj->bar = function($bar) 
{ 
    echo $bar; 
}; 

原因为什么我认为这“超载”是一个坏主意,是因为:

  • 重载只是一个无聊的名词,大部分时间超载,在OOP,意味着别的东西完全
  • 预先声明的性质是q uick查找,添加到实例的属性不是。 details here
  • 错字的使你的代码非常容易受到错误,嘶鸣上不可能调试
  • 您可以键入-提示的一类,它告诉你某些预先定义的方法和属性将可用。如果你去添加属性/方法,你失去了这个优势

底线:如果你想要一个对象来扩展你的BaseClass,并有2种额外的方法:只写血腥类,不要尝试从定制的对象扩展通用对象。

+0

AAAAHHH完全正确!我是个白痴!!谢谢 :) – 2014-09-07 11:09:23