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