2014-05-22 13 views
10

Jestem stoi nieoczekiwane zachowanie próbuje użyć następujących:instanceof i nazw

$object instanceof $class 

1/PHP 'instancją' Hasło i nazw działa dobrze razem, jak wyjaśniono in the official doc.

2/Czasami jednak , odwrotny ukośnik ucieka w bardziej subtelne (niejasne?) zachowanie, jak Ben uprzejmie wyjaśnił w this miły wpis.

Gdzieś głęboko w moim kodu, y ustawić kilka wysypisk następująco:

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

która daje mi następujący wynik podczas jazdy mój skrypt:

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

klasie mój pierwszy dump jest dokładnie taki sam jak ciąg w moim drugim dump. Jednak mój wystąpienie instanceof zwraca FALSE. Czemu ?

Grałem z odwróconymi ukośnikami, bez powodzenia. Może gdzieś pomieszałem z przestrzeniami nazw? Chodzi o to, że naprawdę nie wiem, jak rozwiązać problem w dół. Co powinienem spróbować?

+0

Och, a ja po prostu nie ma sprawdzone kluczowe php w moim nazw ... – mika

+1

apostrofów ... – Deadooshka

Odpowiedz

14

Można testować instancje za pomocą przestrzeni nazw, ale należy użyć wartości fully qualified class name.

Do testu chciałbym to zrobić:

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

Można również przetestować ten sposób za pomocą apostrofów i nie martwić się o ucieczce swoje backslashy i zaoszczędzić sobie kilku klawiszy.

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

doskonałe! Jest to kombinacja ukośników, których nie próbowałem ... I to w rzeczywistości jest poprawka :) – mika

+0

@mika Cieszę się, że mogę pomóc! Przetestowuję wszystkie moje instancje w ten sposób, aby nie martwić się niepoprawnym przechodzeniem przez hierarchię przestrzeni nazw. – Crackertastic

+0

Skok odwróconych znaków ucieczki dotyczy podwójnego cudzysłowu, ponieważ otrzymasz '\ t' tam. Pojedynczy cudzysłów nie jest parsowany, więc nie trzeba uciekać ukośników wstecznych. – Deadooshka

3

używam prostszy wariant

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

Jest to bardziej odpowiednie, jeśli nie musisz czytać przestrzeni nazw i klasy ze zmiennej. Działa również po prostu używając nazwy klasy, jeśli jej przestrzeń nazw została "wykorzystana". +1 – Adambean