查找变量的类型提示 - PHP

3

有没有一种方法可以找出变量上放置的类型提示:

...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();
            }
        }
    }

关于:如何使用PHP依赖注入实现工厂类


1
可能是 http://www.php.net/manual/zh/internals2.opcodes.instanceof.php 还是 http://es1.php.net/function.get-class ? - ka_lin
据我所知,无法使用不派生自IInterface的内容调用该函数。 尝试调用...function("somethingNotfunction") - 这将抛出一个错误... - floww
使用instanceof?它可以与接口一起使用,正如此处的示例4所示:http://www.php.net/manual/en/language.operators.type.php - Darragh Enright
1
尝试:[ReflectionParameter :: getClass](http://www.php.net/manual/reflectionparameter.getclass.php) - Yoshi
2个回答

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);

-但是,实际上,我无法想象出这个用例-因为,如果这是您的函数,您已经了解它的参数定义。


这是一个关于以下问题的后续:http://stackoverflow.com/questions/20471675/how-to-implement-a-factory-class-using-php-dependancy-injection - Jimmyt1988
1
如果是工厂,那么它应该知道自己在做什么。你不能为所有情况都进行实例化,因为它总是由上下文定义的操作。 - Alma Do
我要解决的问题是单元测试,我想要一个地方来说明“如果控制器将IPageRepository $repo作为构造参数传递,则找出他告诉我在工厂绑定中要创建什么类型的对象”,这样在进行单元测试时,我可以放置使用实现接口的不同存储库的测试数据。一个集中的地方来说明我的应用程序应该使用哪些存储库。 - Jimmyt1988
无论如何,您可以使用ReflectionFunctionReflectionMethod来检索参数,就像我上面提到的那样。如果是为了某些服务目的(或调试 - 仅用于跟踪和理解正在发生的事情)- 那么没问题。但是在定义业务逻辑时使用它并不是一个好主意,因为在大多数情况下混合数据和元数据是一种反模式。 - Alma Do
是的,我没有解释清楚。这里没有业务逻辑。不幸的是我正在使用具有内置控制器功能集的CodeIgniter。因此,我正在尝试在PHP中实现类似于以下内容的内容:http://msdn.microsoft.com/en-us/library/ff660899(v=PandP.20).aspx以进行依赖项注入。 - Jimmyt1988

1

实际上问题在于我正在实现一种工厂类。在该工厂中,我需要知道扩展工厂的类的参数是什么。如果它是IInterface,则执行新的ThingINeed,但如果它是IPoopy类型,则需要一个新的Poopy。这样的东西。 - Jimmyt1988
问题在于还没有创建对象的实例,所以我无法使用 instanceof :( - Jimmyt1988

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接