Аналог call_user_func_array для создания объекта

ChAk

Новичок
Если какой то аналог call_user_func_array или какой то хитрый прием как создать объект с передачей в конструктор параметров в виде массива?
PHP:
// с функциями все просто
function test($a1, $a2) {
    var_dump($a1, $a2);
}
call_user_func_array('test', array(1,2));

// а как быть с конструктором класса?
class Test {
  function __constructor($a1, $a2) {}
}
 

fixxxer

К.О.
Партнер клуба
PHP:
    /**
     * @param string $class_name
     * @param array $ctor_args
     * @return object instance of $class_name
     */
    public static function construct($class_name, $ctor_args) {
        return (new \ReflectionClass($class_name))->newInstanceArgs((array)$ctor_args);
    }
 
  • Like
Реакции: ChAk

ChAk

Новичок
fixxxer, спасибо то что нужно.
Когда задавал вопрос был почти уверен что это не возможно, так как заглядывал в доки по Reflection но не заметил этой функции.
 

riff

Новичок
А я чего-то не понял почему так сложно?
Почему не call_user_func('\abc\Foo::test', array(params)); ?
Код:
public static function test($params) {
  return new self(params);
}
 

ChAk

Новичок
riff, нет вопрос был про конструктор. С конструктором такой фокус не пройдет
 

hell0w0rd

Продвинутый новичок
оО... вот навыдумывали)
PHP:
class Test
{
    public function __construct($word)
    {
        echo 'hello ' . $word;
    }
}

$className = 'Test';

$class = new $className('world!');
 

Вурдалак

Продвинутый новичок
PHP:
<?php

function getInstanceWithoutConstructor($class) {
    return unserialize(sprintf('O:%d:"%s":0:{}', strlen($class), $class));
}

call_user_func_array(array(getInstanceWithoutConstructor('Test'), '__construct'), $params);
:p
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
 if(($n=func_num_args())>1)
                {
                        $args=func_get_args();
                        if($n===2)
                                $object=new $type($args[1]);
                        elseif($n===3)
                                $object=new $type($args[1],$args[2]);
                        elseif($n===4)
                                $object=new $type($args[1],$args[2],$args[3]);
                        else
                        {
                                unset($args[0]);
                                $class=new ReflectionClass($type);
                                // Note: ReflectionClass::newInstanceArgs() is available for PHP 5.1.3+
                                // $object=$class->newInstanceArgs($args);
                                $object=call_user_func_array(array($class,'newInstance'),$args);
                        }
                }
ЧЕ ЭТО???
 

Redjik

Джедай-мастер
yii2
PHP:
        if (($n = func_num_args()) > 1) {
            /** @var \ReflectionClass $reflection */
            if (isset($reflections[$class])) {
                $reflection = $reflections[$class];
            } else {
                $reflection = $reflections[$class] = new \ReflectionClass($class);
            }
            $args = func_get_args();
            array_shift($args); // remove $config
            if (!empty($config)) {
                $args[] = $config;
            }
            return $reflection->newInstanceArgs($args);
        } else {
            return empty($config) ? new $class : new $class($config);
        }
 

флоппик

promotor fidei
Команда форума
Партнер клуба
а че, рефлексия вот так вот прям настолько медленнее?
 

Gas

может по одной?
хз, в принципе это один раз написано в библиотечном классе, в который никто никогда не лазит, по-этому думаю микрооптимизации допустимы несмотря на усложнение кода.
 
Сверху