Computer >> Máy Tính >  >> Lập trình >> PHP

Các ràng buộc tĩnh muộn trong PHP

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 ''