2013-12-09 3 views
4

Есть ли способ, чтобы выяснить, что typehinting было помещено на переменную:Выясните тип намекая переменной - PHP

...function(IInterface $blah) 
{ 
    if(gettypehint($blah) == IInterface) 
    { 
     echo "yay"; 
    } 
} 

Я понимаю, что в данном контексте это не имеет смысла, но это, чтобы упростить вопрос.

Редактировать, чтобы помочь ответить на:

На самом деле проблема в том, что я реализую заводском вид класса. На этом заводе мне нужно знать, какие параметры были у класса, который расширяет завод. Если это IInterface, то сделайте новый ThingINeed, но если бы он был типа IPoopy, мне нужен новый Poopy. Такие вещи.

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

Так что мой случай на самом деле это:

public function AddBinding($interface, $concrete) 
    { 
     $calledClass = get_called_class(); 
     $class = new \ReflectionClass($calledClass); 

     $method = $class->getMethod("__construct"); 
     $params = $method->getParameters(); 

     foreach($params as $param) 
     { 
      if ($param instanceof $interface) 
      { 
       return new $concrete(); 
      } 
     } 
    } 

в отношении: How to implement a factory class using PHP - Dependancy injection

+1

Не может быть http://www.php.net/manual/en/internals2.opcodes.instanceof.php или http://es1.php.net/function.get-class? –

+0

afaik невозможно вызвать функцию с чем-то, что не вытекает из IInterface. try call ... function ("somethingNotfunction) - это вызовет ошибку ... – floww

+0

Использовать' instanceof'? Он работает с интерфейсами, как показано в примере 4 здесь: http://www.php.net/manual/ ru/language.operators.type.php –

ответ

1

Как и в ... проверка экземпляра параметра?

instanceof: http://www.php.net/manual/en/internals2.opcodes.instanceof.php

Но учитывая, что вы уже приняли свой параметр ПОТРЕБНОСТИ быть InstanceOf IInterface, это может быть немного странно перепроверить, если PHP сделал это корректно работать. Если я чего-то не хватает.

+0

На самом деле проблема в том, что я реализую Factory-тип класс. На этом заводе мне нужно знать, какие параметры были для класса, который расширяет завод. Если это IInterface, то сделайте новый ThingINeed, но если он был типа IPoopy, мне нужен новый Poopy. Вещь – Jimmyt1988

+0

Проблема в том, что экземпляр объекта еще не создан, поэтому я не могу делать instanceof :( – Jimmyt1988

1

Ваш вопрос кажется странным. Она может быть решена с ReflectionFunction API:

function foo(StdClass $arg) 
{ 
    $function = new ReflectionFunction(__FUNCTION__); 
    $args  = array_map(function($item) 
    { 
     return $item->getClass()->getName(); 
    }, $function->getParameters()); 
    //var_dump($args); 
    //so, if ($args[0]=='SomeNeededClass') { ... } 
} 

$obj = new StdClass(); 
foo($obj); 

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

+0

. Из этого вопроса следует следующее: http://stackoverflow.com/questions/20471675/how-to-implement -a-завод-класс с использованием-PHP-зависимости-injectio n – Jimmyt1988

+1

Если это фабрика, тогда она должна знать, что она делает.У вас не может быть экземпляра для всех случаев, поскольку он всегда является контекстно-зависимым действием. –

+0

Проблема, которую я решаю, - это модульное тестирование. Я хочу иметь одно место, где говорится: «Если контроллер передает IPageRepository $ repo в качестве параметра конструкции, тогда найдите какой тип объекта он сказал мне сделать в заводских привязках », так что при модульном тестировании я могу разместить в тестовых данных, которые используют другой репозиторий, все еще реализующий интерфейс. Одностановленное место, чтобы сказать, какие хранилища должны использовать мое приложение. – Jimmyt1988

Смежные вопросы