Создание классов с параметрами в синглтон-фабрике - PullRequest
1 голос
/ 28 марта 2011

У меня есть класс, который производит синглтон-классы. (Обратите внимание, что для этого вопроса это слишком упрощенный код, например, он не проверяет, существует ли путь к файлу)

class Singleton
{
   public function Load($classname, $params)
   {
      $filepath = 'classes/'.$classname.'.php';
      require_once($filepath);
      return $classname();
   }

}

Теперь скажите, что я хотел передать массив параметров, которые могут различаться по размеру, в конструктор создаваемого класса. Каков наилучший способ сделать это? Я представляю что-то вроде call_user_func_array, но для классов?

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Вы можете достичь некоторых интересных результатов с помощью PHP Reflection library .

function Load( $class, $args )
{
    $reflection = new ReflectionClass( $class );
    $object = $reflection->newInstanceArgs( $args );
    return $object;
}

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

А для базовой документации: $class - это строка с именем класса, который вы хотите создать, а $args - массив аргументов, которые вы передадите методу __construct( ).

0 голосов
/ 28 марта 2011

не проверено, но почему бы просто не загрузить их в конструктор?то есть возврат $classname($params);с вашим конструктором, настроенным как __construct($params = false). Затем вы можете проверить, переданы ли параметры или нет, делая ваши параметры конструктора необязательными ...

Это означает, что все ваши классы должны иметь один и тот же конструктор.

    class Foo {

        public function __construct($params = false) {
            if($params === false) 
                echo 'not passed';
            else 
                print_r($params);
        }
    }

$class = 'Foo';
$foo = new $class(array('one', 'two'));
$foo2 = new $class();

выходы: Массив ([0] => один [1] => два) не передан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...