Отражение PHP и invokeArgs (): принуждение параметра использовать значение по умолчанию - PullRequest
2 голосов
/ 23 января 2011

Мне нужно вызвать функцию, используя Reflection API.Функция имеет необязательные параметры, и мне нужно вызвать ее, предоставив лишь некоторые из них.

Например, у меня есть эта функция:

public function doSomething($firstParam, $secondParam = "default", $thirdParam = "default)

И я использую invokeArgs(), чтобы вызвать doSomething(), передавая массив значений, представляющих аргументы, опускающие, чтобы установить значениек необязательному $secondParam:

$parameters = array("firstParam"=>"value", "thirdParam"=>"thirdValue");
$reflectedDoSomething->invokeArgs($instance, $parameters);

Здесь происходит то, что invokeArgs() вызывает метод, устанавливающий свои параметры в строке, не пропуская $secondParam, который теперь оценивается как "ThirdValue", и пропускает$thirdParam.И это логично правильно.Этот метод вызывается как doSomething("value", "thirdValue").

. Здесь я хотел бы заставить $secondParam использовать значение по умолчанию.Установка "secondParam" => null в массиве $parameters не является решением, поскольку null является значением.

Возможно ли использовать Reflection?

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 января 2011

См. Первый комментарий к документам для invokeArgs().

Итак, просто запустите параметры через простой алгоритм (вы можете создать функцию для переноса этого, если хотите):

$reflection = new ReflectionMethod($obj, $method); 

$pass = array(); 
foreach($reflection->getParameters() as $param) { 
   /* @var $param ReflectionParameter */ 
   if(isset($args[$param->getName()])) { 
       $pass[] = $args[$param->getName()]; 
   } else { 
       $pass[] = $param->getDefaultValue(); 
   } 
} 
$reflection->invokeArgs($obj, $pass);
1 голос
/ 23 января 2011

Как насчет того, чтобы установить не ассоциативное имя secondParam, а вместо null в качестве второго второго параметра.

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