Sự khác biệt giữa ArrayIterator và ArrayObject trong PHP là gì?

Mảng không phải là đối tượng trong PHP nhưng PHP cung cấp cho chúng ta một số cách để tạo đối tượng hoạt động giống như mảng. Đầu tiên, có lớp ArrayObject khá gần với những gì bạn có với một mảng bình thường (bạn có thể lặp lại nó, sử dụng [] v.v. ) Nếu bạn sử dụng nó làm cha cho lớp của mình, bạn có thể thêm các phương thức vào nó

class ArrObj extends ArrayObject{
	// add methods here
}
$arracc = new ArrObj(['zero', 'one']);
$arracc[] = 'two';
$arracc->prop1 = 'prop 1';
$arracc->prop2 = 'prop 2';
foreach($arracc as $k=>$v) echo "$k=>$v\n"; # prints array but not -> style props

Tuy nhiên, nếu bạn muốn xác định hành vi của [], tốt hơn hết bạn nên tạo một thứ khác thực hiện những gì ArrayObject làm thay vì ghi đè lên nó. Hãy xem ArrayObject đã làm gì cho chúng ta

ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable { 
    // everything gets implemented + things added. 
}

Thông tin thêm về phần nội dung sau nhưng bây giờ hãy tập trung vào ArrayAccess

truy cập mảng

Để triển khai ArrayAccess, bạn phải xác định các phương thức trừu tượng sau

ArrayAccess {
/* Methods */
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}

Đây là một ví dụ thực hiện

class ArrAcc implements ArrayAccess {
    protected $array = array();
    
    public function __construct($array=[]) {
        $this->array = $array;
    }
    public function offsetExists($index) {
        return isset($this->array[$index]);
    }
    public function offsetGet($index) {
        if($this->offsetExists($index)):return $this->array[$index];
        else: return false; endif;
    }
    public function offsetSet($index, $value) {
        if($index): $this->array[$index] = $value;
        else: $this->array[] = $value; endif;
        return true;
    }
    public function offsetUnset($index) {
        unset($this->array[$index]);
        return true;
    }
}
$arracc = new ArrAcc(['zero', 'one']);

$arracc[] = 'two';
$arracc[] = 'three';
$arracc[] = 'four';

$arracc->prop1 = 'prop 1';
$arracc->prop2 = 'prop 2';

foreach($arracc as $k=>$v) echo "$k=>$v\n";

Sở Y tế. dòng cuối cùng đó lặp lại prop1

ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable { 
    // everything gets implemented + things added. 
}
0, không được thêm vào
ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable { 
    // everything gets implemented + things added. 
}
1 như mọi thứ khác. Nó cũng không thể lặp lại bất cứ thứ gì trong mảng. Để làm được điều đó, chúng ta cần giao diện IteratorAggregate

Nếu bạn chỉ muốn có một mảng với các phương thức được thêm vào, mở rộng ArrayObject là câu trả lời của bạn. Khi bạn cần chỉ định hành vi của

ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable { 
    // everything gets implemented + things added. 
}
2, bạn cần tự hỏi mình có cần lặp lại không và nếu không, triển khai AarrayAccess có lẽ là lựa chọn tốt nhất của bạn

Nhưng nếu bạn cần lặp lại và bạn cần chỉ định hành vi của

ArrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable { 
    // everything gets implemented + things added. 
}
2, bạn phải chỉ huy tất cả các phương thức thích hợp bằng cách ghi đè hoặc triển khai chúng. Lớp ArrayObject thực hiện cái sau

Cuộn lớp mảng của riêng bạn

Trước tiên, hãy phóng to thêm một chút về những gì ArrayObject làm. Chúng tôi sẽ không cần tất cả các phương thức này, chỉ những phương thức triển khai các phương thức từ giao diện

________số 8_______

Đây là một lớp thực hiện mọi thứ mà ArrayObject thực hiện và theo một cách rất chuẩn. Bạn có thể làm việc với phiên bản đã sửa đổi của phiên bản này hoặc sử dụng nó làm lớp cơ sở và ghi đè các phương thức trong lớp khác


class Arr implements Serializable, IteratorAggregate, ArrayAccess, Countable
{
	protected $data;

	public function __construct($data=null){
		if (method_exists($data, 'toArray')): $data = $data->toArray();
		elseif ($data===null): $data = array();
		elseif (! is_array($data)): $data = func_get_args();endif;
		$this->data = $data;
	}

	// Implement Serializable
	public function serialize(){return serialize($this->data);} # object to string
	public function unserialize($serialized){$this->data = unserialize($serialized);}
	
	// Implement IteratorAggregate
	public function getIterator(){ return new ArrayIterator($this->data); }

	// Implement Countable
	public function count() { return count( $this->data ); }
	public function length(){ return $this->count(); }
	
	// Implement ArrayAccess
	public function offsetSet($key, $value) {
		if ($key===null) $this->data[] = $value;
		else $this->data[$key] = $value;
	}
	public function offsetGet($key) {
		return array_key_exists($key,$this->data) ? $this->data[$key] : null;
	}
	public function offsetExists($key) {
		return array_key_exists($key, $this->data);
	}
	public function offsetUnset($key) {
		unset($this->data[$key]);
	}
}
$arr1 = new Arr(1, 2, 3);
$arr1["four"] = 4;
foreach ($arr1 as $k => $v) echo "$k=>$v\n";
$arr2 = ["i'm", "an", "array?"];
$arr2 = new Arr($arr2);
$arr2[] = 4;
foreach ($arr2 as $k => $v) echo "$k=>$v\n";

Bạn có thể muốn tạo các lớp bao bọc cho các loại khác, chẳng hạn như chuỗi và số và tại thời điểm đó, sẽ là khôn ngoan nếu mô đun hóa mã của bạn để bạn có thể sử dụng lại các phần tử phổ biến. Rốt cuộc, các chuỗi về cơ bản là các mảng và cũng có khả năng được lặp lại. Nếu điều này nghe giống như kế hoạch thì hãy xem PHP-PhpTypes

Arrayiterator trong PHP là gì?

Tất cả các mảng đều có thể lặp lại, do đó, bất kỳ mảng nào cũng có thể được sử dụng làm đối số của hàm yêu cầu có thể lặp lại. vòng lặp. Bất kỳ đối tượng nào triển khai giao diện Iterator đều có thể được sử dụng làm đối số của hàm yêu cầu có thể lặp lại. Trình vòng lặp chứa danh sách các mục và cung cấp các phương thức để lặp qua chúng

Làm cách nào để gọi một mảng đối tượng trong PHP?

hàm encode_data($val){ if(is_array($val)){ return $val = array_map('encode_data', $val);

Làm cách nào để khai báo đối tượng mảng trong PHP?

PHP cấp phát bộ nhớ động và hơn thế nữa, nó không quan tâm bạn lưu trữ loại đối tượng nào trong mảng của mình. Nếu bạn muốn khai báo mảng của mình trước khi sử dụng thì thứ gì đó dọc theo các dòng này sẽ hoạt động. var $myArray = array(); Sau đó, bạn có thể lưu trữ bất kỳ đối tượng nào bạn thích trong biến $myArray của mình.

Làm cách nào để hiển thị dữ liệu đối tượng mảng trong PHP?

Để hiển thị cấu trúc mảng và giá trị trong PHP, chúng ta có thể sử dụng 2 hàm. Chúng ta có thể sử dụng var_dump() hoặc print_r() để hiển thị các giá trị của một mảng ở định dạng con người có thể đọc được hoặc để xem giá trị đầu ra của mảng chương trình.