Chính xác những ràng buộc tĩnh muộn trong PHP là gì?Chính xác những ràng buộc tĩnh muộn trong PHP là gì?
Trả lời
Tính đến PHP 5.3.0, PHP thực hiện một tính năng gọi là cuối tĩnh ràng buộc mà có thể được sử dụng để tham khảo các lớp được gọi là trong bối cảnh thừa kế tĩnh.
Kết thúc cố định trễ cố gắng giải quyết giới hạn đó bằng cách giới thiệu từ khóa tham chiếu đến lớp ban đầu được gọi là thời gian chạy. Nó đã được quyết định không giới thiệu một từ khóa mới, nhưng thay vì sử dụng static
đã được bảo lưu.
Chúng ta hãy xem một ví dụ:
<?php
class Car
{
public static function run()
{
return static::getName();
}
private static function getName()
{
return 'Car';
}
}
class Toyota extends Car
{
public static function getName()
{
return 'Toyota';
}
}
echo Car::run(); // Output: Car
echo Toyota::run(); // Output: Toyota
?>
late static bindings
công việc bằng cách lưu trữ các lớp có tên trong "cuộc gọi không chuyển tiếp" cuối cùng. Trong trường hợp các cuộc gọi phương thức tĩnh, đây là lớp được đặt tên rõ ràng (thường là lớp bên trái của toán tử ::); trong trường hợp các cuộc gọi phương thức không tĩnh, nó là lớp của đối tượng.
"Cuộc gọi chuyển tiếp" là một cuộc gọi chuyển tiếp được giới thiệu bởi self::
, parent::
, static::
hoặc, nếu đi lên trong hệ thống phân cấp lớp, forward_static_call()
.
Chức năng get_called_class()
có thể được sử dụng để truy xuất chuỗi có tên của lớp được gọi và static::
giới thiệu phạm vi của nó.
Bạn chắc chắn cần đọc Late Static Bindings trong hướng dẫn sử dụng PHP. Tuy nhiên, tôi sẽ cố gắng cung cấp cho bạn một bản tóm tắt nhanh.
Về cơ bản, từ khóa này tuân theo thực tế là từ khóa self
không tuân thủ các quy tắc thừa kế. self
luôn phân giải tới lớp mà nó được sử dụng. Điều này có nghĩa rằng nếu bạn thực hiện một phương thức trong một lớp cha và gọi nó từ một lớp con, self
sẽ không tham chiếu đến đứa trẻ như bạn mong đợi.
Ràng buộc tĩnh muộn giới thiệu cách sử dụng mới cho từ khóa static
, giải quyết sự thiếu hụt cụ thể này. Khi bạn sử dụng static
, nó đại diện cho lớp mà bạn sử dụng lần đầu tiên, ví dụ: nó 'liên kết' với lớp thời gian chạy.
Đó là hai khái niệm cơ bản đằng sau nó. Cách self
, parent
và static
hoạt động khi static
hoạt động có thể tinh tế, vì vậy thay vì đi sâu vào chi tiết hơn, tôi thực sự khuyên bạn nên nghiên cứu các ví dụ về trang thủ công. Một khi bạn hiểu những điều cơ bản của mỗi từ khóa, các ví dụ là khá cần thiết để xem loại kết quả bạn sẽ nhận được.
Ví dụ:
abstract class Builder {
public static function build() {
return new static;
}
}
class Member extends Builder {
public function who_am_i() {
echo 'Member';
}
}
Member::build()->who_am_i();
Không có hành vi rất rõ ràng:
Mã sau đây tạo 'alphabeta'.
class alpha {
function classname(){
return __CLASS__;
}
function selfname(){
return self::classname();
}
function staticname(){
return static::classname();
}
}
class beta extends alpha {
function classname(){
return __CLASS__;
}
}
$beta = new beta();
echo $beta->selfname(); // Output: alpha
echo $beta->staticname(); // Output: beta
Tuy nhiên, nếu chúng tôi xóa khai báo hàm lớp khỏi lớp beta, chúng tôi sẽ nhận được 'alphaalpha'.
Tôi trích dẫn từ cuốn sách: "PHP Master viết mã cắt cạnh".
Kết buộc tĩnh muộn là tính năng được giới thiệu với php 5.3. Nó cho phép chúng tôi kế thừa các phương thức tĩnh từ một lớp cha và để tham chiếu lớp con được gọi.
Điều này có nghĩa bạn có thể có một lớp trừu tượng với phương pháp tĩnh, và triển khai cụ thể tham khảo các lớp con của bằng tĩnh ::() phương pháp ký hiệu thay vì tự ::() phương pháp.
Hãy thoải mái để có một cái nhìn tại các tài liệu php chính thức cũng như: http://php.net/manual/en/language.oop5.late-static-bindings.php
Ví dụ:
<?php
class Animal {
public static function StaticCall() {
// Parent object invokes its own getAnimalName()
// Child object invokes its own getAnimalName() instead of parent's getAnimalName()
return static::getAnimalName();
}
public static function SelfCall() {
return self::getWeight();
}
private static function getAnimalName(){
return 'Animal <br />';
}
private static function getWeight(){
return '10 kg <br />';
}
}
class Bird extends Animal {
public static function getAnimalName(){
return 'Bird <br />';
}
private static function getWeight(){
return '2 kg <br />';
}
}
echo Animal::StaticCall(); // Animal
echo Animal::SelfCall(); // 10 kg
echo Bird::StaticCall(); // Bird invokes method from own object
echo Bird::SelfCall(); // 10 kg invokes method from parent
Trong đoạn mã trên bạn có thể thấy hai lớp Animal
đó là tầng lớp phụ huynh và Bird
là lớp con. Cả hai số Animal
và Bird
đều có phương thức getAnimalName()
và getWeight()
. Siêu lớp Animal
có hai phương pháp: StaticCall()
và SelfCall()
.
Phương thức StaticCall()
gọi getAnimalName()
bằng cách sử dụng từ khóa static
.
Phương thức SelfCall()
gọi getWeight()
bằng cách sử dụng từ khóa self
.
Câu hỏi mà chúng tôi hiện có là: trong đó ngữ cảnh là getAnimalName()
được thực thi?
Câu trả lời: static::getAnimalName()
xác định ngữ cảnh và gọi phương thức trong ngữ cảnh đó.
Nếu bạn gọi Bird::StaticCall()
mã sẽ thực hiện StaticCall()
có trong Animal
. Sau đó, static::getAnimalName()
sẽ gọi và thực hiện từ Bird
phương thức getAnimalName()
.
Điều này khác với self::
, vì self::
luôn gọi phương pháp này trong đối tượng self
được định nghĩa trong. Vì vậy, nếu self::getWeight()
được định nghĩa trong đối tượng Animal
trong phương pháp SelfCall()
và Bird::SelfCall()
sẽ được gọi sau đó self::getWeight()
gọi getWeight()
trong bối cảnh của đối tượng Animal
.
Nhìn vào từ "lý do tại sao tôi nên sử dụng tính năng này?" quan điểm, về cơ bản nó là một cách để thay đổi bối cảnh mà từ đó phương thức tĩnh đang được hiểu/chạy.
Với self
, ngữ cảnh là ngữ cảnh mà bạn đã xác định phương thức ban đầu. Với static
, đó là số bạn đang gọi.
Ví dụ đơn giản nhất để hiển thị sự khác biệt.
Note, tự :: $ c
class A
{
static $c = 7;
public static function getVal()
{
return self::$c;
}
}
class B extends A
{
static $c = 8;
}
B::getVal(); // 7
Cuối tĩnh ràng buộc, lưu ý tĩnh :: $ c
class A
{
static $c = 7;
public static function getVal()
{
return static::$c;
}
}
class B extends A
{
static $c = 8;
}
B::getVal(); // 8
- 1. Giả mạo ràng buộc tĩnh muộn trước php 5.3
- 2. Có thể sử dụng quá nhiều ràng buộc tĩnh muộn trong PHP không?
- 3. Sự cố với sự ràng buộc muộn!
- 4. PATH_INFO chính xác trong PHP là gì?
- 5. Sự khác biệt giữa ràng buộc sớm và muộn là gì?
- 6. PHP __DIR__ được đánh giá thời gian chạy (ràng buộc muộn)?
- 7. Chính xác những gì currentDesign.writeCssincludes bao gồm?
- 8. "Ràng buộc lambda" trong Python là gì?
- 9. Mẫu ràng buộc với ràng buộc là gì?
- 10. Ràng buộc ẩn danh LDAP là gì?
- 11. Chính xác những gì gây nên AVPlayerItemDidPlayToEndTimeNotification?
- 12. Lớp ràng buộc tùy chỉnh không hoạt động chính xác
- 13. Chức năng của session_module_name chính xác của php là gì?
- 14. Chính xác là gì?
- 15. Ràng buộc có nghĩa là gì?
- 16. Ràng buộc dữ liệu là gì?
- 17. Chính xác những gì System.Diagnostics.Process UseShellExecute làm gì?
- 18. Chính xác những gì willMoveToParentViewController: và didMoveToParentViewController: làm gì?
- 19. Ràng buộc với thuộc tính tĩnh
- 20. Cách chính xác để ràng buộc thuộc tính taskid bên trong hoạt động sao chép là gì?
- 21. knockoutjs gửi ràng buộc không xử lý nhập chính xác
- 22. Chính xác những gì nên được đặt trong PYTHONPATH?
- 23. Đóng cửa trong PHP ... những gì, chính xác, là họ và khi nào bạn sẽ cần phải sử dụng chúng?
- 24. Cách chính xác để triển khai AsyncTask là gì? lớp lồng nhau tĩnh hoặc không tĩnh?
- 25. Sự khác nhau giữa ràng buộc tĩnh và động là gì?
- 26. "{Binding Path =.}" Có nghĩa là gì trong WPF ràng buộc?
- 27. Mô hình ràng buộc trong ASP.NET MVC là gì?
- 28. Chính xác "tĩnh" có nghĩa là gì khi khai báo các biến "toàn cục" trong Java?
- 29. Chính xác PLINQ là gì?
- 30. Chính xác là gì `&: capitalize` trong Ruby?
+1 Mô tả của bạn là đơn giản và rõ ràng so với cái được tìm thấy trong PHP thủ công. – Mouli
đây phải là câu trả lời được chấp nhận. nó đơn giản và hữu ích –
tôi thấy bài viết này thực sự hữu ích và mô tả, kiểm tra xem nó ra [link] (https://www.techflirt.com/tutorials/oop-in-php/late-static-binding.html) –