บทนำ
ในคลาส PHP คุณสมบัติและเมธอดที่ประกาศด้วยคีย์เวิร์ด static ไม่สามารถเข้าถึงได้โดยอ็อบเจ็กต์ของมันด้วยตัวดำเนินการ -> จริงๆ แล้ว ไม่ต้องการอ็อบเจ็กต์เพื่อเข้าถึงอินสแตนซ์ของคลาส ความมองเห็น (visibility) เริ่มต้นของรายการ static ในคลาสคือ public
Static Properties (คุณสมบัติสแตติก)
เพื่อเข้าถึงคุณสมบัติสแตติกจากนอกคลาส ต้องใช้ scope resolution operator (::) พร้อมชื่อคลาส ตัวแปรสตริงที่ประเมินเป็นชื่อคลาสก็สามารถให้คุณสมบัติสแตติกได้
<?php class testclass{ static $name="test"; } echo testclass::$name; $var="testclass"; echo $var::$name; ?>
เพื่อใช้คุณสมบัติสแตติกภายในเมธอดใดๆ ของคลาสเดียวกัน ใช้คีย์เวิร์ด self แทนตัวดำเนินการ -> ที่ใช้เข้าถึง instance properties
<?php class testclass{ static $name="test"; public function test(){ echo self::$name; } } $obj=new testclass(); $obj->test(); ?>
คุณสมบัติสแตติกใดๆ ที่ประกาศใน parent class สามารถอ้างอิงได้ภายในเมธอดของ child class โดยใช้คีย์เวิร์ด parent พร้อม scope resolution operator
<?php class testclass{ static $name="test"; public function test(){ echo self::$name; } } class myclass extends testclass{ public function mytest(){ echo parent::$name; } } $obj=new myclass(); $obj->mytest(); ?>
Static Methods (เมธอดสแตติก)
เมื่อเมธอดถูกประกาศเป็น static ตัวแปร pseudo-variable $this จะไม่พร้อมใช้งานให้มัน ดังนั้น instance attributes ของคลาสไม่สามารถเข้าถึงได้ในมัน เมธอดสแตติกถูกเรียกโดยชื่อคลาสพร้อม scope resolution operator
ในตัวอย่างต่อไปนี้ คลาสมีคุณสมบัติสแตติก $count ที่เพิ่มทุกครั้งที่ constructor ถูกดำเนินการ (คือ สำหรับแต่ละอ็อบเจ็กต์) ภายในคลาส มีฟังก์ชันสแตติกที่ดึงค่าของคุณสมบัติสแตติก:
ตัวอย่าง
<?php class testclass{ static $count=0; function __construct(){ self::$count++; } static function showcount(){ echo "count = " . self::$count; } } $a=new testclass(); $b=new testclass(); $c=new testclass(); testclass::showcount(); ?>
ผลลัพธ์
count = 3