【问题标题】:Creating anonymous objects in php, which extends something在 php 中创建匿名对象,它扩展了一些东西
【发布时间】:2014-10-31 08:50:39
【问题描述】:

我的问题类似这样:Creating anonymous objects in php

不同的是我希望一个类被无名类扩展。

编辑:好的,不清楚,这里是例子:

$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; } 
));

【问题讨论】:

  • 什么意思?你的意思是你有一个类,并想给它添加属性?你可以。在 PHP 中,这称为对象重载(不好的术语):$instance->newProperty = 123; 在实例上创建一个新的公共属性。但实际上,你不应该这样做。可以通过分配闭包来分配方法,但这更错误,因为这些方法本身就是Closure 对象的实例。此外:动态属性访问速度较慢,使您的代码更容易出错且更难维护
  • 已更新,希望现在一切都清楚

标签: php


【解决方案1】:

你想要做的是impossibru!。做不到,没办法。忘掉它。结束。
匿名对象确实是stdClass 的一个实例,但您不能内联扩展它。但是,您可以做的是创建一个您希望 stdClass 从中扩展的基类的实例,然后重载它(IMO 是个坏主意,但它是可行的):

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

为什么我认为这个“重载”是个坏主意的原因是:

  • 重载只是一个愚蠢的术语,在大多数情况下,在 OOP 中,重载完全意味着其他东西
  • 预声明的属性很容易找到,而添加到实例的属性则不然。 details here
  • 错字使您的代码极易出错,并且几乎无法调试
  • 您可以对类进行类型提示,它会告诉您某些预定义的方法和属性将可用。如果你边走边添加属性/方法,你就会失去这个优势

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

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2011-09-17
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多