Ankündigung

Einklappen
Keine Ankündigung bisher.

Instanzierung einer Klasse über Variable schlägt fehl

Einklappen

Neue Werbung 2019

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

  • Instanzierung einer Klasse über Variable schlägt fehl

    Genauere "Problemstellung":
    Instanzieren einer Klasse - wobei Klassenname in einer Variable gespeichert ist - schlägt fehl

    Ich kann leider nicht alle Punkte für "Profi" erfüllen, dennoch glaube ich, dass auch ich nicht mehr zu "Einsteiger" gehört.

    Mit bezug auf das Thema von einem Gast im Einsteiger-Bereich möchte ich diese Frage nochmal etwas anstupsen. (siehe).

    Mein Script zieht komplett dynamisch und OOP-Basiert die Namen von Dateien, welche Included und danach instanziert werden soll.
    Das Includen funktioniert einwandfrei. Leider schlägt das Instanzieren mit Bsp:
    PHP-Code:
    $obj_EH_S = new $className_EH_S
    fehl.

    Informationen bezüglich Umgebung.
    Verwendung von Namespaces

    Ist es den nun Möglich oder nicht. Meiner Meinung nach nicht, leider mit ich beim Suchen auf den Post oben gestoßen, welcher - unabhänig von der zeitlichen Positionierung - dem wiedersprechen würde.
    Würde mich über ein kurzes Feedback freuen.

    Gruß Simon

  • #2
    PHP-Code:
    namespace MyNamespaceA {
        class 
    Foo {}
    }

    namespace 
    MyNamespaceB {
        
    $className 'MyNamespaceA\\Foo';
        
    $object = new $className();

        
    var_dump($object);
        
    // object(MyNamespaceA\Foo)#1 (0) { }

    Kommentar


    • #3
      Danke hellbringer. Mir ist die Lösung heute morgen selber gekommen - nacht drüber schlafen hilft immer.

      kann geschlossen werden

      Kommentar


      • #4
        Moin zusammen!
        Ich sitze gerade vor einem ähnlichen Problem.


        Über einen Ajax-Request wird bei mir die ajax.php aufgerufen.
        Diese sieht so aus:
        PHP-Code:
        <?php
        session_start
        ();
        include_once(
        __DIR__ '/autoload.php');

        if (isset(
        $_POST['modul']) && isset($_POST['class']) && isset($_POST['method']) && isset($_POST['namespace'])):

          
        $namespace '\\' $_POST['namespace'];
          
        $class $_POST['class'];
          
        $method $_POST['method'];

          
        $result call_user_func_array(array (__NAMESPACE__ $namespace '\\' $class$method), array ($_POST));

          echo 
        $result;

        else:
          echo 
        '<p class="error">Server-Fehler</p>';
        endif;
        Dort laufen also ajax-request ein die immer einen Namespace, Klasse und einen Methode enthalten.

        Mit call_user_func_array wird dann die entsprechende Klasse und Methode aufgerufen..

        Das funktioniert auch alles soweit wunderbar..


        Allerdings funktioniert es nur mit statischen-Methoden. Das liegt vermutlich daran, dass die Klasse ja nicht instanziert wurde.
        Diese Meldung bekomme ich dann immer...
        Fatal error: Uncaught Error: Using $this when not in object context in

        Kann ich das was ich mit call_user_func_array oben mache irgendwie anders machen?

        Grüße

        Kommentar


        • #5
          Das ist vom Grundkonzept schon mal falsch. Der Client hat nichts von Namespaces, Klassen, usw. zu wissen. Er schickt nur einen Request mit einer Adresse zu einer Ressource. Welche Klassen, Namespaces, usw. der Server dann im Backend verwendet, interessiert den Client nicht.

          Kommentar


          • #6
            Ok, verstanden..
            Also quasi eher so...

            Ich bekomme jetzt vom ajax-request nur ein Wort, dass ich dann im Backend zuordne..


            PHP-Code:
            <?php
            session_start
            ();
            include_once(
            __DIR__ '/autoload.php');

            if (isset(
            $_POST['modul'])):

              switch (
            $_POST['modul']):
                case 
            'login':
                  
            $namespace '\\login';
                  
            $class 'login';
                  
            $method 'tryUserLogin';
                  break;
                default:
                  
            $namespace NULL;
                  
            $class NULL;
                  
            $method NULL;
                  break;
              endswitch;

              if (!(
            $namespace === NULL || $class === NULL || $method === NULL)):
                
            $result call_user_func_array(array (__NAMESPACE__ $namespace '\\' $class$method), array ($_POST));
                echo 
            $result;
              else:
                echo 
            '<p class="error">Server-Fehler</p>';
              endif;
            else:
              echo 
            '<p class="error">Server-Fehler</p>';
            endif;

            Kommentar


            • #7
              Ja. Informier dich mal über Routing, damit kannst du sowas ohne viel Programmcode umsetzen. Üblicherweise werden alle Anfragen (z.B. per htaccess) an eine index.php geleitet. Von dort ausgehend wird die Anwendung gestartet, in der ein Router verwendet wird, um Module, Funktionen, etc. einer URL zuzuordnen.

              Kommentar


              • #8
                Das mache ich sogar schon.

                Meine htaccess
                Code:
                Options +FollowSymLinks
                RewriteEngine On
                RewriteBase /
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule .* index.php [L,QSA]
                AddDefaultCharset UTF-8
                Ich mache aber gerade eine One-Page-Seite.. Also keine wirkliche Navigation..
                Kennt jetzt jemand für mein oben beschriebenes Problem eine Lösung?

                Kommentar


                • #9
                  Okay hat sich erledigt.. Habe es!

                  Kommentar


                  • #10
                    Zitat von Fab4guy Beitrag anzeigen
                    Okay hat sich erledigt.. Habe es!
                    Schau mal, ich habe hier eine Simple Funktion

                    https://github.com/BlackScorp/webrpg...s.php#L81-L100

                    diese wird so benutzt

                    https://github.com/BlackScorp/webrpg.../routes.php#L5

                    das sagt im Grunde aus, auf der URL / soll die funktion login aufgerufen werden.

                    du kannst auch route("/",[NameSpace\\Class::$name,'methodenName']); aufrufen
                    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                    Kommentar


                    • #11
                      Eine (wirklich unwesentliche) Performance-Anmerkung:

                      Das RewriteCond %{REQUEST_FILENAME} !-d kann man eigentlich weglassen. Das bezieht sich auf Verzeichnisse und macht im Endeffekt das Gleiche wie RewriteCond %{REQUEST_FILENAME} !-f.
                      Das RewriteRule .* index.php [L,QSA] kann zu RewriteRule ^ index.php [L,QSA] umgeschrieben werden. Das .* wird noch evaluiert, was aber eigentlich unnötig ist. ^ verkürzt diese unnötige Operation auf (fast) nichts.
                      Das RewriteBase / kannst du fast immer weglassen, wenn es um den Root (/) geht und nicht um ein konkretes Unterverzeichnis. Du kannst es drinlassen, aber es ist an sich unnötig.

                      Code:
                      Options +FollowSymLinks
                      AddDefaultCharset UTF-8
                      
                      RewriteEngine On
                      RewriteCond %{REQUEST_FILENAME} !-f
                      RewriteRule ^ index.php [L]

                      Das dürfte eigentlich reichen.

                      Kommentar


                      • #12
                        Oder einfacher:

                        Code:
                        ​​​​​​​Options +FollowSymLinks
                        AddDefaultCharset UTF-8
                        
                        FallbackResource /index.php

                        Kommentar


                        • #13
                          FallbackResource funktioniert nicht für / und ist nur in neueren Apache-Versionen verfügbar (was mittlerweile aber kein Problem mehr sein sollte).
                          Der vollständig halber:
                          DirectoryIndex /index.php FallbackResource /index.php

                          Kommentar


                          • #14
                            Zitat von rkr Beitrag anzeigen
                            FallbackResource funktioniert nicht für / und ist nur in neueren Apache-Versionen verfügbar
                            Ja seit 5 Jahren gibt es den Apache 2.4 der die FallbackResource unterstützt. Diese Version ist auch schon bei Debian seit 2 Jahren verfügbar.
                            Dass die FallbackResource nicht mit Verzeichnissen funktioniert ist angeblich ein Bug und dann über den DirectoryIndex gelöst werden. Ich habe schon gelesen, dass die FallbackResource schneller sein soll als die Lösung per mod_rewrite und auch in Ausnahmefällen besser funktioniert.

                            Kommentar

                            Lädt...
                            X