【问题标题】:Poor PHP ArrayObject design [closed]糟糕的PHP ArrayObject设计[关闭]
【发布时间】:2011-08-25 05:10:47
【问题描述】:

为什么ArrayObject 类中只有几个 PHP 数组函数作为方法可用?例如,asort() 可用,但 walk() 和其他许多不可用。

$s= new ArrayObject(array(1,3,4,5,6,4));
$x= $s->asort();                   //implemented
$x= $s->sum();                     //not implemented
$x= array_sum($s->getArrayCopy()); //not an OO manner!  
//sum is an example, consider:array_map,array_walk,array_merge .... 

请注意,我已仔细阅读文档。我的问题是为什么 php 团队只是在 ArrayObject 类中嵌入了数组函数的子集(应该封装与数组相关的要求)。这不是一个糟糕的设计吗? 为什么我们要扩展这个类并在这个类中再次嵌入数十个函数?是否合理?

【问题讨论】:

  • @Reza 真的我认为归根结底是能够根据自己的需要自行扩展它。无论如何,您都不会为 ArrayObject 使用数字数组,因此其中的名称为 Object。你可以有一个类集合,但你会如何总结呢?你必须定义它。你宁愿没有数组类吗?
  • @Reza,您的问题的答案是因为这是作者决定的。如果您想知道原因,希望他们能记住,那么我可以将他们的联系方式转发给您吗?

标签: php arrays class


【解决方案1】:

想一想对象集合应该能够以原生方式轻松地执行哪些操作。如果我有一堆书,我希望能够对它们进行分类,我希望能够在某个位置获得一本,我希望能够遍历它们等等。我不想要的是能够将它们全部加起来。如果我向该对象添加一个 sum 函数,则意味着该对象的每个实例也将具有一个 sum 函数——在大多数情况下,这是一个奇怪且出乎意料的用例。

ArrayObject,在很多意义上,比 PHP 的 array 更接近于传统数组的概念。因此,我相信它应该会更快。

【讨论】:

  • 您的意思是 ArrayObject 仅用于对象数组吗?所以它的名字应该是ObjectsArray!我喜欢为所有数组类型使用 OO 类,就像在 Java 中一样。
  • 没有。它是一个功能类似于数组的对象。问题是,PHP 中的数组并不是真正意义上的数组,就像它们在 C 或 Java 中一样。
【解决方案2】:

ArrayObject 不仅适用于具有 int/float 等需要进行求和运算的元素的数组。 array_sum 对于所有 ArrayObject 类型对象都不是必需的。您应该扩展ArrayObject,例如NumberArrayObject 以拥有sum 方法。

【讨论】:

  • sum 就是一个例子,其他函数呢。如您所知,PHP 不是类型强的
  • array_map,array_walk,array_merge ....
【解决方案3】:

*Array functions page 上的所有内容都违反了这个面向对象的原则。

*this page 上没有的所有内容。

原因很简单:创建 PHP 时,他们考虑的 OOP 标准并不多。 OOP 是事后添加的,并在 PHP5 中得到了改进。 PHP 创建时,原语(和数组)不被视为对象,因此这些函数存在。将函数与其关联的数据类型耦合当然是有意义的,但 PHP 将始终保留它的原始数组函数。

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多