Ankündigung

Einklappen
Keine Ankündigung bisher.

Namespace dynamisch

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Namespace dynamisch

    Hi,

    ich habe 2 Klassen Objects\A und Objects\B, beide haben die Methode loadPage.
    Jetzt sollen diese dynamisch über namespaces aufgerufen werden z.B. über eine GET-Variable:

    Code:
    Objects\$_GET['class']::loadPage()
    wie kann ich das lösen, dieser Ansatz funktioniert leider nicht ...

  • #2
    Man kann call_user_func(array("Namespace\\Class", "method")); benutzen.
    Crashkurs zum Thema Rechtschreibung: [COLOR="Green"]normalerweise[/COLOR] ([COLOR="Red"]normaler weise[/COLOR] oder [COLOR="Red"]normaler weiße[/COLOR]), [COLOR="DarkGreen"]Standard[/COLOR] ([COLOR="Red"]Standart[/COLOR]), [COLOR="DarkGreen"]eben[/COLOR] ([COLOR="Red"]ebend[/COLOR])

    Kommentar


    • #3
      Vllt. macht hier Vererbung mehr Sinn, dann hast du eine abstrakte Basisklasse in der du die Methode definierst und 2 unterschiedliche abgeleitete Klassen, die die Methode implementieren.
      [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
      [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

      Kommentar


      • #4
        PHP-Code:
        <?php

        namespace Objects {

            class 
        { static public function loadPage() { echo 'Hello World!'; } }

            class 
        { static public function loadPage() { echo 'Goodbye World!'; } }

        }

        namespace {
            
        $class 'Objects\\'.$_GET['class'];
            
        $class::loadPage();
        }
        Anmerkungen:
        - Ob das eine gute Lösung ist (den Namespace+Klassenname als String zusammenzubauen) und nicht Alternativen besser wären, weiß ich nicht.
        - Direkter Zugriff auf $_GET ohne vorher zu prüfen ob der Schlüssel ('class') existiert und valide ist (z. B. Name einer vorhandenen Klasse) darf natürlich nicht geschehen. Ich nehme an das war auch klar und ist nur zur Vereinfachung geschehen, dennoch der Hinweis.
        - "Namespace dynamisch" ist eigentlich kein korrekter Titel, oder? Denn bei dir ist der Namespace statisch und nur der Klassenname dynamisch. Natürlich kann auch der Namespace selber in einen String verpackt werden - wie man sieht.

        Eine mögliche Alternative könnte die Nutzung eines zur Laufzeit erstellten Alias sein:
        PHP-Code:
        class_alias('Objects\\'.$_GET['class'], 'ExampleAlias');
        ExampleAlias::loadPage(); 
        Siehe auch: http://php.net/manual/de/function.class-alias.php

        Kommentar


        • #5
          Vielen Dank für eure Ideen / Tipps / Vorschläge, werde mir ansehen was am sinnvollsten ist für meine FUnktionalität.

          Danke!

          Kommentar


          • #6
            Schau dir besser gleich PHP-DI4 und dessen Autowiring-Feature an. Damit kannst du genau das machen, nur viel besser.

            Kommentar

            Lädt...
            X