找出一个变量的类型暗示——PHP

找出一个变量的类型暗示——PHP,php,Php,有没有办法找出变量上放置了什么类型的提示: ...function( IInterface $blah ) { if( gettypehint( $blah ) == IInterface ) { echo "yay"; } } 我意识到在这种情况下这是毫无意义的,但这是为了简化问题 编辑以帮助回答: public function AddBinding( $interface, $concrete ) { $called

有没有办法找出变量上放置了什么类型的提示:

...function( IInterface $blah )
{
    if( gettypehint( $blah ) == IInterface )
    {
        echo "yay";
    }
}
我意识到在这种情况下这是毫无意义的,但这是为了简化问题

编辑以帮助回答:

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

实际上,问题是我正在实现一个工厂类。在那个工厂中,我需要知道扩展工厂的类的参数是什么。如果它是一个界面,那么做一个新的东西需要,但如果它是IPopy类型,那么我需要一个新的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();
            }
        }
    }

参考:

如在。。。检查参数的实例

instanceof

但考虑到您已经假设您的参数需要是IInterface的实例,双重检查PHP是否正确工作可能有点奇怪。
除非我遗漏了什么。你的问题似乎很奇怪。它可以通过API解决:


-但是,真的,我无法想象这样的用例——因为,如果它是您的函数,那么您知道它的参数定义。

它可能是或吗?如果不是从接口派生的东西,那么调用函数是不可能的。尝试调用…函数(“somethingNotfunction”)-这将引发一个错误…使用
instanceof
?它与接口一起工作,如示例4所示:尝试:实际上问题是我正在实现一个工厂类。在该工厂中,我需要知道扩展工厂的类的参数是什么。如果它是一个IInterface,则执行一个新的操作需要,但如果它是是iPopy类型的,那么我需要一个新的Poopy。问题是还没有创建对象的实例,所以我无法执行以下实例:(这是这个问题的后续问题:如果它是工厂,那么它应该知道它在做什么。你不能对所有情况都进行实例化,因为它总是上下文定义的操作。我要解决的问题是单元测试,我想有一个地方说”如果一个控制器将IPageRepository$repo作为构造参数传递,那么请找出他告诉我在工厂绑定中生成的对象类型"因此,在进行单元测试时,我可以将使用不同存储库的测试数据放在仍然实现IntreFace的测试数据中。这是一个一站式的位置,用于说明我的应用程序应该使用哪些存储库。在任何情况下,您都可以使用
ReflectionFunction
ReflectionMethod
来检索我上面提出的参数或某些服务目的(或调试-仅用于跟踪和了解正在发生的事情)-那没关系。但使用它来定义业务逻辑不是一个好主意,因为在大多数情况下,混合数据和元数据是一种反模式。是的,我没有很好地解释它。这里面没有业务逻辑。不幸的是,我使用的是codeigniter,它有一个内置的控制器功能集。所以我尝试用PHP做类似的事情:用于依赖项注入