Umschalten nach Klasse (instanceof) in PHP

Lesezeit: 2 Minuten

Es ist möglich, Block von zu ersetzen if( .. instanceof ...), elseif(... instanceof ...), ... mit Schalter?

Zum Beispiel:

<?php
$class = ..... //some class

if($class instanceof SomeClass) {
    //do something
} elseif($class instanceof SomeAnotherClass) {
    //do something else
}

Benutzer-Avatar
Iwan

Für einen polymorphen Schalter mit instanceof die Erbschaft berücksichtigt:

switch(true) {  
    case $objectToTest instanceof TreeRequest:
        echo "tree request";
        break;
    case $objectToTest instanceof GroundRequest:
        echo "ground request";
        break;
}

Für einen Schalter, bei dem der Klassenname genau übereinstimmen sollte:

$class = get_class($objectToTest);

switch($class) {  
    case 'TreeRequest':
        echo "tree request";
        break;
    case 'GroundRequest':
        echo "ground request";
        break;
}

  • dieser Schalter(wahr), :+1:

    – Koponk

    6. Dezember 2016 um 1:58 Uhr

  • Eine Warnung an alle, die das erste Beispiel verwenden: Es ist nicht dasselbe wie instanceof da es Klassenvererbung und -implementierungen ignoriert.

    – SEoF

    29. Dezember 2016 um 12:52 Uhr

  • Sicher, es ist möglich. Aber warum Oh warum willst du das überhaupt machen? Es ist nichts falsch mit if( .. instanceof ...), elseif(... instanceof ...). Nicht nur das erste Beispiel ist falsch, sondern das zweite nimmt auch viel mehr Platz ein, verschlechtert die Lesbarkeit und Effizienz (da es das Kompilieren der “Fall”-Anweisungen verhindert, da sie dynamisch sind. Tun Sie so etwas nicht.

    – Patrick Allaert

    5. Dezember 2017 um 11:47 Uhr


Folgendes ist richtiger:

$class = get_class($objectToTest);

switch($class) {  
    case TreeRequest::class:
        echo "tree request";
        break;
    case GroundRequest::class:
        echo "ground request";
        break;
}

Auf diese Weise werden Namespaces richtig verglichen (Sie müssen sie nicht eingeben) und wenn sich etwas ändert, wie z. B. der Namespace oder der Klassenname, erhalten Sie einen anständigen IDE-Fehler, der Sie darüber informiert, dass Ihr Code beschädigt ist.

  • Denken Sie daran, dass Sie auf diese Weise Unterklassen verpassen (Klassenvererbung und Implementierungen)

    – Igor Scabini

    27. Februar 2018 um 12:00 Uhr


  • um sicherzustellen, dass diese Lösung funktioniert, auch wenn $objectToTest ist ein Proxy, den Sie verwenden können $class = ClassUtils::getClass($objectToTest);

    – Roubi

    13. Februar 2019 um 18:57 Uhr

  • @Roubi genau das, wonach ich gesucht habe (Symfony/Doctrine)

    – Adam Ducho

    29. Juni um 13:09 Uhr


1283430cookie-checkUmschalten nach Klasse (instanceof) in PHP

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

Privacy policy