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

Chủ Đề