สำนักวิทยบริการและเทคโนโลยีสารสนเทศ (สวส.)

Office of Academic Resources and Information Technology

PHP OOP Static Method and Properties

static อีกหนึ่งคีย์เวิร์ดที่สำคัญของการเขียน oop ซึ่งการนำไปใช้งานนั้นมีประโยชน์อย่างมาก หากนำไปใช้ให้ถูกวิธี
และการเรียกใช้งานก็จะแตกต่างออกไปจากเดิม ๆ ที่เราเคยเรียนใช้งาน ซึ่งเราสามารถเรียกใช้งานตัวแปรหรือเมธอดเหล่านี้ได้โดยตรงโดยไม่ต้องประกาศ instance แต่อย่างใด

โดยปกติเราจะเรียกใช้งาน Object โดยผ่านการประกาศ instance และเรียกใช้งานเมธอดอีกที เช่น
 

 
  1.  // ประกาศ instance
  2.  $Object = new MyClass;
  3.  
  4.  // เรียกใช้งานเมธอด
  5.  $Object->MyMethod();
  6.  


   แต่หากตัวแปรหรือเมธอดเหล่านั้นเป็น static เราจะสามารถเรียกใช้งานจากภายนอกคลาสโดยผ่านเครื่องหมาย :: ได้เลย และหากต้องการเรียกใช้งานตัวแปรหรือเมธอด static ภายในคลาสต้องใช้คีย์เวิร์ด self แทน 

  ส่วนการสร้าง visibility ของเมธอด(public, protected, private) นั้นหากเรียกโดยใช้เครื่องหมาย :: จะ
สามารถเรียกใช้งานได้เฉพาะ public method เท่านั้น
  
ดูตัวอย่างการเขียนและเรียกใช้งาน
 

 
  1. <?php
  2. class MyClass {
  3.     public static $Color;
  4.    
  5.     function MyMethod1() {
  6.         echo "MyMethod1";
  7.     }
  8.    
  9.     protected static function MyMethod2() {
  10.         echo "MyMethod2";
  11.     }
  12.    
  13.     private static function MyMethod3() {
  14.         echo "MyMethod3";
  15.     }
  16.    
  17.     function TakePropertyColor() {
  18.         echo self::$Color;
  19.     }
  20.    
  21.     function TakeMethodMyMethod3(){
  22.         self::MyMethod3();
  23.     }
  24.    
  25.     static function TakeMethodMyMethod3ByInstance() {
  26.         $this->MyMethod3();
  27.     }
  28. }
  29.  
  30. class SubClass extends MyClass {
  31. }
  32. ?>


  ส่วนสำหรับการเรียกใช้งานตัวแปรหรือเมธอด ก็จะสามารถเรียกใช้ได้เลยตามหลักการว่าไว้ คือเรียกใช้งานจากภายนอก
โดยการผ่านเครื่องหมาย :: ได้เฉพาะ public เท่านั้น
 ดังนั้นเราก็จะสามารถเข้าถึง method เหล่านี้
 

 
  1.  
  2.  MyClass::MyMethod1();
  3.  MyClass::TakeMethodMyMethod3ByInstance();


แต่การเรียกใช้งานบรรทัดนี้  MyClass::TakeMethodMyMethod3ByInstance(); จะเกิด Fatal Error ถามว่าทำไมจึงเป็นเช่นนี้ เนื่องจากการเขียนคลาสด้านบน มีการใช้ $this อยู่เอง เพราะ $this จะเกิดก็ต่อเมื่อมีการประกาศ instance($obj = new MyClass) เท่านั้น  

หากจะแก้ไข ก็ต้องเปลี่ยนเป็น self ก็จะสามารถทำงานได้ปกติ ตามหลักการที่อธิบายไว้ด้านบน ลองย้อนกลับไปอ่านใหม่ได้ครับ
php
ส่วนการเรียกใช้งานจาก extending class ก็จะเหมือนกับหลักการเรียกใช้งานจากภายนอกคลาสของ main class แต่ subclass ก็จะมองเห็นเฉพาะคลาส public และ protected method ตามหลักของ visibility 

ดังนั้นก็จะเห็นเมธอดทั้งหมด ยกเว้นเมธอด MyMethod3 เท่านั้น แต่หากจะเรียกใช้งานตามกฏของ Static method แล้วก็จะเห็นเฉพาะ  MyMethod1(); และ TakeMethodMyMethod3ByInstance(); เหมือนกัน main class ถึงแม้ว่า MyMethod2() จะเป็น protected method ก็ตาม

ดังนั้น การตั้งชื่อเมธอดในการทำงาน static method ให้ทำให้เป็น public นะครับจะได้ไม่งง ในภายหลัง 

จาก : http://www.worldphp.com/