91 votes

Comment vérifier si ce n'est pas une instance d'une classe en symfony2

Je veux exécuter certaines fonctions si l'entité est membre de quelques classes mais pas de certaines.

Il y a une fonction appelée instanceof.

Mais y a-t-il quelque chose comme

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

160voto

KingCrunch Points 45168

Donnez-leur une interface commune et ensuite

if (!$entity instanceof ShopEntity)

ou restez avec

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

Je éviterais de créer des fonctions arbitraires juste pour économiser quelques caractères à un seul endroit. D'un autre côté, si vous en avez besoin "trop souvent", vous pourriez avoir un défaut de conception? (Au sens de "trop de cas particuliers" ou quelque chose du genre)

78voto

Dragos Points 1182

Le manuel PHP dit : http://php.net/manual/fr/language.operators.type.php

!($a instanceof stdClass)

C'est juste une syntaxe logique et correcte "grammaticalement" écrite.

!$class instanceof someClass

La syntaxe suggérée ci-dessus, cependant, est délicate car nous ne spécifions pas exactement quel est le champ de la négation : la variable elle-même ou tout le construct de $class instanceof someclass. Nous devrons donc nous fier ici à la précédence de l'opérateur [Modifié, merci à @Kolyunya].

13voto

ahurt2000 Points 171

Précédence des opérateurs PHP

L'opérateur instanceof se trouve juste avant la négation, puis cette expression :

!$class instanceof someClass

est correcte en PHP et fait ce que vous attendez.

2voto

Bruno Schäpper Points 1230

Cette fonction devrait le faire :

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

Donc votre code est

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

0voto

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X