Hướng dẫn how do i access protected attributes in php? - làm cách nào để truy cập các thuộc tính được bảo vệ trong php?

Đối tượng có thể được đánh máy vào mảng [kết hợp] và các thành viên được bảo vệ có các khóa có tiền tố với chr[0].'*'.chr[0] [xem nhận xét của @Fardelian tại đây]. Sử dụng tính năng chưa được xử lý này, bạn có thể viết "trình tiếp cận":

function getProtectedValue[$obj, $name] {
  $array = [array]$obj;
  $prefix = chr[0].'*'.chr[0];
  return $array[$prefix.$name];
}

Ngoài ra, bạn có thể phân tích giá trị từ chuỗi tuần tự hóa, trong đó [dường như] các thành viên được bảo vệ có cùng tiền tố.

Điều này hoạt động trong PHP 5.2 mà không có chi phí của lớp phản xạ. Tuy nhiên, có những lý do tại sao một số tài sản được bảo vệ và ẩn khỏi mã máy khách. Việc đọc hoặc viết có thể làm cho dữ liệu không nhất quán hoặc tác giả cung cấp một số cách khác để phơi bày nó trong nỗ lực làm cho giao diện càng nạc nhất có thể. Khi có lý do để đọc trực tiếp thuộc tính được bảo vệ, cách tiếp cận chính xác khi đó là để thực hiện phương thức ma thuật __get [], vì vậy hãy luôn kiểm tra xem có bất kỳ và xem nó làm gì không. Tra cứu trực quan này cuối cùng đã được giải quyết trong PHP 8.1 với các thuộc tính đọc.

Kể từ Php 8.0, cũng có thể truy cập siêu dữ liệu bởi ReflectionClass, hãy đảm bảo kiểm tra chúng trước khi thực hiện các nỗ lực đột nhập vào các thành viên được bảo vệ. Các thuộc tính được thay thế "Chú thích" 1, vì vậy cũng kiểm tra chúng.

1: Chú thích là một bất ngờ rất khó chịu đối với các lập trình viên khách hàng: họ phân tích các bình luận để thêm chức năng khó hiểu vô dụng của hộp đen lạ mắt, không nên được sử dụng nữa, nhưng chúng vẫn tồn tại

Tôi nhận ra một cái gì đó kỳ lạ về việc truy cập các thuộc tính được bảo vệ vào ngày khác. Nó có thể trong PHP truy cập các thuộc tính được bảo vệ từ các đối tượng khác, miễn là chúng từ cùng một lớp, như được minh họa ở đây:


Tôi luôn nghĩ rằng protected nghiêm ngặt cho phép các đối tượng truy cập mọi thứ từ cây kế thừa hiện tại, nhưng didn nhận ra rằng điều này cũng mở rộng sang các trường hợp khác của cùng một đối tượng.

Hành vi này hoạt động cho các thuộc tính và phương pháp, và cả khi chúng được định nghĩa là private.

Vào một ngày khác, tôi nhận ra rằng điều này thậm chí còn hoạt động cho các đối tượng của các lớp khác, miễn là bạn đang truy cập các thành viên được xác định trong một lớp cũng xuất hiện trong tổ tiên của lớp truy cập.

Nghe có vẻ hơi phức tạp, vì vậy, đây là ví dụ:


Thật thú vị, nếu ví dụ cuối cùng được sửa đổi sao cho các thuộc tính không được đặt trong các hàm tạo, mà thay vào đó bằng cách ghi đè thuộc tính, điều này sẽ bị hỏng:


Bởi vì ví dụ thứ ba đưa ra một lỗi, nhưng lần thứ hai thì không, điều này khiến tôi cảm thấy rằng tôi đã đơn giản vấp phải một trường hợp cạnh của động cơ PHP và tính năng này không phải là do thiết kế. Nếu nó được thiết kế như vậy, cả hai nên làm việc IMHO.

Rốt cuộc nếu một hành vi nhất định [trong trường hợp này là một tài sản] hoạt động cho tổ tiên, nguyên tắc thay thế Liskov ra lệnh cho nó cũng sẽ hoạt động cho bất kỳ lớp con nào.

Ngoài ra, PHP thông thường chỉ cho phép bạn sửa đổi khả năng hiển thị của thuộc tính để trở nên rõ ràng hơn.

Tuy nhiên, tôi chỉ gặp phải một trường hợp mà hành vi của ví dụ #2 là siêu tiện dụng, nhưng tôi không hoàn toàn chắc chắn liệu đó có phải là một ý tưởng tốt để dựa vào hành vi này hay cho rằng hành vi này chỉ là 'không xác định' và có thể được thay đổi mà không cần thông báo trong phiên bản PHP tiếp theo.

Thông số PHP không giải thích một cách hoàn toàn không cho phép nó. Đây là văn bản có liên quan:

Một thành viên có khả năng hiển thị được bảo vệ chỉ có thể được truy cập từ trong lớp của chính nó và từ các lớp có nguồn gốc từ lớp đó. nguồn

Tất nhiên, thông số PHP có thể chưa hoàn thành, và không chắc chắn liệu nó có được nhóm PHP xem xét hay không.

Vì vậy, tôi đã không thực sự biết rằng việc dựa vào hành vi này là một ý tưởng tốt, nhưng ít nhất nó ngay lập tức một ví dụ điển hình về lý do tại sao có một tiêu chuẩn PHP chính thức và chính thức là một ý tưởng tuyệt vời.

Làm cách nào để truy cập các thuộc tính được bảo vệ trong PHP?

PHP OOP - Bộ điều chỉnh truy cập..
công khai - tài sản hoặc phương thức có thể được truy cập từ mọi nơi. Đây là mặc định ..
Được bảo vệ - thuộc tính hoặc phương thức có thể được truy cập trong lớp và bởi các lớp có nguồn gốc từ lớp đó ..
Riêng - Thuộc tính hoặc Phương thức chỉ có thể được truy cập trong lớp ..

Làm thế nào chúng ta có thể truy cập biến được bảo vệ bên ngoài lớp trong PHP?

Các sửa đổi truy cập được bảo vệ không thể được áp dụng cho các lớp.Tuy nhiên, chúng có thể được gọi bởi một lớp con được kế thừa từ lớp cha của nó.Do đó, người ta có thể khai báo phương thức cần thiết hoặc một biến được bảo vệ bằng cách tiền tố nó với một từ khóa được bảo vệ trên mạng.prefixing it with a “protected” keyword.

Biến được bảo vệ trong PHP là gì?

Được bảo vệ :: Một biến hoặc phương thức được bảo vệ không thể được truy cập bởi người dùng của lớp nhưng có thể được truy cập bên trong một lớp con kế thừa từ lớp.RIÊNG TƯ :: Một biến hoặc phương thức riêng tư chỉ có thể được truy cập nội bộ từ lớp mà nó được xác định.cannot be accessed by users of the class but can be accessed inside a subclass that inherits from the class. Private :: A private variable or method can only be accessed internally from the class in which it is defined.

Làm thế nào chúng ta có thể truy cập các thành viên tư nhân của một lớp trong PHP?

Nhưng chúng ta có thể dễ dàng truy cập các biến riêng tư của một lớp bằng cách xác định các chức năng công cộng trong lớp.Chúng ta có thể tạo các chức năng riêng biệt để đặt giá trị thành các biến riêng tư và để nhận giá trị của chúng.Các chức năng này được gọi là getters và setters.

Bài Viết Liên Quan

Chủ Đề