Wie überprüft man, ob es sich nicht um eine Instanz einer Klasse in Symfony2 handelt

Lesezeit: 3 Minuten

Benutzer-Avatar
Fata Morgana

Ich möchte einige Funktionen ausführen, wenn die Entität Mitglied einiger Klassen ist, aber nicht einiger.

Es gibt eine Funktion namens instanceof.

Aber gibt es sowas

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

  • instanceof ist keine Funktion, sondern ein Schlüsselwort. Und nein, so etwas gibt es in der PHP-Sprache nicht, Sie müssten eine Funktion implementieren, um das selbst zu tun.

    – GordonM

    27. Juli 2012 um 6:28 Uhr

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

    – Vu Trankien

    14. September 2018 um 2:25 Uhr

Benutzer-Avatar
KingCrunch

Geben Sie ihnen eine gemeinsame Schnittstelle und dann

if (!$entity instanceof ShopEntity)

oder bleib dabei

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

Ich würde es vermeiden, beliebige Funktionen zu erstellen, nur um einige Zeichen an einem einzigen Ort zu speichern. Auf der anderen Seite, wenn Sie es “zu oft” brauchen, haben Sie vielleicht einen Designfehler? (Im Sinne von “zu viele Randfälle” oder so)

  • wäre es nicht besser zu if (!($entity instanceof User)) ?

    – Daniel W.

    18. Juni 2013 um 16:29 Uhr

  • @DanFromGermany Macht keinen Unterschied. Vielleicht Lesbarkeit. Es liegt an dir.

    – KingCrunch

    25. April 2014 um 10:49 Uhr


  • @KingCrunch Sehr konzeptionell verwirrend, warum es keinen Unterschied macht? Ich bevorzuge die Antwort und Rationalisierung von Dragos. So mache ich es, da es einfach schmutzig erscheint, die Instanz zu negieren, die Sie überprüfen möchten, bevor Sie überprüft haben, was sie tatsächlich ist.

    – Jonathan

    25. Februar 2016 um 16:49 Uhr


  • @JonathanSee php.net/manual/en/language.operators.precedence.php Am Ende geht es nur darum $a+$b+$c vs ($a+$b)+$c. Jemals versucht 2**3**4 == (2**3)**4? 😉

    – KingCrunch

    26. Februar 2016 um 15:26 Uhr


  • Stellen Sie sicher, dass Sie die Klasse importieren/verwenden, die Sie mit instanceof überprüfen. Z.B. zum if ( $entity instanceof Audio ) ich brauche use App\Entity\Audio;. PHP wird keinen Fehler auslösen, wenn Sie die Klasse, die Sie überprüfen, nicht verwenden – aber Ihr if wird niemals ausgelöst.

    – Sieben

    23. Mai 2018 um 13:23 Uhr


Benutzer-Avatar
Drachen

PHP-Handbuch sagt: http://php.net/manual/en/language.operators.type.php

!($a instanceof stdClass)

Dies ist nur eine logische und “grammatikalisch” korrekte geschriebene Syntax.

!$class instanceof someClass

Die oben vorgeschlagene Syntax ist jedoch schwierig, da wir nicht spezifizieren, was genau der Geltungsbereich der Negation ist: die Variable selbst oder das gesamte Konstrukt von $class instanceof someclass. Wir müssen uns hier nur auf den Operatorvorrang verlassen [Edited, thanks to @Kolyunya].

  • Dies ist eine sauberere Lösung. Ich bin mir sicher, dass die Hälfte der Leute am Ende auf diese Frage gestoßen ist, weil sie angefangen hat zu suchen if (!$entity instanceof ShopEntity) ist nicht intuitiv … Viele von uns verwenden !$entity wie $entity === null.

    – Mimorale

    29. Oktober 2014 um 22:22 Uhr

  • Was meinst du mit We will only have to rely here on the smart implementation of the PHP parser.? Es gibt die Sprachspezifikation, die eindeutig besagt, dass die instanceof Der Operator hat eine höhere Priorität als der ! Operator.

    – Koljunja

    12. Februar 2017 um 10:46 Uhr

  • @Kolyunya Lesbarkeit, vs “hmm, das sieht komisch aus … lass mich die Operator-Präzedenz von PHP nachschlagen … ok, das geht aus”

    – Brad Kent

    14. Juni 2017 um 2:32 Uhr

Benutzer-Avatar
ahurt2000

Vorrang von PHP-Operatoren

instanceof Operator steht direkt vor der Negation dann dieser Ausdruck:

!$class instanceof someClass

ist genau richtig in PHP und dies tun, was Sie erwarten.

  • Wie Sie bereits erwähnt haben, ist der Grundgedanke, dass der Vorrang der instanceof Betreiber ist höher als !, so dass die Aussage ein wahres Ergebnis liefert. Vielen Dank

    – ako

    3. August 2019 um 11:38 Uhr

Diese Funktion sollte es tun:

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

Ihr Code ist also

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

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

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

  • Dies handhabt die Vererbung nicht gut.

    – hkoosha

    2. September 2019 um 6:47 Uhr

Benutzer-Avatar
Zuko

Oder Sie können diese ausprobieren

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

  • Dies handhabt die Vererbung nicht gut.

    – hkoosha

    2. September 2019 um 6:47 Uhr

1353660cookie-checkWie überprüft man, ob es sich nicht um eine Instanz einer Klasse in Symfony2 handelt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy