PHP編程中,使用new static();方法創建一個新對象是非常常見的操作。這個方法可以讓你簡單地在類定義中實例化一個對象,所以在開發過程中會經常使用到這個方法。
舉例說明,我們創建一個Animal類和一個Cat類,Cat類擴展Animal類:
class Animal { public static function create() { return new static(); } } class Cat extends Animal { public function say() { echo "Meow!"; } }
在這里我們定義了一個靜態方法create(),在所有子類中使用該方法都會返回該子類的一個實例。這個方法是實現new static()的關鍵所在。在繼承中,子類可以調用父類中的靜態方法,但是可以得到的返回值卻不是在子類中的實例化對象,而是在父類中的對象,它不能夠夠訪問子類中添加的屬性或者方法,那么這個時候我們可以利用new static()方法來構造新的對象。
$cat = Cat::create(); $cat->say(); //輸出 Meow!
在這個例子中,我們首先調用Cat類的create()方法,這個方法返回一個新的Cat實例。這個對象擴展了Animal類,因此可以調用say()方法輸出 "Meow!" 。
另外一個例子,我們創建一個Blog類:
class Blog { public static $site_name = "My Blog"; public static function create_post() { $post_class = get_called_class() . "_Post"; return new $post_class; } public function get_site_name() { return self::$site_name; } } class Article_Post extends Blog { public function get_title() { return "Article Title"; } } class Video_Post extends Blog { public function get_title() { return "Video Title"; } }
在這個例子中,我們定義了一個Blog類,其中有一個create_post()方法,這個方法使用 get_called_class() 函數獲取調用類的類名。然后它通過連接類名和 "_Post" 來構造一個具體的對象類名稱,并且通過這個類名稱來實例化一個新的對象。
$article = Article_Post::create_post(); $video = Video_Post::create_post(); echo $article->get_title(); // 輸出 Article Title echo $video->get_title(); // 輸出 Video Title echo $article->get_site_name(); // 輸出 My Blog echo $video->get_site_name(); // 輸出 My Blog
在這個例子中,我們首先調用Article_Post類的create_post()方法,這個方法通過使用new static()來構造一個新的Article_Post實例。同樣,我們也調用了Video_Post類的create_post()方法。在這兩個新的實例中,我們都能調用到定義在Blog類里的get_site_name()方法。
無論是 Article_Post 還是 Video_Post,都可以從 Blog 繼承其屬性和方法,但是通過調用它們的create_post()方法,它們各自也通過 new static() 實例化了自己。這種設計模式很常見于實現工廠模式等。