Chúng tôi, các Lập trình viên PHP, thường viết một lớp với các thuộc tính, thuộc tính getter/setter được xác định trước bắt buộc và sử dụng chúng bên trong ứng dụng của chúng tôi. Thế là đủ tuyệt rồi. Tuy nhiên, điều gì sẽ xảy ra khi có dữ liệu không ổn định/thường xuyên thiếu một số thuộc tính hoặc đôi khi có thể có thêm một số thuộc tính mà chúng tôi không biết/yêu cầu. Nếu bạn đã làm việc với nhiều API khác nhau như dịch vụ, bạn có thể quen với những tình huống như vậy. Chà, bạn có thể nghĩ đối với những tình huống như vậy, dữ liệu PHP JSON có thể là một lựa chọn tốt. Bây giờ còn sự kết hợp của cả hai thì sao, điều đó có tuyệt vời không, trong đó một số thuộc tính ổn định được xác định nghiêm ngặt và vẫn cho phép chứa cả dữ liệu động khác? . Ngồi yên 😉
Lớp PHP cơ bản với định nghĩa thuộc tính
Trước tiên hãy viết một lớp đơn giản với một vài thuộc tính/thuộc tính được xác định trước
Code language: PHP [php]
class MyObj { private $name; private $occupation; public function getName[] { return $this->name; } public function getOccupation[] { return $this->occupation; } public function setName[$name] { $this->name = $name; } public function setOccupation[$occupation] { $this->occupation = $occupation; } public function __construct[$name = "", $occupation = ""] { parent::__construct[]; $this->name = $name; $this->occupation = $occupation; } }
Đây là một định nghĩa lớp tiêu chuẩn mẫu mà chúng tôi sử dụng hàng ngày để phát triển PHP. Hãy làm cho nó có khả năng hơn
Khả năng truy cập tài sản
vì các khả năng này là một số loại chung chung, hãy bắt đầu chúng trong một lớp riêng biệt mà 'MyObj' của chúng tôi sẽ mở rộng để kế thừa các tính năng đó. Bây giờ, một đối tượng PHP tiêu chuẩn có thuộc tính như quyền truy cập theo mặc định. Điều đó có nghĩa là, bạn có thể sử dụng nó như dưới đây
Code language: PHP [php]
$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;
Vì vậy, tại sao chúng ta đang cố gắng khám phá lại khả năng này?
Chà, mặc dù khả năng sử dụng ở trên là rất khả thi, nhưng dữ liệu không nằm trong tay bạn và bạn sẽ không thể đồng bộ hóa dữ liệu này với các tính năng trợ năng khác mà chúng tôi sẽ thảo luận tiếp theo. Vì vậy, để tạo điều kiện thuận lợi cho điều đó, chúng tôi sẽ sử dụng cấu trúc dữ liệu nội bộ để biểu diễn đối tượng sẽ được chia sẻ theo cách nhất quán bởi tất cả các tính năng truy cập đối tượng động PHP khác mà chúng tôi sẽ thảo luận hôm nay
bây giờ, trong khi một thuộc tính như quyền truy cập/chỉ định diễn ra trên đối tượng của chúng ta, chúng ta có thể nắm bắt những thuộc tính đó bằng cách sử dụng một vài phương thức ma thuật như bên dưới
Code language: PHP [php]
class PDAO { /** * @var array data */ protected $data = array[]; /** * Checks whether a key is set on this record. * * @param string $key The key. * @return bool */ public function __isset[$key] { return isset[$this->data[$key]]; } /** * Get the value of a key in this record. * * @param string $key The key. * @return mixed */ public function __get[$key] { if[isset[$this->data[$key]]] { return $this->data[$key]; } else { return null; } } /** * Set the value of a key in this record. * * @param string $key The key. * @param string $value The value. */ public function __set[$key, $value] { if [$key === null] { $this->data[] = $value; } else { $this->data[$key] = $value; } } /** * Unset a property in this record * @param type $name */ public function __unset[$name] { if[isset[$this->data[$name]]] { unset[$this->data[$name]]; } } }
để xác minh xem dữ liệu có được đặt thành biến $data đúng cách hay không, bạn có thể thử triển khai phương pháp đơn giản
Code language: PHP [php]
public function getData[] { return $this->data; }
bây giờ làm kiểm tra
Code language: PHP [php]
print_r[$obj->getData[]];
Thêm khả năng truy cập giống như mảng
Để thêm mảng như khả năng truy cập, chúng tôi sẽ phải triển khai giao diện ArrayAccess do PHP cung cấp và viết tất cả các phương thức một cách có ý nghĩa với biến '$ data' hiện có của chúng tôi. Đây là cách chúng ta có thể làm điều đó
class Record implements \ArrayAccess { //Other already written methods etc /** * Check if a key exist * @param type $offset * @return type */ public function offsetExists[$offset] { return $this->__isset[$offset]; } /** * get value for a key * @param type $offset * @return type */ public function offsetGet[$offset] { return $this->__get[$offset]; } /** * set value for a key * @param type $offset * @param type $data * @return type */ public function offsetSet[$offset, $data] { $this->__set[$offset, $data]; } /** * unset a key * @param type $offset */ public function offsetUnset[$offset] { unset[$this->data[$offset]]; } }
Code language: PHP [php]
Bây giờ chúng ta sẽ có thể sử dụng đối tượng của mình như bên dưới
Code language: PHP [php]
$obj["city"] = "Montreal"; echo $obj["city"];
Truy cập mảng đa chiều
Vâng, vì bây giờ chúng ta có thể sử dụng đối tượng của mình như một mảng, nhưng liệu chúng ta có thể truy cập nó như một mảng nhiều chiều không? Hãy thử xem
Code language: PHP [php]
$obj["skills"]["programming"] = "PHP";
Ồ. chúng tôi thất bại. ed Và một lỗi như sau sẽ xảy ra
________số 8_______Hmm, có vẻ như công việc của bạn vẫn chưa hoàn thành. Chúng ta phải xử lý nó cho tình huống như vậy. May mắn thay, nó không khó lắm. Vì vậy, chúng ta hãy làm điều đó
Code language: PHP [php]
/** * set value for a key * @param type $offset * @param type $data * @return type */ public function offsetSet[$offset, $data] { // This check is important! if [is_array[$data]] { $data = new self[$data]; } $this->__set[$offset, $data]; } /** * Performs cloning of current object */ public function __clone[] { foreach [$this->data as $key => $value] { if [$value instanceof self] { $this[$key] = clone $value; } } }
Ngoài ra, nếu chúng ta muốn truyền mảng nhiều chiều trong hàm tạo, thì chúng cũng cần được xử lý như sau
0Code language: PHP [php]
$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;
Khả năng lặp lại của đối tượng động PHP của chúng tôi
Bây giờ có thể coi đối tượng của chúng ta là mảng, bạn có thể nghĩ rằng, có thể chúng ta cũng có thể lặp lại nó giống như mảng mà không gặp vấn đề gì. Sai rồi. Chúng tôi sẽ phải thêm khả năng này bên ngoài. Đầu tiên, triển khai giao diện 'Iterator' của PHP. Sau đó viết các phương thức như dưới đây
1Code language: PHP [php]
$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;
Truy cập dưới dạng mảng thuần túy
Chà, vì vậy, bây giờ chúng ta có đối tượng của mình để xử lý như một đối tượng động PHP thuần túy mà chúng ta có thể sử dụng như thuộc tính, như mảng và cũng có thể lặp qua đối tượng. Tuy nhiên, mặc dù hầu hết công việc của chúng tôi đã hoàn thành, nhưng trong trường hợp bạn thực sự muốn nó là một mảng thuần túy, thì nó sẽ không cung cấp cho bạn điều đó theo mặc định. Đừng lo, một chức năng đơn giản cũng có thể giúp chúng ta đạt được điều đó
2Code language: PHP [php]
$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;
Định nghĩa lớp Final sẽ giống như bên dưới
3Code language: PHP [php]
$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;
Vì vậy, cuối cùng chúng tôi cũng có được đối tượng động PHP của mình với nhiều tính linh hoạt có thể dễ dàng trong các tình huống khác nhau như mẫu, sử dụng API của bên thứ ba, v.v. Mã hóa vui vẻ 🙂