17

我正在学习 PHP5(上次我检查 PHP 是在 PHP4 天),我很高兴看到 PHP5 OO 比 PHP4 更像 Java,但仍然有一个问题让我感觉很不舒服,因为我的 Java背景:阵列。

我正在阅读“Proffesional PHP6”(Wrox),它显示了它自己的 Collection 实现。我在http://aheimlich.dreamhosters.com/generic-collections/Collection.phps中找到了其他类,例如基于 SPL 的类。我还发现 SPL (ArrayObject) 中有某种集合

但是,我很惊讶,因为我并没有真正看到人们在 PHP 中使用集合,他们似乎更喜欢数组。

那么,就像人们在 Java 中使用 ArrayList 而不是基本数组一样,在 PHP 中使用 Collections 不是一个好主意吗?毕竟,php 数组并不像 java 数组。

4

7 回答 7

19

Java 中的集合很有意义,因为它是一种强类型语言。有一个集合说“汽车”和另一个“摩托车”是有意义的。

然而,在 PHP 中,由于动态类型的特性,牺牲集合的形式是很常见的。数组足以用作各种对象类型(汽车、摩托车等)的通用容器。此外,额外的好处来自于数组可以很容易地改变这一事实(当没有适当的错误检查时,这有时可能是一个很大的缺点)。

我来自 Java 背景,我发现在 PHP 中使用集合设计模式并没有带来太多好处(没有多线程、没有优化内存分配、没有迭代器等)。

如果您正在寻找这些优势中的任何一个,最好围绕数组构建一个包装器类,实现每个功能(迭代器等)点菜。

于 2009-10-16T20:35:56.863 回答
6

我是 PHP 中非常专业的集合对象,它们可用于添加类型安全,实现易于使用的搜索、排序和操作功能,并代表正确的 OO 方法,而不是使用数组和大量有用但可操作的程序函数它们在源头上以不同的模式出现。

我们有各种用于各种目的的集合,所有这些集合都被巧妙地继承以促进类型安全、一致的编码标准和高水平的代码重用。

但归根结底,它们都是数组的内部!

我想这真的归结为选择,但在我面向对象的世界中,我喜欢在基类中保留易于重复的代码段,例如排序和搜索算法,而且我发现对象表示法更能自我记录。

于 2011-08-22T22:33:22.960 回答
5

PHP 数组是关联的……它们比 Java 的数组强大得多,并且包含 List<> 和 Map<> 的大部分功能。

“好主意”是什么意思?它们是不同的工具,以您使用另一种语言的方式使用一种语言通常会导致挫败感。

于 2009-10-16T20:36:26.457 回答
3

我也有些沮丧地发现 PHP 中没有 Collection 类型的类。根据我的经验,数组有几个真正的缺点。

首先,可用于操作它们的函数数量有限。例如,我需要能够在给定索引位置向集合中任意插入和删除项目。使用 PHP 中数组的内置语言函数来做到这一点充其量是痛苦的。

其次,作为第一点的一种分支,编写干净、易读的代码来操作除了简单的推送/弹出和迭代器之外的任何复杂级别的数组充其量是困难的。我经常发现我必须使用一个数组来索引和跟踪我创建的数据密集型应用程序中的另一个数组。

我更喜欢在框架中工作(我个人的选择是NOLOH)。在那里,我有一个名为 ArrayList 的真正 Collection 类,它具有 Add、Insert、RemoveAt、RemoveRange 和 Toggle 等功能。我想其他 PHP 框架也可以解决这个问题。

于 2011-05-18T23:39:52.913 回答
0

Varien Lib 提供了一个很好的 php 集合实现,该库是具有 OSL 许可证的 Magento 代码的一部分。(有关 Magento 许可证和代码重用的更多信息,请点击此处

找不到该库的任何源代码,因此最好的方法是下载 magento,然后查看 /lib/Varien/

于 2012-05-29T17:53:11.903 回答
0

Yii 实现了完整的 java 类集合堆栈

http://www.yiiframework.com/doc/api/1.1/CList

于 2013-10-01T07:43:26.507 回答
0

我有时会使用这个非常简单的实现来给我一个粗略且现成的集合。

通常,集合的主要要求是强制执行一组一种类型的对象,您只需设置一个带有构造函数的基本类来实现它。

class SomeObjectCollection {

   /**
    * @var SomeObject[]
    */
   private $collection = array();

   /** 
    * @param SomeObject $object1
    * @param SomeObject $_ [optional]
    */
   function __construct(SomeObject $object1 = null, SomeObject $_ = null) 
   {
       foreach (func_get_args() as $index => $arg) {
           if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject');
           $this->collection[] = $arg;
       }
   }

   /**
    * @return SomeObject[]
    */
   public function getAll()
   {
       return $this->collection;
   }
}
于 2015-06-19T12:10:50.860 回答