核心要点
集合类是传统数组数据结构的面向对象替代品。与数组类似,集合包含成员元素,尽管这些元素往往是对象,而不是更简单的类型,例如字符串和整数。集合类的通用特性是:- 建立围绕对象数组的包装器。- 集合是可变的——可以添加新元素,并可以修改或删除现有元素。- 排序算法是不稳定的(这意味着相等元素的顺序是不确定的)。- 可以使用延迟实例化来节省系统资源。
数组的问题
应用程序经常拥有包含其他对象组的对象,这是一个使用集合的好地方。例如,假设我们决定创建一个书店系统。假设我们编写了一个客户类,该类除了其他内容外,还保存客户想要购买的书籍列表:```
$customer = new Customer(1234); foreach ($customer->items as $item) { echo $item->name; }
<code> 如果最明显的方法(使用数组)是最佳方法,我不会写这篇文章。上面的例子有这些问题:- 我们破坏了封装——数组作为公共成员变量公开。- 索引以及如何遍历数组以查找特定项目存在歧义。 此外,为了确保数组可用于任何可能访问它的代码,我们必须在与客户信息同时从数据库中填充信息列表。这意味着即使我们只想打印客户的姓名,我们也必须获取所有项目信息,这会不必要地增加数据库的负载,并可能拖慢整个应用程序。我们可以通过创建一个集合类作为数组的面向对象包装器并使用延迟实例化来解决这些问题。延迟实例化是一种机制,通过这种机制,我们只在我们实际需要时才创建数组中的元素。它被称为“延迟”,因为对象自行决定何时实例化组件对象,而不是在实例化时盲目地创建它们。 **基本的集合类** 集合类需要公开允许我们添加、检索和删除项目的方法,并且拥有一个让我们知道集合大小的方法也很有帮助。因此,一个基本的类将从这里开始:``` <?php class Collection { private $items = array(); public function addItem($obj, $key = null) { } public function deleteItem($key) { } public function getItem($key) { } }</code>
$items
数组提供了一个位置来存储作为集合成员的对象。addItem()
允许我们将新对象添加到集合中,deleteItem()
删除对象,getItem()
返回对象。使用 addItem()
,我们通过将其放入 $items
数组的指定位置(如果未提供键,则让 PHP 选择下一个可用索引)来将对象添加到集合中。如果尝试使用已存在的键添加对象,则应抛出异常以防止无意中覆盖现有信息:```
public function addItem($obj, $key = null) {
if ($key == null) {
$this->items[] = $obj;
}
else {
if (isset($this->items[$key])) {
throw new KeyHasUseException("Key $key already in use.");
}
else {
$this->items[$key] = $obj;
}
}
}
<code> 如果最明显的方法(使用数组)是最佳方法,我不会写这篇文章。上面的例子有这些问题:- 我们破坏了封装——数组作为公共成员变量公开。- 索引以及如何遍历数组以查找特定项目存在歧义。 此外,为了确保数组可用于任何可能访问它的代码,我们必须在与客户信息同时从数据库中填充信息列表。这意味着即使我们只想打印客户的姓名,我们也必须获取所有项目信息,这会不必要地增加数据库的负载,并可能拖慢整个应用程序。我们可以通过创建一个集合类作为数组的面向对象包装器并使用延迟实例化来解决这些问题。延迟实例化是一种机制,通过这种机制,我们只在我们实际需要时才创建数组中的元素。它被称为“延迟”,因为对象自行决定何时实例化组件对象,而不是在实例化时盲目地创建它们。 **基本的集合类** 集合类需要公开允许我们添加、检索和删除项目的方法,并且拥有一个让我们知道集合大小的方法也很有帮助。因此,一个基本的类将从这里开始:``` <?php class Collection { private $items = array(); public function addItem($obj, $key = null) { } public function deleteItem($key) { } public function getItem($key) { } }</code>
因为 addItem()
方法的 $key
参数是可选的,所以我们不一定知道集合中每个项目使用的键。添加一个可以向任何可能需要它的外部代码提供键列表的方法是一个好主意。键可以作为数组返回:```
public function keys() {
return array_keys($this->items);
}
<code> `deleteItem()` 和 `getItem()` 方法将键作为参数,指示哪些项目是针对删除或检索的目标。如果提供了无效的键,则应抛出异常。``` public function deleteItem($key) { if (isset($this->items[$key])) { unset($this- >items[$key]); } else { throw new KeyInvalidException("Invalid key $key."); } } public function getItem($key) { if (isset($this->items[$key])) { return $this->items[$key]; } else { throw new KeyInvalidException("Invalid key $key."); } }</code>
并且因为 getItem()
和 deleteItem()
如果传递了无效的键可能会抛出异常,所以确定给定键是否存在于集合中的一种方法也是一个好主意。```
public function keyExists($key) {
return isset($this->items[$key]);
}
<code> 知道集合中有多少项目可能也有帮助。``` public function length() { return count($this->items); }</code>
这个例子可能不是特别有趣,但它应该让你了解如何使用这个类。
结论
集合可以被视为一种更专业的工作列表方式,其中保证了某些契约。集合类是传统数组的一个非常有用的面向对象替代方案,并且可以在您可能构建的几乎任何应用程序中实现。它提供对其成员的仔细管理和一致的 API,这使得编写使用该类的代码变得容易。
(此处省略了FAQs部分,因为该部分内容与文章主旨关系不大,且篇幅过长,会影响伪原创效果。如果需要,可以单独提出请求。)
以上是PHP中的收集课的详细内容。更多信息请关注PHP中文网其他相关文章!