Экземпляры и пространства имен
Я столкнулся с неожиданным поведением, пытающимся использовать следующее:
$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);