Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

PHP ปลายคงที่ Bindings


แนะนำตัว

คุณลักษณะของการเชื่อมโยงแบบสแตติกช่วงปลายใน PHP นี้ใช้เพื่ออ้างอิงคลาสในการสืบทอดแบบคงที่ เมื่อมีการเรียกเมธอดสแตติก ชื่อของคลาสจะแนบมากับโอเปอเรเตอร์ความละเอียดขอบเขต (::) ในขณะที่ในกรณีของเมธอดอินสแตนซ์อื่น เราจะเรียกพวกมันโดยใช้ชื่อของอ็อบเจ็กต์ static::จะไม่ได้รับการแก้ไขโดยใช้คลาสที่กำหนดเมธอด แต่จะถูกคำนวณโดยใช้ข้อมูลรันไทม์แทน การอ้างอิงแบบคงที่ไปยังคลาสปัจจุบันได้รับการแก้ไขโดยใช้คลาสที่เป็นของฟังก์ชัน ไม่ใช่ตำแหน่งที่กำหนดไว้

ตัวอย่าง

ในโค้ดต่อไปนี้ คลาสพาเรนต์เรียก ethod คงที่ด้วย self::prefix วิธีเดียวกันเมื่อถูกเรียกด้วยคลาสลูกไม่ได้อ้างถึงชื่อคลาสลูกเนื่องจากไม่ได้รับการแก้ไข

ตัวอย่าง

<?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();
?>

ผลลัพธ์

ผลลัพธ์แสดงว่ามีการส่งกลับชื่อของคลาสหลักอีกครั้ง

name of class :test1

การใช้ static::แทน self::สร้างการผูกล่าช้าที่รันไทม์

ตัวอย่าง

<?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();
?>

โค้ดด้านบนจะคืนค่าชื่อของคลาสย่อยตามที่คาดไว้

ผลลัพธ์

name of class :test2

การใช้ static::ในบริบทที่ไม่คงที่

เมธอดส่วนตัวในพาเรนต์ถูกคัดลอกไปยังชายด์ ดังนั้นขอบเขตจะยังคงเป็นพาเรนต์

ตัวอย่าง

<?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();
?>

ผลลัพธ์

ผลลัพธ์แสดงผลดังต่อไปนี้

name of class :test1
name of class :test1

อย่างไรก็ตาม เมื่อวิธีการหลักถูกแทนที่ ขอบเขตจะเปลี่ยนไป

ตัวอย่าง

class test3 extends test1{
   private function name() {
      /* original method is replaced; the scope of name is test3 */
   }
}
$t3 = new test3();
$t3->name();

ผลลัพธ์

ผลลัพธ์แสดงข้อยกเว้นต่อไปนี้

PHP Fatal error: Uncaught Error: Call to private method test3::name() from context ''