【问题标题】:What fundamental objects are missing in Object Oriented PHP?面向对象的 PHP 中缺少哪些基本对象?
【发布时间】:2011-02-23 21:02:14
【问题描述】:

我用 PHP 编码已经有一段时间了,我对过程函数(尤其是字符串和数组)的不一致感到比较恼火。

有了对对象的支持,我一直希望 PHP 能够将数组和字符串作为对象进行本机实现,这样我就可以编写如下代码:

$arr = new Array('foo', 'bar');
$item = $arr->pop();

制作一个类似数组的对象并不太难,但是会显着降低性能。无论如何,它最终都会成为数组构造的包装器。

对于面向对象的 PHP,是否有 其他 PHP 应该具有的核心对象?

编辑添加:

不是关于如何将数组用作对象;事实上,我确实 想要在答案中讨论数组,因为这不是问题所在。我以数组为例,似乎没有人读过这个问题。我对应该存在于核心 PHP 中的其他类/对象感兴趣。

【问题讨论】:

  • 至少对于数组示例有 ArrayObject 和 SplStack。也许即将到来的 SplString 将添加类似的功能和字符串的方法 API。但是除非函数成为第一类对象,否则我认为将所有基本类型都表示为对象的用处不大。 (如果遵循 Python 而不是模仿 Java OOP 特性,PHP 会更好。)
  • 看看SPL。特异性,ArrayObject
  • 我不关心基本对象。我宁愿看到支持将对象转换为其他基本类型(例如整数、浮点数、布尔值等)。否则谁在乎你是否有一个 SPLInt,如果你不能根据需要默默地转换它......
  • 我不明白你为什么需要这个。您可以使用 (object) array(); 将数组转换为对象。但是如果你关心性能而不是你为什么不简单地使用数组作为数组呢?
  • @SODA,不是需要,而是想要。 @Tim Cooper,ArrayObject 缺少大多数高级数组方法(diff、map、intersect 等),所以我认为它是不完整的。

标签: php oop object


【解决方案1】:

编辑: 在 PHP 6 中可以使用aoutoboxing 是编译器在原始(基本)类型与其对应的对象包装类(例如,array 和 ArrayObject、double 和 Double 等)之间进行的自动转换。 会有一个名为 __autobox() 的特殊函数

    <?php
function __autobox($value) {
    return ... /* some object */
}
?>

例如:

function __autobox($value) 
    {
        switch(gettype($value))
        {
            case 'integer':
                return new MyIntegerObject($value);
                break;

            case 'array':
                return new ArrayObject($value);
                break;

            default:
                $stdObj =  new stdClass();
                $stdObj->value = $value;
                return $stdObj;
                break;

        }
    }

使用示例:

var_dump(5 == new MyInteger(5));
bool(true)

【讨论】:

  • 问题不在于 如何 将数组用作对象,我已经了解 ArrayObject、ArrayAccess、Countable、IteratorAggregate 等。使用这些对象/接口中的任何一个仅作为数组的包装器,而不是作为独立对象。
  • 哦,抱歉,这将在 php 6.0 中使用 autoboxing
  • PHP 6 到了吗?该死。 * 爬回休眠状态 *
  • Baris Yildirim,把自动装箱的东西放在你的答案中,我会接受它作为答案。
【解决方案2】:

您可能会争辩说 PHP 应该将它的一些原生对象转换或至少扩展为等效对象,从易用性的角度来看,您是对的,但 SPL 提供了我们需要的大部分东西,因此没有人真正抱怨。我们使用数组的方式足够灵活,不会消耗不必要的内存。

如果我必须选择,我宁愿让 PHP 简化它的数组 api,而不是仅仅将所有数组转换为对象。为什么是array_map和asort?例如,为什么不使用 array_sort。它宁愿让他们在 php6 中解决这个问题,实际上几个月前有机会询问 Scott McVicar 和 Derick Rethans,他们回答说这会破坏向后兼容性并激怒庞大的用户群。愚蠢的答案,但恐怕故事结束了。

但要回答你的问题,不……我认为 PHP 不应该采用它的原始类型作为语言对象。

【讨论】:

  • “它会破坏向后兼容性并激怒庞大的用户群”这正是为什么原生数组(或任何其他)对象实现可以帮助修复 问题。新对象的设计可以考虑到一致性,这样您就不会受到不一致的功能的限制。
  • 你不需要说服我...和php核心团队谈谈:)
猜你喜欢
  • 2013-10-25
  • 2014-02-17
  • 2011-01-11
  • 2012-03-03
  • 2012-10-02
  • 2011-08-09
  • 2014-08-25
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多