Giới thiệu
Tính năng này của liên kết tĩnh muộn trong PHP được sử dụng để tái tạo lớp trong kế thừa tĩnh. Khi các phương thức tĩnh được gọi, tên của lớp được đính kèm với toán tử phân giải phạm vi (::) trong khi trong trường hợp các phương thức thể hiện khác, chúng ta gọi chúng bằng cách sử dụng tên của đối tượng. Static ::sẽ không được giải quyết bằng cách sử dụng lớp mà phương thức được định nghĩa, thay vào đó sẽ được tính toán bằng cách sử dụng thông tin thời gian chạy. Các tham chiếu tĩnh đến lớp hiện tại được giải quyết bằng cách sử dụng lớp mà hàm thuộc về, không phải nơi nó được định nghĩa
Ví dụ
Trong đoạn mã sau, lớp cha gọi tĩnh ethod với tiền tố self ::. Phương thức tương tự khi được gọi với lớp con không tham chiếu đến tên lớp con vì nó không được giải quyết
Ví dụ
<?php class test1{ public static $name="Raja"; public static function name(){ echo "name of class :" . __CLASS__; } public static function getname(){ self::name(); } } class test2 extends test1{ public static function name(){ echo "name of class :" . __CLASS__; } } test2::getname(); ?>
Đầu ra
Kết quả cho thấy rằng vẫn còn kỳ vọng, tên của lớp cha được trả về
name of class :test1
Sử dụng static ::thay vì self ::tạo liên kết muộn trong thời gian chạy
Ví dụ
<?php class test1{ public static function name(){ echo "name of class :" . __CLASS__; } public static function getname(){ static::name(); } } class test2 extends test1{ public static function name(){ echo "name of class :" . __CLASS__; } } test2::getname(); ?>
Đoạn mã trên bây giờ trả về tên của lớp con như mong đợi
Đầu ra
name of class :test2
Sử dụng static ::trong ngữ cảnh không tĩnh
Phương thức private trong cha được sao chép sang con, do đó phạm vi của nó sẽ vẫn là cha
Ví dụ
<?php class test1{ private function name(){ echo "name of class :" . __CLASS__ ."\n"; } public function getname(){ $this->name(); static::name(); } } class test2 extends test1{ // } $t2=new test2(); $t2->getname(); ?>
Đầu ra
Đầu ra hiển thị kết quả sau
name of class :test1 name of class :test1
Tuy nhiên, khi phương thức cha bị ghi đè, phạm vi của nó sẽ thay đổi
Ví dụ
class test3 extends test1{ private function name() { /* original method is replaced; the scope of name is test3 */ } } $t3 = new test3(); $t3->name();
Đầu ra
Kết quả hiển thị ngoại lệ sau
PHP Fatal error: Uncaught Error: Call to private method test3::name() from context ''