ArrayIterator,ArrayObject的和陣列之間的差異有人可以解釋的功能和操作方面ArrayIterator
,在PHP ArrayObject
和陣列之間明確的根本區別是什麼?謝謝!在PHP
在PHP
回答
可能你會在這裏找到答案:
這個迭代器允許取消設置並同時 遍歷數組和對象修改值和密鑰。
當你想,你需要 實例ArrayObject的,讓它創建ArrayIterator實例 ,要麼使用的foreach或通過手動調用其 getIterator()方法方法是指它在同一陣列多次迭代。
而且讀:
對不起,我沒有讓我的問題清楚 - 是的,我已閱讀PHP文檔三但在我看來,他們做的事情幾乎是一回事。我想知道是否有人能夠解釋他們之間的實際區別,以及爲什麼你會選擇一個。如果這不是一個合適的問題張貼在這裏然後我道歉,請隨時刪除這篇文章! – jkhamler
Array
PHP原生型。您可以使用PHP語言構建array()
創建一個,或PHP 5.4的起[]
ArrayObject
是object
的工作完全一樣的陣列。這些可以使用new
關鍵字
ArrayIterator
就像ArrayObject
創建,但它可以迭代本身。還使用new
比較Array
VS(ArrayObject
/ArrayIterator
)
他們都可以使用PHP數組的語法來使用,例如創建。
$array[] = 'foo';
$object[] = 'foo';
// adds new element with the expected numeric key
$array['bar'] = 'foo';
$object['bar'] = 'foo';
// adds new element with the key "bar"
foreach($array as $value);
foreach($object as $value);
// iterating over the elements
然而,他們仍然反對VS陣列,所以你會發現在
is_array($array); // true
is_array($object); // false
is_object($array); // false
is_object($object); // true
大多數PHP數組函數期望陣列的差異,因此使用對象會有拋出錯誤。有許多這樣的功能。例如。
sort($array); // works as expected
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......
最後,對象可以做你期望從stdClass
對象是什麼,即訪問使用對象語法
$object->foo = 'bar'; // works
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in ....
陣列(即原生型)的公共屬性遠遠快於對象。在另一邊,ArrayObject
& ArrayIterator
類有一定的方法來定義的,你可以使用,而沒有用於陣列
比較ArrayObject
沒有這樣的事情VS ArrayIterator
這兩個之間的主要區別是在類的方法中。
ArrayIterator
implements Iterator
接口,它給它的方法有關元素的迭代/循環。 ArrayObject
有一個名爲exchangeArray
的方法,它將內部數組與另一個交換。在ArrayIterator
中實現類似的事情將意味着要麼創建一個新的對象,要麼循環通過所有的鍵& unset
&然後逐個設置新陣列中的元素。
接着,由於ArrayObject
不能被重複,當你在foreach
使用它它創建一個內部對象ArrayIterator
(同陣列)。這意味着php創建一個原始數據的副本&現在有2個對象具有相同的內容。這對於大型陣列來說將證明是低效的。但是,您可以指定哪個類用於迭代器,因此您可以在代碼中使用自定義迭代器。
希望這會對您有所幫助。歡迎對這個答案進行編輯。
解釋是關於arrayIterator是全錯的。閱讀我的答案。 – David
ArrayObject和數組有點相似。僅僅是一些對象(或本機類型)的集合。他們有一些可以調用的不同方法,但大部分歸結爲同樣的事情。
但是,迭代器是完全不同的東西。迭代器設計模式是一種保護數組的方法(使其只能讀取)。讓我們看看下面的例子:
你有一個有數組的類。您可以使用addSomethingToMyArray將項目添加到該數組。但請注意,在我們將其添加到數組之前,我們會對項目進行一些操作。這可能是任何事情,但讓我們暫時表現爲,對於我們想要添加到數組中的每個項目,都會觸發此方法,這非常重要。
class A
{
private $myArray;
public function returnMyArray()
{
return $this->myArray;
}
public function addSomethingToMyArray($item)
{
$this->doSomethingToItem($item);
array_push($item);
}
}
這個問題,是你在這裏通過引用傳遞數組。這意味着實際使用returnMyArray的類將獲得真正的myArray對象。這意味着除A以外的類可以將數組添加到該數組,因此也可以更改A中的數組而不必使用addSOmethingToMyArray。但我們需要做的事情,記得嗎?這是一個不控制自己內在地位的階級的例子。
對此的解決方案是一個迭代器。我們將數組傳遞給一個只能從數組中讀取數據的新對象,而不是傳遞數組。最簡單的迭代器是這樣的:
<?php
class MyIterator{
private $array;
private $index;
public function __construct($array)
{
$this->array = $array;
}
public function hasNext()
{
return count($this->array) > $this->index;
}
public function next()
{
$item = $this->array[ $this->index ];
this->$index++;
return $item;
}
}
?>
正如你所看到的,我也沒有增加新的項目,以給定數組的方式,但我有posibilities閱讀陣列是這樣的:
while($iterator->hasNext())
$item = $iterator->next();
現在再次出現,只有一個辦法將項目添加到A中的myArray,即通過addSomethingToArray方法。所以這就是Iterator的意義,它是一個圍繞數組的外殼,提供了一種叫做封裝的東西。
array
是PHP中的八種基本類型之一。雖然它有很多內置的實用功能,但它們都是程序性的。
ArrayObject
和ArrayIterator
都允許我們在面向對象的程序(OOP)中創建數組頭等公民。 ArrayObject
和ArrayIterator
之間
不同的是,由於ArrayIterator
實現SeekableIterator
接口,你可以做$myArray->seek(10);
與ArrayIterator
。
Iterator是一個讓程序員遍歷容器的對象,特別是列表。通常通過容器的接口提供各種類型的迭代器。
ArrayObject
和Array
之間沒有太大差別,因爲它們表示相同的東西,儘管使用了不同的對象類型。
ArrayIterator
是迭代器,迭代Array-like
對象,這包括該實施ArrayAcess
所有對象和天然Array
類型。 事實上,當你foreach
一個數組,PHP內部創建ArrayIterator
做橫動,彷彿輸入這個改變你的代碼看,
for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator-
>next())
{ $key = $arrayIteartor->key();
$value = $arrayIterator->current();
}
所以你可以看到,每一個集合對象具有除了一個Iterator您需要定義您自己的迭代器的定義集合。
你讀過[ArrayIterator](http://www.php.net/ArrayIterator),[ArrayObject](http://www.php.net/ArrayObject)和[Array](http:// www。 php.net/Array)?這可能是您需要的所有信息。 – vascowhite
此外,[Stackoverflow不是您的個人研究助理](http://meta.stackexchange.com/a/128553/164367) – vascowhite