Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的类Java集合_Java_Php_Collections_Language Comparisons - Fatal编程技术网

PHP中的类Java集合

PHP中的类Java集合,java,php,collections,language-comparisons,Java,Php,Collections,Language Comparisons,我正在学习PHP5(我上次检查PHP是在PHP4天),我很高兴看到PHP5 OO比PHP4 OO更像Java,但由于我的Java背景,仍然有一个问题让我感到非常不适应:数组 我正在阅读“专业PHP6”(Wrox),它展示了它自己的集合实现。 我还发现了其他类,比如基于SPL的中的类。 我还发现SPL(ArrayObject)中有某种集合 然而,我很惊讶,因为我没有看到人们在PHP中使用集合,他们似乎更喜欢数组 那么,在PHP中使用集合不是一个好主意吗?就像人们在Java中使用ArrayList而

我正在学习PHP5(我上次检查PHP是在PHP4天),我很高兴看到PHP5 OO比PHP4 OO更像Java,但由于我的Java背景,仍然有一个问题让我感到非常不适应:数组

我正在阅读“专业PHP6”(Wrox),它展示了它自己的集合实现。 我还发现了其他类,比如基于SPL的中的类。 我还发现SPL(ArrayObject)中有某种集合

然而,我很惊讶,因为我没有看到人们在PHP中使用集合,他们似乎更喜欢数组


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

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

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

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


如果您正在寻找这些优点中的任何一个,那么最好围绕数组构造一个包装类,按顺序实现每个特性(迭代器等)。

PHP数组是关联的。。。它们比Java的数组强大得多,并且包含了列表和映射的许多功能


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

我也有点失望,因为在PHP中没有发现集合类型的类。根据我的经验,阵列有几个真正的缺点

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

第二,作为第一点的一个分支,编写干净、可读的代码,在简单的push/pop和迭代器之外的任何复杂程度上操作数组,充其量都是困难的。我经常发现,在我创建的数据密集型应用程序中,我必须使用一个数组来索引和跟踪另一个数组


我更喜欢在框架中工作(我个人的选择是)。在那里,我有一个名为ArrayList的真实集合类,它具有诸如Add、Insert、RemoveAt、RemoveAnge和Toggle之类的函数。我想其他PHP框架也可以解决这个问题。

我非常支持PHP中的集合对象,它们可以用于添加类型安全性,实现易于使用的搜索、排序和操作功能,并表示正确的OO方法,而不是使用数组和大量有用但程序化的函数,这些函数在源代码中以不同的模式对它们进行操作

我们有各种各样的集合,用于各种目的,所有这些都是为了促进类型安全、一致的编码标准和高水平的代码重用

但最后通牒,它们都是数组的内部


我想这实际上取决于选择,但在我的面向对象世界中,我喜欢在基类中保留易于重复的代码段,如排序和搜索算法,并且我发现对象表示法更易于自我记录。

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


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

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


我有时会使用这个非常简单的实现来提供一个粗略而现成的集合

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

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

PHP中使用了很多OO设计模式,PHP5 OO与Java非常相似,因此使用某种集合对我来说似乎是个好主意。事实上,PHP从Java中借用了一些东西并不一定是件好事。我想我很困惑。你确实有“集合”。它们只是没有命名为“列表”或“映射”。PHP数组将动态增长。您可以关联键/值对。集合有点不同,但不能在其中堆积太多。:)来自Java的世界确实很奇怪,但请接受这些差异和它们带来的折衷!构建我自己的包装器类的缺点是使用非标准类来完成这样一个基本任务。SPL的ArrayObject是一个包装器吗?同意,任何自定义包装器都有非标准的缺点,但这可能不是那么糟糕,因为实际上没有标准的集合包装器。我还没有真正使用SPL的ArrayObject,但看看docs(),它似乎是一个添加了克隆函数和迭代器的包装类。如果这就是你所需要的,我建议你使用它。但是如果你需要同步,linkedlist vs.arraylist等等,你可能需要编写你自己的包装器或者扩展ArrayObject。完全同意,但有时候你只想基本保证数组只包含一种类型的对象。我使用了一个简单的实现——请看下面的答案。您能指出Java集合比PHP数组的优势吗?除了看起来很有进取心