我在学习PHP5(我最后一次检查PHP是PHP4天),我很高兴地看到,PHP5 OO更加Java的相似比PHP4之一,但还是有让我觉得,因为我的Java相当unconfortable问题背景:数组。
我在读“业余体校PHP6”(Wrox的),它表明了自己的Collection实现。 我发现其他clases像在http://aheimlich.dreamhosters.com/generic-collections/Collection.phps基于SPL。 我还发现,有一些类型的集合在SPL(ArrayObject的)的
不过,我很惊讶,因为我实在不明白使用集合在PHP的人,他们似乎更喜欢阵列。
那么,是不是它使用集合在PHP就像人使用ArrayList,而不是在Java中基本阵列是一个好主意? 毕竟,PHP数组是不是真的像Java数组。
在Java集合做出很大的意义,因为它是一个强类型语言。 这是有道理的有说“汽车总动员”和另一个“摩托车”的集合。
然而,在PHP中,由于动态类型的性质,这是很常见牺牲的集合的形式。 阵列是足以被用作各种对象类型(汽车,摩托车等)的通用容器。 此外,额外的好处来自于一个事实,即阵列可以很容易突变(有时可能是一个很大的缺点,当合适的错误检查不存在)。
我来自一个Java的背景,我已经发现,使用PHP中的集合设计模式不买太多的优势的方式(不支持多线程,没有内存分配,没有迭代器等的优化)。
如果你正在寻找任何的这些优势,它可能更好地构建一个包装类阵列周围,实现每个功能(迭代器等)点菜。
我在PHP非常亲集合对象,它们可以被用来添加类型安全,impliment易于使用的搜索,排序和操作功能,并且代表了正确的面向对象方法而不是使用数组和有用的,但程序性的功能,其操作上的众多他们在不同的图案遍布来源。
我们有我们用于各种目的都规规矩矩地继承推动型安全,一致的编码标准和代码重用的一个高层次的各种藏品。
但是ultimatley,他们都是阵列的内部!
我想真的把它归结为选择,但在我的面向对象的世界里,我想保持代码易于重复段,如基类排序和搜索算法,我找对象符号更自我记录。
PHP数组是关联......他们远远比Java的阵列功能更强大,包括很多的名单<>和地图的功能<>。
你说的“好主意”是什么意思? 他们是不同的工具,使用您使用的另一种方式通常会导致挫折一种语言。
我也有点惊愕地发现PHP中的集合类型的类。 数组有几个真正的缺点在我的经验。
首先,可用来操纵这些功能的数量受到限制。 例如,我需要能够在给定的索引位置任意插入和从集合中删除项目/。 这样做,在PHP中的内置语言功能阵列是痛苦的最好的。
其次,作为一种第一点的支脉,书写干净,可读的代码,在超越了简单的PUSH / POP和迭代器的东西任何复杂操纵数组是很难达到最佳。 我经常发现我必须使用一个数组索引和跟踪在创建数据密集型应用程序的另一个数组。
我更喜欢在一个框架(我个人的选择是工作NOLOH )。 在那里,我有一个名为ArrayList的一个真正的集合类,它具有的功能,如添加,插入,RemoveAt移除,RemoveRange和切换。 我想其他的PHP框架解决这个问题为好。
在PHP中一个不错的实现集合由瓦瑞恩库提供,该库是OSL许可证的Magento的代码的一部分。 (约Magento的许可证和代码重用的详细信息在这里 。
无法找到库中的任意代码,因此最好的办法就是下载Magento的,然后看看在/ lib /瓦瑞恩/
Yii有实现完全的Java像集合堆
http://www.yiiframework.com/doc/api/1.1/CList
我有时用这个非常简单的实现,给我一个粗略的集合。
通常一个集合的主要要求是强制执行一组一个类型的对象,你只需要建立一个基本的类构造函数来实现它。
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;
}
}