GORAGOD.com

freelance, web developer, web designer, hosting, domain name

ความแตกต่างระหว่าง self และ static

ทั้ง self และ static เป็นคีย์เวอร์ดสำหรับการอ้างถึงตัวเอง (เช่นเดียวกันกับ $this) ทั้งคู่

ใน PHP 5.3 static ถูกเรียกว่าเป็น Late Static Bindings โดยที่ self และ static มีข้อแตกต่างในการใช้งานกันอยู่เล็กน้อย ดูจากตัวอย่างกันเลยครับ
class A
{

    public static function who()
    {
        echo __CLASS__;
    }

    public static function test()
    {
        self::who();
    }
}

class B
{

    public static function who()
    {
        echo __CLASS__;
    }

    public static function test()
    {
        static::who();
    }
}

// ------------------------------------------------------------

class C extends A
{

    public static function who()
    {
        echo __CLASS__;
    }
}

class D extends B
{

    public static function who()
    {
        echo __CLASS__;
    }
}

C::test();
D::test();

คลาส A (และ C) จะมีการเรียกใช้ method who ด้วย self และ คลาส B (และ D) จะมีการเรียก method ด้วย static ได้ผลลัพท์ตามด้านล่าง
// C::test()
A

// D::test();
D

จะเห็นว่าทั้งสองแบบให้ผลลัพท์ที่ไม่เหมือนกัน
  • คีย์เวอร์ด self จะมีการส่งต่อ (forwarding call) ไปยังคลาสแม่ครับ ดังนั้นในกรณีของคลาส C ซึ่งสืบทอดมาจาก คลาส A การอ่านค่าจึงได้ค่าของคลาสแม่มา
  • คีย์เวิร์ด static จะไม่มีการส่งต่อ (non-forwarding call) ไปยังคลาสแม่ ดังนั้นในกรณีของคลาส D จึงอ่านค่าได้คลาสของตัวเองมา
อีกสักตัวอย่างนะครับ ในกรณีที่เป็นตัวแปร
class A
{
    protected static $property = 'Class A';

    public static function test()
    {
        echo static::$property;
    }
}

class B
{
    protected static $property = 'Class B';

    public static function test()
    {
        echo self::$property;
    }
}

// ------------------------------------------------------------

class C extends A
{
    protected static $property = 'Class C';
}

class D extends B
{
    protected static $property = 'Class D';
}

C::test();
D::test();

ผลลัพท์
// C::test();
Class C

// D::test();
Class B
0SHAREFacebookLINE it!
^