__call magic создание новых классов в PHP - PullRequest
3 голосов
/ 07 сентября 2010

Я использую магию __call в моем коде mvc для создания автозагрузки фреймворка форм, но я столкнулся с проблемой, я надеюсь, у кого-нибудь из здесь есть обходной путь.

__callмагия принимает два параметра: $ methodName и $ arguments.Аргументы возвращаются как массив аргументов, которые вы вызвали.Обычно эта функция вызывается для методов, которые вы можете сделать как таковые, поэтому передайте эти аргументы в функцию:

call_user_func_array($methodName, $arguments);

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

Это код, который я использую atm:

public function __call($method, $args){

    return $this->init_element(new $method($args['name'], $args['value'], $args['opts']));

}

Что, если у меня было 4 аргумента, чтобы передать хотя?Есть ли способ, которым я могу заставить его динамически заполнить конструктор так же, как вы можете для функции, использующей call_user_func_array ()?

Я мог бы использовать для этого функцию attribute (), но мне бы очень хотелось иметь возможностьсделать это, как я могу с функциями.

Заранее спасибо,

Ответы [ 2 ]

0 голосов
/ 07 сентября 2010

Использовать классы отражения PHP: (http://php.net/manual/en/class.reflectionclass.php)

$obj = new ReflectionClass( $classname );

тогда

$ins = $obj->newInstanceArgs( $arguments );

или

$ins = $obj->newInstance( );

0 голосов
/ 07 сентября 2010

Где-то в Интернете я видел следующее:

 call_user_func_array(array($obj, '__construct'), $args);
...