Instanceof和名称空间

时间:2014-05-22 13:17:56

标签: php instanceof

我在尝试使用以下内容时遇到意外行为:

$object instanceof $class

1 / PHP'exformof'关键字和命名空间可以很好地协同工作,如in the official doc.

所述

2 /有时,反斜杠转义会产生更微妙(模糊?)的行为,正如Ben在this好帖子中所说的那样。

在我的代码深处,y设置了几个转储如下:

var_dump($object, $class);
var_dump($object instanceof $class);

在运行我的脚本时给出了以下输出:

class Tools\Tests\Entity\testObject#226 (2) {
  private $var_one =>
  NULL
  private $var_two =>
  NULL
}
string(36) "Tools\Tests\Entity\testObject"
bool(false)

我的第一个转储类与第二个转储中的字符串严格相同。 但是,我的instanceof dump返回FALSE。为什么?

我玩了反斜杠,没有运气。也许我搞砸了名字空间?问题是我真的不知道如何进一步排除故障。我该怎么办?

3 个答案:

答案 0 :(得分:17)

您可以使用命名空间测试实例,但使用fully qualified class name

对于你的测试,我会这样做:

$class = "\\Tools\\Tests\\Entity\\testObject";
$object = new $class;
var_dump($object instanceof $class); //bool(true)

你也可以使用单引号测试这种方式,而不用担心逃避反斜杠并节省一些按键。

$class = '\Tools\Tests\Entity\testObject';
$object = new $class;
var_dump($object instanceof $class); //bool(true)

答案 1 :(得分:4)

我使用更简单的变体

var_dump($object instanceof \Tools\Tests\Entity\testClass);

答案 2 :(得分:0)

您应该使用ReflectionClass避免此模型中的任何执行或行为。 阅读更多关于ReflectionClass的信息,以获取有关我们检查的类\模型的更多信息。 http://php.net/manual/en/class.reflectionclass.php

foreach ($this->modelNamespaces as $namespace) {
    $reflectionClass = new \ReflectionClass($namespace);

    if ($reflectionClass->implementsInterface('common\models\FieldsInCollectionInterface')) {
        // class is implemented by FieldsInCollectionInterface
    }
}