在PHP中,我們會經常使用對象的概念,對象往往都會有一些成員變量和方法。在定義類的時候,我們常常需要用到self和$this。其中,self是指向類本身的指針,而$this則是指向當前對象的指針。但是,在某些情況下,我們并不想讓$this指向當前對象,這個時候,就可以用到new self。
舉個例子,如果我們有這樣一個父類:
class ParentClass { public function getName() { return "ParentClass"; } }
現(xiàn)在,我們定義了一個子類ChildClass,其中有一個成員方法getSelfName():
class ChildClass extends ParentClass { public function getSelfName() { return self::getName(); } }
那么,getSelfName()方法會返回什么呢?如果我們在子類中使用$this->getName(),那么返回的就是子類的名字"ChildClass"。但是,如果我們使用self::getName(),那么就會返回父類的名字"ParentClass"。因為self指向類本身,而子類繼承了父類的getName()方法,所以在子類中調用self::getName()實際上就是在調用父類的方法。
除此之外,我們還可以在類中的靜態(tài)方法中使用new self。比如:
class ExampleClass { public static function getNewObject() { return new self(); } }
在這個例子中,getNewObject()方法會返回一個ExampleClass的實例。如果我們在這個方法中使用new ExampleClass(),那么返回的也是一個ExampleClass的實例。但是,如果我們想讓這個方法可以被子類繼承并重寫,同時又想在子類中返回一個子類自身的實例,那么就可以使用new self()的方式。比如:
class ChildExampleClass extends ExampleClass { public static function getNewObject() { return new self(); } }
在這個例子中,ChildExampleClass繼承了ExampleClass,并重寫了getNewObject()方法,方法中使用了new self()的方式返回一個子類自身的實例。
總結一下,new self可以用來在靜態(tài)和非靜態(tài)方法中創(chuàng)建指向當前類的新對象,而不依賴于類名。