เมื่อคุณใช้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กับคุณสมบัติเช่นกัน