2013-04-27 3 views
1

Я хочу сделать такую ​​вещь в php: Я хочу иметь родительский класс с именем «item» и кучу дочерних классов, таких как «меч», «доспехи» и т. Д. Я могу назвать просто:php - построить как родительский, так и дочерний

$some_sword = new sword($id) ; 

Но я также хочу сделать что-н, как это:

$some_sword = new item("sword",$id) ; 

И я хочу оба кода делает он такой же эффект. $ some_sword должен быть одним и тем же классом в обоих направлениях!

ответ

3

новое ключевое слово всегда будет возвращать экземпляр рассматриваемого класса. однако вы можете использовать статический метод в родительском объекте для возврата объекта дочернего класса (или любых объектов, если на то пошло).

class Item 
{ 
    public function __construct($id) 
    { 
     //Whatever 
    } 

    /** 
    * Gets the object requested and passes the ID 
    * 
    * @param string object to return 
    * @param integer id 
    * @return object 
    */ 
    public static function get($itemtype, $id) 
    { 
     $classname = ucfirst($itemtype); 
     return new $classname($id); 
    } 
} 

class Sword extends Item 
{ 
    public function __construct($id) 
    { 
     //Whatever 
    } 
} 

class Armor extends Item 
{ 
    public function __construct($id) 
    { 
     //Whatever 
    } 
} 

// Client Code 
$some_sword = Item::get('sword', 1); 
$some_armor = Item::get('armor', 2); 
+0

отредактировано, чтобы исправить ошибку в методе GET (! Я действительно должен проверить свой код, прежде чем я его) –

+0

Спасибо, это, кажется, достаточно подходят: D –

+0

Как вы думаете, вы могли бы сделать его приняли ответ? это означало бы ужасно много :) –