2012-07-27 9 views
46

Quiero ejecutar algunas funciones si la entidad es miembro de pocas clases, pero no algunas.Cómo comprobar si no instancia de alguna clase en symfony2

Hay una función llamada instanceof.

pero ¿hay algo así como

if ($entity !instanceof [User,Order,Product]) 
+0

instanceof no es una función, es una palabra clave. Y no, no hay nada como eso en el lenguaje PHP, tendrías que implementar una función para hacerlo tú mismo. – GordonM

Respuesta

79

Dales una interfaz común y luego

if (!$entity instanceof ShopEntity) 

o quedarse con

if (!$entity instanceof User && !$entity instanceof Product && !$entity instanceof Order) 

evitaría la creación de funciones arbitrarias sólo para ahorrar unos personajes en un solo lugar. Por otro lado, si lo necesita "con demasiada frecuencia", ¿puede tener un defecto de diseño? (En el sentido de "casos extremos demasiado" o tales)

+35

¿no sería mejor que 'if (! ($ Entity instanceof User))'? – DanFromGermany

+4

@DanFromGermany No hace la diferencia. Tal vez legibilidad. Tu decides. – KingCrunch

+0

@KingCrunch Muy conceptualmente confuso por qué no hace la diferencia? Prefiero la respuesta y la racionalización de Dragos. Es la forma en que lo hago, ya que parece sucio negar la instancia que desea verificar antes de haber comprobado lo que realmente es. – Jonathan

1

Esta función debe hacerlo:

function isInstanceOf($object, Array $classnames) { 
    foreach($classnames as $classname) { 
     if($object instanceof $classname){ 
      return true; 
     } 
    } 
    return false; 
} 

Así que su código es

if (!isInstanceOf($entity, array('User','Order','Product'))); 
41

manual de PHP dice: http://php.net/manual/en/language.operators.type.php

!($a instanceof stdClass) 

Esto es sólo una lógica y la sintaxis escrita "gramaticalmente" correcta.

Sin embargo, la sintaxis sugerida anteriormente es complicada porque no especificamos cuál es exactamente el alcance de la negación: la variable en sí misma o la construcción completa de "$ var instanceof someclass". Solo tendremos que confiar aquí en la precendencia del operador [Editado, gracias a @Kolyunya].

!$class instanceof someClass 
+4

Esta es una solución más limpia. Estoy seguro de que la mitad de la gente termina con esta pregunta, porque 'if (! $ Entity instanceof ShopEntity)' no es intuitiva ... Muchos de nosotros usamos '! $ Entity' como' $ entity === null'. – mimoralea

+3

¿Qué quiere decir con 'Solo tendremos que confiar aquí en la implementación inteligente del analizador PHP. Existe la especificación del lenguaje que establece claramente que el operador 'instanceof' tiene una precedencia más alta que el operador'! '. – Kolyunya

+1

@Kolyunya legibilidad, frente a "hmm, eso se ve raro ... déjame buscar la precedencia del operador de php ... ok, eso se comprueba" –

10

PHP Operator Precedence

instanceof operador es justo antes de la negación a continuación, esta expresión:

!$class instanceof someClass 

es la correcta en PHP y esto hace que usted espera.

1
function check($object) { 
    $deciedClasses = [ 
     'UserNameSpace\User', 
     'OrderNameSpace\Order', 
     'ProductNameSpace\Product', 
    ]; 

    return (!in_array(get_class($object), $allowedClasses)); 
} 
Cuestiones relacionadas