2012-05-29 19 views
6

¿Hay una manera más corta de verificar si un objeto es parte de un cierto conjunto de clases?Multiple instanceof cheques

El uso de instanceof hace la declaración, si es demasiado larga: if($obj instanceof \Class1 || $obj instanceof \Class2 || $obj instanceof \Class3....)

Y esto no funciona: instance of \Class1 || \Class2 || \Class3

se supone que es constante .. Clase2

+2

¿Estas clases tienen algo en común? Quizás todos están implementando la misma interfaz, y puede verificar si su '$ obj' implementa esa interfaz en su lugar. –

+0

¿Demasiado localizado? Encontré esto 5 años después y todavía es útil. –

Respuesta

1

creo, el camino más corto es poner la expresión booleana en un método externo y llamarla a la declaración IF.

7

En resumen: No

La respuesta larga: Se pueden crear soluciones, que recursiva uso get_parent_class() a buscar a todas las clases de padres y luego usar array_intersect() para averiguar, si uno o más de sus nombres de clase aparece allí. Sin embargo, parece que las clases deberían tener algo en común. Pon esto en una interfaz una prueba en contra de esto.

5

hace que la instrucción IF demasiado tiempo

[...]

¿Hay un camino más corto

Claro.

Simplemente crear una función:

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

    return false; 
} 

entonces usted puede utilizar que en el código y no tiene que preocuparse acerca de su sentencia if "tomar demasiado espacio" (no es que alguna vez debería considerar la posibilidad de que un problema; las declaraciones deben ser tan largas como lo necesiten).