PHP Отражение создает экземпляр класса (объект) с массивом аргументов, передаваемых конструктору - PullRequest
0 голосов
/ 24 января 2020

Как создать экземпляр класса Bar с помощью PHP Reflection?

Код класса:

class Bar
{
    private $one;
    private $two;

    public function __construct($one, $two) 
    {
        $this->one = $one;
        $this->two = $two;
    }

    public function get()
    {
        return ($this->one + $this->two);
    }
}

У меня закончились идеи, некоторые мои догадки:

$class = 'Bar';
$constructorArgumentArr = [2,3];
$reflectionMethod = new \ReflectionMethod($class,'__construct');
$object = $reflectionMethod->invokeArgs($class, $constructorArgumentArr);

echo $object->get(); //should echo 5

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

Я попытался передать ноль как $class в качестве первого аргумента после логики c, что конструктор вызывается в то время, когда еще нет объекта, но я получил: "ReflectionException: Попытка вызвать non stati c method ... "

Если в Reflection нет решения, я приму любую другую (ie php функция).

Ссылки:
Метод отражения
ReflectionMethod :: invokeArgs

1 Ответ

1 голос
/ 24 января 2020

Вы можете использовать ReflectionClass и ReflectionClass :: newInstanceArgs

    class Bar
    {
        private $one;
        private $two;

        public function __construct($one, $two) 
        {
            $this->one = $one;
            $this->two = $two;
        }

        public function get()
        {
            return ($this->one + $this->two);
        }
    }

    $args = [2, 3];
    $reflect  = new \ReflectionClass("Bar");
    $instance = $reflect->newInstanceArgs($args);
    echo $instance->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...