Cách truy cập tài sản riêng trong php

Tham gia bản tin của tôi

Vấn đề rất đơn giản. khởi tạo ReflectionClass hoặc ReflectionProperty chậm và chậm, ý tôi là rất chậm

Lý do cho nghiên cứu này là tôi đang cố gắng tối ưu hóa "bộ khử nước" để hoạt động với các tập dữ liệu lớn hơn mà vẫn giữ chi phí khởi tạo thấp


PHP5. 4 để giải cứu

PHP5. 4 đi kèm với API mới cho Đóng cửa, đó là

yummy;
}
1

yummy;
}
1 về cơ bản cho phép bạn lấy một thể hiện của một bao đóng với phạm vi của một đối tượng hoặc lớp nhất định. Khéo léo. Về cơ bản, điều đó giống như thêm API vào các đối tượng hiện có

Hãy phá vỡ một số đóng gói OOP để phù hợp với nhu cầu của chúng tôi

Các kỹ thuật để truy cập các thành viên riêng tư đã được giải thích trong hướng dẫn sử dụng PHP, nhưng dù sao thì tôi cũng sẽ làm một ví dụ đơn giản hóa

Đây là những gì bạn phải làm để đánh cắp

yummy;
}
3 từ đối tượng sau

Trước hết, hãy xác định một bao đóng để đọc thuộc tính như thể chúng ta có quyền truy cập vào nó

yummy;
}

Hãy sử dụng nó để đánh cắp một số thứ

yummy;
}
4 từ
yummy;
}
5

Đáng buồn thay, điều này sẽ dẫn đến việc

yummy;
}
6 bị bắt với một lỗi nghiêm trọng giống như sau

Fatal error: Cannot access private property Kitchen::$yummy in [...] on line [...]

Hãy sử dụng

yummy;
}
1 để làm cho tên trộm của chúng ta thông minh hơn

yummy;
}
1

Thành công. Bây giờ chúng ta có thể đến

yummy;
}
8


Thay đổi phạm vi đóng so với. Sự phản xạ. hiệu suất

Làm thế nào để kỹ thuật này so sánh với

yummy;
}
9?

Tôi đã xây dựng một điểm chuẩn đơn giản để lập hồ sơ bước "thiết lập" cho thủ thuật này qua hơn 100000 lần lặp lại

yummy;
}
4
yummy;
}
5

Trên PHP 5 mới được biên dịch. 5 (Ubuntu 13. 04 AMD64), tập lệnh đầu tiên mất khoảng 0. 325 giây để chạy, trong khi cái thứ hai yêu cầu 0. 658 giây

Phản xạ ở đây chậm hơn nhiều

Tuy nhiên, điều đó hoàn toàn không thú vị, vì sẽ không có ai khởi tạo 100000 thuộc tính phản chiếu hoặc ít nhất là tôi không thể tìm ra lý do chính đáng để làm điều đó

Điều có vẻ thú vị hơn là cách so sánh việc truy cập các thuộc tính. Tôi cũng đã lập hồ sơ đó

yummy;
}
6
yummy;
}
7

Tập lệnh đầu tiên mất ~ 0. 110 giây để chạy, trong khi cái thứ hai cần ~ 0. 199 giây

Chúng ta thực sự nhanh hơn nhiều so với sự phản chiếu. Ấn tượng


Truy cập các thuộc tính lớp riêng bằng tham chiếu

Thực sự có một lợi thế lớn khi sử dụng Closure thay vì ReflectionProperty, đó là giờ đây bạn có thể truy xuất một thuộc tính riêng tư bằng cách tham chiếu

yummy;
}
8

Một bản tóm tắt trình đọc thuộc tính chung

Với tất cả các khái niệm mới này, chúng ta có thể viết một bộ truy cập rất đơn giản cho phép chúng ta đọc bất kỳ thuộc tính nào của bất kỳ đối tượng nào

yummy;
}
0

Đây là ví dụ làm việc

Đó là nó. truy cập bất kỳ thuộc tính nào, ở bất kỳ đâu và thậm chí bằng tham chiếu. Thành công. Chúng tôi đã phá vỡ các quy tắc một lần nữa

Tôi sẽ không đề cập đến phần "viết thuộc tính", cũng như không xử lý các thuộc tính riêng được kế thừa, vì đó chỉ là chi tiết của thủ thuật cơ bản cần nhiều mã hơn và không thú vị đối với chúng tôi


Phần kết luận

Tuy nhiên, một lần khác, PHP cho thấy tất cả các khía cạnh tốt nhất và tồi tệ nhất của nó. Đó là một ngôn ngữ khủng khiếp với cú pháp khủng khiếp, nhưng nó cho phép chúng tôi viết mã tuyệt vời và vượt qua vô số giới hạn ngôn ngữ bằng cách chỉ cung cấp các tính năng mới và tuyệt vời ở mỗi bản phát hành

Bản thân tôi sẽ không sử dụng kỹ thuật này, nhưng thật thú vị khi đi sâu vào nó và nó sẽ trở nên hữu ích trở lại nếu tôi cần tham chiếu đến các thành viên lớp riêng tư/được bảo vệ trong các dự án proxy điên rồ của mình

Tôi nên thêm một tuyên bố từ chối trách nhiệm. sử dụng cẩn thận

sai sót

Trong phiên bản đầu tiên của bài báo được xuất bản 2013-07-10, tôi thực sự đã nói rằng Reflection nhanh hơn. điều đó không đúng và là kết quả của một lỗi mà tôi đã mắc phải khi chạy thử nghiệm, vì tôi đang chạy phiên bản PHP có vô số tiện ích mở rộng ảnh hưởng đến kết quả

Tôi đã tạo một máy ảo với phiên bản sạch 5. 5 PHP để có kết quả chính xác, điều này chứng tỏ rằng Reflection thực sự chậm hơn bao đóng trong mọi trường hợp

Làm cách nào để truy cập các thành viên riêng tư bên ngoài lớp học trong PHP?

Như bạn có thể thấy, privateMethod là một phương thức riêng tư và nếu chúng ta muốn truy cập nó bên ngoài lớp như vậy, chúng ta sẽ gặp lỗi nghiêm trọng. Để giải quyết vấn đề này, chúng ta có thể sử dụng lớp ReflectionMethod dựng sẵn của PHP lớp này có thể cung cấp rất nhiều thông tin về lớp. Và cũng có thể "thiết kế ngược" mọi thứ cho chúng tôi.

Làm cách nào để gọi một phương thức riêng tư trong PHP?

Gọi các phương thức PHP riêng tư/được bảo vệ .
lớp Foo { thanh hàm riêng (). chuỗi { trả về 'baz'; .
$reflectionClass = new ReflectionClass(Foo. lớp);

Làm cách nào để truy cập một phương thức được bảo vệ trong PHP?

Không thể áp dụng công cụ sửa đổi quyền truy cập được bảo vệ cho các lớp học. 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 yêu cầu hoặc một biến là được bảo vệ bằng cách đặt trước nó bằng từ khóa “được bảo vệ” .

Làm cách nào để khai báo biến riêng trong PHP?

Cách tốt nhất để khai báo một biến riêng trong Lớp PHP là tạo chúng phía trên phương thức __Construction , theo quy ước, bạn có thể bắt đầu . e $_private_variable) để cho các lập trình viên khác đang đọc mã của bạn biết ngay rằng đó là một biến riêng tư, tuyệt vời.