2014-05-22 10 views
10

Sto affrontando un comportamento imprevisto cercando di utilizzare il seguente:instanceof e spazi dei nomi

$object instanceof $class 

1/PHP 'instanceof' di parole chiave e gli spazi dei nomi lavorano bene insieme, come spiegato in the official doc.

2/A volte, tuttavia , la fuga di backslash rende più sottile (oscuro?) il comportamento, come Ben gentilmente spiegato nel bel post this.

Da qualche parte nel profondo del mio codice, y impostare un paio di discariche come segue:

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

che mi dà il seguente output quando si esegue il mio script:

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

La classe del mio primo il dump è esattamente lo stesso della stringa nel mio secondo dump. Tuttavia, la mia istanza di dump restituisce FALSE. Perché ?

Ho giocato con i backslash, senza fortuna. Forse mi sono incasinato da qualche parte con i namespace? Il fatto è che davvero non so come risolvere più in basso. Cosa dovrei provare?

+0

Oh, e ho appena controllato non v'è alcuna parola chiave php nel mio spazio dei nomi ... apostrofi – mika

+1

uso ... – Deadooshka

risposta

14

È possibile verificare le istanze utilizzando gli spazi dei nomi, ma utilizzare fully qualified class name.

per il test farei questo:

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

È possibile anche testare in questo modo con le virgolette singole e non preoccuparsi di fuggire backslash e risparmiare pochi tasti.

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

Eccellente! Questa è una combinazione di barre che non ho provato ... Ed è in realtà la correzione :) – mika

+0

@mika Felice di aiutare! Metto alla prova tutte le mie istanze in questo modo, quindi non mi preoccupo di attraversare erroneamente la gerarchia dello spazio dei nomi. – Crackertastic

+0

barre rovesciate di escape sono circa doppie virgolette, quando si ottiene '\ t' lì. Le virgolette singole non sono state analizzate, pertanto non è necessario eseguire il escape dei backslash. – Deadooshka

3

Io uso più semplice variante

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

Questo è più appropriato se non devi leggere lo spazio dei nomi e la classe da una variabile. Funziona anche solo usando il nome della classe se il suo spazio dei nomi è stato "usato". +1 – Adambean