2012-05-29 14 views
6

Esiste un modo più breve per verificare se un oggetto fa parte di un determinato insieme di classi?Più istanze di assegni

Utilizzando instanceof rende l'istruzione IF troppo a lungo: if($obj instanceof \Class1 || $obj instanceof \Class2 || $obj instanceof \Class3....)

E questo non funziona: instance of \Class1 || \Class2 || \Class3

presuppone che Class2 è costante ..

+2

Queste classi hanno qualcosa in comune? Forse stanno tutti implementando la stessa interfaccia, e puoi controllare se il tuo '$ obj' implementa quell'interfaccia invece? –

+0

Troppo localizzato? L'ho trovato 5 anni dopo ed è ancora utile. –

risposta

1

credo, la via più breve è mettere l'espressione booleana in un metodo esterno e chiamarla nell'istruzione IF.

7

In breve: No

La risposta più: è possibile creare soluzioni alternative, che l'uso get_parent_class() ricorsivo per andare a prendere tutte le classi genitore e quindi utilizzare array_intersect() per scoprire, se uno o più dei vostri nomi di classi appare lì. Tuttavia, sembra, che le classi dovrebbero avere qualcosa in comune. Metti questo in un'interfaccia un test contro questo.

5

rende l'istruzione IF troppo a lungo

[...]

Esiste un modo più breve

Certo.

Semplicemente creare una funzione:

function isOfValidClass($obj) 
{ 
    $classNames = array('Class1', 'Class2'); 
    foreach ($classNames as $className) { 
     if (is_a($obj, $className)) { 
     return true; 
    } 

    return false; 
} 

quindi è possibile utilizzare che nel codice e non devono preoccuparsi di vostro if "occupare troppo spazio" (non che si dovrebbe sempre considerare che un problema, le dichiarazioni dovrebbero essere lunghe quanto necessario).