2012-05-08 64 views
22

Ai đó có thể giải thích rõ ràng sự khác biệt cơ bản giữa ArrayIterator, ArrayObject và Array trong PHP về chức năng và hoạt động? Cảm ơn!Sự khác biệt giữa ArrayIterator, ArrayObject và Array trong PHP

+3

Bạn đã đọc [ArrayIterator] (http://www.php.net/ArrayIterator), [ArrayObject] (http://www.php.net/ArrayObject) và [Array] (http: // www. php.net/Array)? Đó có lẽ là tất cả thông tin bạn cần. – vascowhite

+1

Ngoài ra, [Stackoverflow không phải là trợ lý nghiên cứu cá nhân của bạn] (http://meta.stackexchange.com/a/128553/164367) – vascowhite

Trả lời

0

Có thể bạn sẽ tìm thấy câu trả lời của bạn ở đây:

iterator này cho phép để unset và sửa đổi các giá trị và các phím trong khi iterating trên Mảng và các đối tượng.

Khi bạn muốn để lặp qua mảng nhiều lần cùng bạn cần để nhanh chóng ArrayObject và để cho nó tạo trường hợp ArrayIterator tham chiếu đến nó, hoặc bằng cách sử dụng foreach hoặc bằng cách gọi phương pháp của nó getIterator() bằng tay.

Cũng đọc:

+12

Xin lỗi tôi đã không làm rõ câu hỏi của tôi - Có Tôi đã đọc tài liệu PHP trên ba nhưng có vẻ như với tôi giống như họ làm khá nhiều điều tương tự. Tôi đã tự hỏi liệu có ai đó có thể giải thích sự khác biệt thực sự giữa họ và lý do tại sao bạn chọn cái kia. Nếu đây không phải là câu hỏi phù hợp để đăng ở đây thì tôi xin lỗi và xin vui lòng xóa bài đăng này! – jkhamler

19

Array là một loại php bản địa. Bạn có thể tạo một trang bằng ngôn ngữ php xây dựng array(), hoặc như của php 5.4 trở đi []

ArrayObject là một object mà làm việc giống hệt như mảng. Chúng có thể được tạo bằng cách sử dụng new từ khóa

ArrayIterator giống như ArrayObject nhưng có thể tự lặp lại. Cũng tạo ra sử dụng new


So sánh Array vs (ArrayObject/ArrayIterator)

Cả hai đều có thể được sử dụng bằng cú pháp mảng của php, cho ví dụ.

$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 

Tuy nhiên, họ vẫn còn các đối tượng vs mảng, do đó bạn sẽ nhận thấy sự khác biệt trong

is_array($array); // true 
is_array($object); // false 

is_object($array); // false 
is_object($object); // true 

Hầu hết các chức năng php mảng mong đợi mảng, vì vậy sử dụng đối tượng thì sẽ ném lỗi. Có rất nhiều chức năng như vậy. Ví dụ:

sort($array); // works as expected 
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ...... 

Cuối cùng, đối tượng có thể làm những gì bạn mong chờ từ một đối tượng stdClass, ví dụ: truy cập vào tài sản công cộng sử dụng cú pháp đối tượng

$object->foo = 'bar'; // works 
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in .... 

Mảng (là loại có nguồn gốc) được nhanh hơn nhiều so với các đối tượng.Ở phía bên kia, các ArrayObject & ArrayIterator lớp đã phương pháp nhất định được xác định mà bạn có thể sử dụng, trong khi không có điều như vậy đối với các mảng


So sánh ArrayObject vs ArrayIterator

Sự khác biệt chính giữa 2 nằm trong các phương thức mà các lớp có.

Giao diện ArrayIterator thực hiện giao diện Iterator cung cấp các phương thức liên quan đến lặp/lặp qua các phần tử. ArrayObject có một phương thức được gọi là exchangeArray hoán đổi nội bộ của nó với một phương thức khác. Việc thực hiện một điều tương tự trong ArrayIterator có nghĩa là tạo một đối tượng mới hoặc lặp qua các phím & unset ing tất cả từng cái một & rồi đặt các phần tử từ mảng mới một lần.

Tiếp theo, vì không thể lặp lại ArrayObject, khi bạn sử dụng nó trong foreach, nó tạo đối tượng ArrayIterator nội bộ (giống như mảng). Điều này có nghĩa là php tạo một bản sao của dữ liệu gốc & hiện có 2 đối tượng có cùng nội dung. Điều này sẽ chứng minh là không hiệu quả đối với mảng lớn. Tuy nhiên, bạn có thể chỉ định lớp nào sẽ sử dụng cho trình vòng lặp, do đó bạn có thể có các trình vòng lặp tùy chỉnh trong mã của mình.


Hy vọng điều này hữu ích. Các chỉnh sửa cho câu trả lời này được hoan nghênh.

+0

Giải thích là về arrayIterator là tất cả sai. Đọc câu trả lời của tôi. – David

7

ArrayObject và mảng có phần giống nhau. Chỉ đơn thuần là một tập hợp các đối tượng (hoặc các kiểu gốc). Họ có một số phương pháp khác nhau mà bạn có thể gọi, nhưng nó chủ yếu là sôi xuống đến cùng một điều.

Tuy nhiên, một Iterator là một thứ hoàn toàn khác. Mẫu thiết kế của trình vòng lặp là một cách để bảo đảm mảng của bạn (làm cho nó chỉ đọc được). Cho phép lấy ví dụ tiếp theo:

Bạn có một lớp có một mảng. Bạn có thể thêm các mục vào mảng đó bằng cách sử dụng addSomethingToMyArray. Tuy nhiên, lưu ý rằng chúng ta thực hiện điều gì đó cho mục trước khi chúng ta thực sự thêm nó vào mảng. Điều này có thể là bất cứ điều gì, nhưng cho phép một lúc hành động như nó là rất quan trọng là phương pháp này được bắn cho MỌI mục mà chúng tôi muốn thêm vào mảng.

class A 
{ 
    private $myArray; 
    public function returnMyArray() 
    { 
     return $this->myArray; 
    } 

    public function addSomethingToMyArray($item) 
    { 
     $this->doSomethingToItem($item); 
     array_push($item); 
    } 
} 

Vấn đề với điều này, là bạn chuyển mảng theo tham chiếu tại đây. Điều đó có nghĩa rằng các lớp thực sự sử dụng returnMyArray nhận được đối tượng myArray thực. Điều đó có nghĩa là các lớp khác ngoài A có thể thêm các thứ vào mảng đó và cũng thay đổi mảng bên trong A mà không cần phải sử dụng addSOmethingToMyArray. Nhưng chúng ta cần phải làm như vậy, hãy nhớ? Đây là một ví dụ về một lớp không kiểm soát trạng thái bên trong của nó.

Giải pháp cho điều này là một trình lặp. Thay vì truyền mảng, chúng ta chuyển mảng tới một đối tượng mới, mà chỉ có thể đọc những thứ từ mảng đó. Iterator đơn giản nhất bao giờ là một cái gì đó như thế này:

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

?>

Như bạn thấy, tôi không có cách nào thêm các mục mới vào mảng nào đó, nhưng tôi không có posibilities để đọc các mảng như thế này:

while($iterator->hasNext()) 
    $item = $iterator->next(); 

Bây giờ có nữa là, chỉ có một cách để thêm các mục vào myArray trong A, cụ thể là thông qua phương thức addSomethingToArray. Vì vậy, đó là những gì một Iterator, nó là một phần của một vỏ xung quanh mảng, để cung cấp một cái gì đó gọi là đóng gói.

0

array là một trong tám loại nguyên thủy trong PHP. Mặc dù nó đi kèm với rất nhiều chức năng tiện ích tích hợp, nhưng tất cả chúng đều là thủ tục.

Cả hai ArrayObjectArrayIterator cho phép chúng tôi tạo mảng cho công dân hạng nhất trong chương trình hướng đối tượng (OOP).

Sự khác nhau giữa ArrayObjectArrayIterator là, kể từ khi thực hiện giao diện ArrayIteratorSeekableIterator, bạn có thể làm $myArray->seek(10); với ArrayIterator.

0

An Iterator là một đối tượng cho phép lập trình viên duyệt qua vùng chứa, đặc biệt là danh sách. Các loại trình vòng lặp khác nhau thường được cung cấp qua giao diện của vùng chứa.

Không có nhiều khác biệt giữa ArrayObjectArray vì chúng đại diện cho cùng một điều mặc dù sử dụng các loại đối tượng khác nhau.

ArrayIterator là Iterator lặp lại trên Array-like đối tượng, điều này bao gồm tất cả các đối tượng triển khai ArrayAcess và kiểu gốc Array. Trong thực tế, khi bạn foreach trên một mảng, PHP trong nội bộ tạo ArrayIterator để làm traversing và biến đổi mã của bạn để trông như thể gõ này,

for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator- 
>next()) 
{ $key = $arrayIteartor->key(); 
    $value = $arrayIterator->current(); 
} 

Vì vậy, bạn có thể thấy, mỗi đối tượng bộ sưu tập có một Iterator trừ các bộ sưu tập đã xác định của bạn mà bạn cần phải xác định các bộ lặp của riêng bạn.

Các vấn đề liên quan