Thuộc tính đối tượng truy cập PHP động

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

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

Code language: PHP [php]


Đâ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

$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;

Code language: PHP [php]


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

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

Code language: PHP [php]

để 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

public function getData[] { return $this->data; }

Code language: PHP [php]

bây giờ làm kiểm tra

print_r[$obj->getData[]];

Code language: PHP [php]

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

$obj["city"] = "Montreal"; echo $obj["city"];

Code language: PHP [php]

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

$obj["skills"]["programming"] = "PHP";

Code language: PHP [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 đó

/** * 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; } } }

Code language: PHP [php]

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

$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;

Code language: PHP [php]
0

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

$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;

Code language: PHP [php]
1

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 đó

$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;

Code language: PHP [php]
2

Định nghĩa lớp Final sẽ giống như bên dưới

$obj = new MyObj[]; $obj->country = "Bangladesh"; echo $obj->country;

Code language: PHP [php]
3

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ẻ 🙂

Làm cách nào để truy cập dữ liệu từ đối tượng trong PHP?

Để truy cập thuộc tính của một đối tượng, PHP sử dụng toán tử -> , vì vậy $my_address->street có nghĩa là "thuộc tính đường phố của .

Thuộc tính động là gì?

Thuộc tính động là bất cứ thứ gì có thể đã được phát hiện trong trường hợp chưa được ghi lại trong cấu trúc của trường hợp thông qua thuộc tính trường hợp hiện có. Capturing this information with a dynamic property highlights the unique aspects of an investigation.

Làm cách nào để lấy khóa đối tượng trong PHP?

Để chỉ hiển thị các khóa từ một đối tượng, hãy sử dụng array_keys[] trong PHP.

Chủ Đề