核心要點
集合類是傳統數組數據結構的面向對象替代品。與數組類似,集合包含成員元素,儘管這些元素往往是對象,而不是更簡單的類型,例如字符串和整數。集合類的通用特性是:- 建立圍繞對像數組的包裝器。 - 集合是可變的——可以添加新元素,並可以修改或刪除現有元素。 - 排序算法是不穩定的(這意味著相等元素的順序是不確定的)。 - 可以使用延遲實例化來節省系統資源。
數組的問題
應用程序經常擁有包含其他對象組的對象,這是一個使用集合的好地方。例如,假設我們決定創建一個書店系統。假設我們編寫了一個客戶類,該類除了其他內容外,還保存客戶想要購買的書籍列表:```
$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中文網其他相關文章!