PHP中的static與Java中的static不太一樣,PHP中的static是用來保留變數的值

例如

function test() {
    static $count = 0;
    return $count++;
}

print test();
print test();
print test();

上面的範例,每次呼叫test()函式時,count變數會持續累加(可以應用在遞迴上面)

另外在物件的應用上,最典型的就是Singleton pattern(static將instance保留)

class TEST {
    private static $_instance = null;
    private static $_count = 0;
    private function __construct(){
        self::$_count++;
    }
    public static function getInstance() {
        if( self::$_instance === null ){
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    public function getCount() {
        return self::$_count;
    }
}

//同一個instance
$test = TEST::getInstance();
print $test -> getCount(); // print 1
$test2 =  TEST::getInstance();
print $test2 -> getCount();// print 1

最後還有一點要注意,使用static::呼叫和用self::呼叫是不同的
如果在有繼承方法的狀況下,self::是呼叫父類別,而static::才是呼叫本身
範例

class A {
    public static function getSelf() {
        return new self();
    }

    public static function getStatic() {
        return new static();
    }
}

class B extends A {}
class C extends B {}

echo get_class(B::getSelf());   // A
echo get_class(C::getSelf());   // A
echo get_class(C::getStatic()); // C
echo get_class(B::getStatic()); // B
echo get_class(A::getStatic()); // A
Categories: PHP