เมื่อคุณใช้self
เพื่ออ้างถึงสมาชิกชั้นเรียนคุณกำลังหมายถึงคลาสที่คุณใช้คีย์เวิร์ด ในกรณีนี้คุณระดับกำหนดคุณสมบัติการป้องกันแบบคงที่เรียกว่าFoo
$bar
เมื่อคุณใช้self
ในFoo
คลาสเพื่ออ้างถึงคุณสมบัติคุณกำลังอ้างถึงคลาสเดียวกัน
ดังนั้นหากคุณพยายามใช้self::$bar
ที่อื่นในFoo
ชั้นเรียนของคุณแต่คุณมีBar
คลาสที่มีค่าคุณสมบัติต่างกันจะใช้Foo::$bar
แทนBar::$bar
ซึ่งอาจไม่ใช่สิ่งที่คุณตั้งใจ:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
เมื่อคุณเรียกใช้เมธอดstatic
คุณกำลังเรียกใช้คุณลักษณะที่เรียกว่าการโยงแบบคงที่ในช่วงปลาย (แนะนำใน PHP 5.3)
ในสถานการณ์ข้างต้นการใช้self
จะให้ผลลัพธ์เป็นFoo::$bar
(1234) และการใช้static
จะให้ผลลัพธ์เป็นBar::$bar
(4321) เนื่องจากด้วยstatic
ตัวแปลจะคำนึงถึงการประกาศซ้ำภายในBar
คลาสระหว่างรันไทม์
โดยทั่วไปคุณจะใช้การเชื่อมแบบคงที่ในช่วงปลายสำหรับเมธอดหรือแม้แต่คลาสเองแทนที่จะใช้คุณสมบัติเนื่องจากคุณมักจะไม่ประกาศคุณสมบัติซ้ำในคลาสย่อย ตัวอย่างของการใช้static
คีย์เวิร์ดสำหรับการเรียกใช้คอนสตรัคเตอร์แบบผูกปลายสามารถพบได้ในคำถามที่เกี่ยวข้องนี้: ตัวใหม่กับสแตติกใหม่
อย่างไรก็ตามนั่นไม่ได้กีดกันการใช้static
กับคุณสมบัติเช่นกัน