Экземпляры и пространства имен

Я столкнулся с неожиданным поведением, пытающимся использовать следующее:

$object instanceof $class

1/PHP 'instanceof' ключевое слово и пространства имен хорошо работают вместе, как описано в официальном документе.

2/Иногда, однако, экранирование отбрасывания приводит к более тонкому (неясному?) поведению, поскольку Бен любезно объяснил в этой хорошей записи.

Где-то глубоко в моем коде, y задайте пару дампов, как следует:

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

который дает мне следующий вывод при запуске my script:

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

Класс моего первого дампа строго совпадает со строкой моего второго дампа. Однако мой экземпляр дампа возвращает FALSE. Почему?

Я играл с обратной косой чертой, не повезло. Может, я где-то перепутал пространства имен? Дело в том, что я действительно не знаю, как устранить проблему дальше. Что я должен попробовать?

Ответ 1

Вы можете протестировать экземпляры с использованием пространств имен, но используйте полное имя класса.

Для вашего теста я бы сделал следующее:

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

Ответ 2

Я использую более простой вариант

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