Hướng dẫn dùng late binding trong PHP

Từ phiên bản PHP 5.3.0, PHP có một đặc điểm gọi là "Late static bindings" được dùng để tham chiếu tới lớp được gọi trong trường hợp thừa kế tĩnh.

Cụ thể hơn, late static bindings làm việc bằng cách lưu trữ tên lớp trong "lời gọi không chuyển tiếp" cuối. Trong trường hợp gọi phương thức tĩnh thì đó là tên tường minh của chuỗi [thường nó nằm bên trái của toán tử ::]; trong trường hợp gọi phương thức không tĩnh thì đó là lớp của đối tượng. Một "lời gọi chuyển tiếp" là một lời gọi tĩnh như self::, parent::, static::, hoặc lời gọi tới phương thức forward_static_call[]. Phương thức get_called_class[] có thể được sử dụng để truy xuất một chuỗi với tên lớp được gọi và sử dụng static::.

Gọi là "late static bindings" là bởi vì xuất phát từ thực tế rằng static:: sẽ không được giải quyết bằng cách sử dụng lớp mà trong đó phương thức được định nghĩa thay thế cho việc tính toán sử dụng thông tin runtime. Nó cũng được gọi là "static binding" bởi vì nó có thể được sử dụng [không giới hạn] cho việc gọi phương thức tĩnh.

Giới hạn của self:: ¶

static tham chiếu tới lớp hiện tại như self:: hay __CLASS__ được giải quyết bằng cách sử dụng lớp chứa phương thức tương ứng được định nghĩa:

Ví dụ 1: Sử dụng self::

Ví dụ trên sẽ in ra:

A

Sử dụng Late Static Binding

Late static bindings sẽ cố gắng khắc phục giới hạn bằng cách sử dụng một từ khóa để tham chiếu tới lớp khởi tạo được gọi khi runtime. Về cơ bản thì từ khóa  này cho phép bạn tham chiếu tới lơp B từ phương thức test[] ở ví dụ trên bằng cách không sử dụng từ khóa new mà sử dụng static.

Ví dụ 2: Sử dụng static::

Ví dụ trên sẽ in ra:

B

Lưu ý:

Trong trường hợp non-static thì lớp được gọi sẽ là lớp tương ứng với đối tượng thể hiện. Vì $this-> sẽ cố gắng gọi các phương thức private nên việc sử dụng static:: có thể cho những kết quả khác nhau. Một điều nữa là static:: chỉ có thể tham chiếu tới những thuộc tính tĩnh.

Ví dụ 3: Sử dụng static:: trong trường hợp non-static

Ví dụ trên sẽ in ra:

success!
success!
success!


Fatal error:  Call to private method C::foo[] from context 'A' in /tmp/test.php on line 9

Lưu ý:

Phạm vi giải quyết của Late static bindings sẽ dừng lại sau khi giải quyết hoàn chỉnh một lời gọi tĩnh mà không có fallback. Mặt khác, lời gọi tĩnh sử dụng từ khóa như parent:: hoặc self:: sẽ chuyển tiếp tới thông tin gọi.

Ví dụ 4: Lời gọi chuyển tiếp và không chuyển tiếp.

Ví dụ trên sẽ in ra:

Chủ Đề