Создание дочерних классов из родительского класса (PHP) - PullRequest
8 голосов
/ 29 июня 2009

У меня есть класс с функцией фабричного шаблона:

abstract class ParentObj {
    public function __construct(){ ... }
    public static function factory(){
        //returns new instance
    }
}

Мне нужно, чтобы дети могли вызывать фабричную функцию и возвращать экземпляр вызывающего класса: $child = Child::factory(); и предпочтительно без переопределения фабричной функции в дочернем классе.

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

(я использую PHP 5.2.5, если это имеет значение)

Ответы [ 2 ]

12 голосов
/ 29 июня 2009

Если вы можете перейти на PHP 5.3 ( выпущен 30 июня 2009 ), проверьте поздняя статическая привязка , которая может обеспечить решение:

abstract class ParentObj {
    public function __construct(){}
    public static function factory(){

        //use php5.3 late static binding features:
        $class=get_called_class();
        return new $class;
    }
}


class ChildObj extends ParentObj{

    function foo(){
       echo "Hello world\n";
    }

}


$child=ChildObj::factory();
$child->foo();
0 голосов
/ 30 июня 2009

По моему скромному мнению, то, что вы пытаетесь сделать, не имеет смысла.

Заводской шаблон будет работать так:

abstract class Human {}

class Child extends Human {}
class Fool  extends Human {}

class HumanFactory
{
    public static function get($token)
    {
        switch ($token)
        {
            case 'Kid' : return new Child();
            case 'King': return new Fool();
            default    : throw new Exception('Not supported');
        }
    }
}

$child = HumanFactory::get('Kid');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...