แนะนำตัว
คุณลักษณะของการเชื่อมโยงแบบสแตติกช่วงปลายใน 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 ''