1. 程式人生 > >new self 與 new static 的區別

new self 與 new static 的區別

說明

大概的意思都是例項化當前類
但如果 是繼承關係就會有細微的差別

例子

class root {
    public function static getSelf() {
        return new self;
    }
    public function static getStatic () {
        return nre static;
    }
} 

class child extends root {}

var_dump(get_class(child::getSelf()));
// root
var_dump(get_class(child::getStatic()));
// child
var_dump(get_class(root::getSelf()));
// root
var_dump(get_class(root::getStatic()));
// root

解釋

從上面的例子可以看出 只有第二個顯示了與其他不同的內容
也就是說 在繼承的關係 下 static self 代表了不同的內容

self 表示的是程式碼所在類

static 表示的是外部呼叫的類

例子

class root {
    public static function getSelf() {
        return new self;
        // 無論是當前類還是子類呼叫當前方法 這裡的 self 都表示 root
    }
}

class root {
    public static function getStatic () {
        return new static;
        // 如果是子類的呼叫這裡的static 表示的就是最上層的子類
        // 如果是直接呼叫的當前類 static 就表示 root
    }
}
class foo extends root {}
class bar extends foo {}
var_dump(get_class(bar::getStatic()));
// 這裡輸出 bar