Cómo verificar si no es una instancia de alguna clase en Symfony2

3 minutos de lectura

avatar de usuario
Espejismo

Quiero ejecutar algunas funciones si la entidad es miembro de algunas clases pero no de algunas.

Hay una función llamada instanceof.

Pero hay algo como

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

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

    – GordonM

    27 de julio de 2012 a las 6:28

  • Đéo thằng nào có giải pháp ra hồn nhỉ

    – Vu Tran Kien

    14 de septiembre de 2018 a las 2:25

avatar de usuario
reycrunch

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 crear funciones arbitrarias solo para guardar algunos caracteres en un solo lugar. Por otro lado, si lo necesita “con demasiada frecuencia”, ¿puede tener un defecto de diseño? (En el sentido de “demasiados casos extremos” o algo así)

  • ¿No sería mejor if (!($entity instanceof User)) ?

    – Daniel W.

    18 de junio de 2013 a las 16:29

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

    – KingCrunch

    25 de abril de 2014 a las 10:49


  • @KingCrunch Muy confuso conceptualmente, ¿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 verificar qué es realmente.

    – Jonathan

    25 de febrero de 2016 a las 16:49


  • @Jonathan Ver php.net/manual/en/language.operators.precedence.php Al final solo se trata de $a+$b+$c contra ($a+$b)+$c. Alguna vez ha tratado 2**3**4 == (2**3)**4? 😉

    – KingCrunch

    26 de febrero de 2016 a las 15:26


  • Asegúrese de importar/usar la clase que está verificando con la instancia de. P.ej. por if ( $entity instanceof Audio ) Necesito tener use App\Entity\Audio;. PHP no arrojará un error si no usa la clase que está verificando, pero su si nunca se activará.

    – Siete

    23 de mayo de 2018 a las 13:23


avatar de usuario
dragos

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

!($a instanceof stdClass)

Esta es solo una sintaxis escrita lógica y “gramaticalmente” correcta.

!$class instanceof someClass

Sin embargo, la sintaxis sugerida anteriormente es engañosa porque no estamos especificando cuál es exactamente el alcance de la negación: la variable en sí o la construcción completa de $class instanceof someclass. Solo tendremos que confiar en la precedencia del operador aquí [Edited, thanks to @Kolyunya].

  • Esta es una solución más limpia. Estoy seguro de que la mitad de las personas que terminan con esta pregunta empezaron a buscar porque if (!$entity instanceof ShopEntity) no es intuitivo… Muchos de nosotros usamos !$entity como $entity === null.

    – mimoralea

    29/10/2014 a las 22:22

  • Que quieres decir con We will only have to rely here on the smart implementation of the PHP parser.? Existe la especificación del lenguaje que establece claramente que el instanceof El operador tiene mayor precedencia que el ! operador.

    – Kolyunya

    12 de febrero de 2017 a las 10:46

  • Legibilidad de @Kolyunya, vs “hmm, eso se ve raro… déjame buscar la precedencia del operador de php… ok, eso se comprueba”

    – Brad Kent

    14 de junio de 2017 a las 2:32

avatar de usuario
ahurt2000

Precedencia de operadores de PHP

instanceof operador está justo antes de la negación entonces esta expresión:

!$class instanceof someClass

es justo en PHP y esto hace lo que esperas.

  • Como usted mencionó, la nota clave es que la precedencia de la instanceof operador es mayor que !, por lo que la declaración da un resultado verdadero. Gracias

    – ako

    3 de agosto de 2019 a las 11:38

Esta función debería hacerlo:

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

Entonces tu código es

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

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

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

  • Esto no maneja bien la herencia.

    – hkoosha

    2 de septiembre de 2019 a las 6:47

avatar de usuario
Zuko

O puedes probar estos

    $cls = [GlobalNameSpace::class,\GlobalNameSpaceWithSlash::class,\Non\Global\Namespace::class];
    if(!in_array(get_class($instance), $cls)){
        //do anything
    }

  • Esto no maneja bien la herencia.

    – hkoosha

    2 de septiembre de 2019 a las 6:47

¿Ha sido útil esta solución?