Ankündigung

Einklappen
Keine Ankündigung bisher.

Namespace mit einer Variable kombinieren?

Einklappen

Neue Werbung 2019

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

  • Namespace mit einer Variable kombinieren?

    Guten Tag liebe Community.
    Ich habe derzeit ein kleines Problem mit den Namespaces. Ich möchte eine Namespace mit einer Variable kombinieren, leider spuckt mir PHP eine Fehlermeldung aus.

    Folgende Fehlermeldung:
    Parse error: syntax error, unexpected '.', expecting identifier (T_STRING) in /Applications/XAMPP/xamppfiles/htdocs/Joy/classes/mvcclasses/SimpleRouting.php on line 19
    Code:
    Code:
        if(isset($route[0])) {
          if(file_exists(APP_ROOT.'/joy/controllers/'.ucfirst($route[0].'Controller.php'))) {
            require APP_ROOT.'/joy/controllers/'.ucfirst($route[0]).'Controller.php';
            $controller = new \Joy\Controllers\.ucfirst($route[0]).'Controller';
            if(method_exists($controller, 'Main')) {
              $controller->Main();
            } else {
              die('Method "Main" not exists');
            }
          } else {
            die('Controller not exists');
          }
        }
    Hab mal die Stelle eben Fett dargestellt, damit man sehen kann, wo derzeit mein Problem auftaucht.

    MfG.
    Dir gefällt mein Beitrag, ich habe Dir geholfen?
    Bewerte mich doch einfach!

  • #2
    So "einfach" geht das nicht. Du musst dir wenn schon den kompletten Namespace + Klassennamen als String zusammenbauen.

    PS: Per String Instanzierte Klassen gehen nicht vom aktuellen Namespace aus, du musst also in jedem Fall den kompletten Namespace zusammenbauen.
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

    Kommentar


    • #3
      Zitat von tkausl Beitrag anzeigen
      So "einfach" geht das nicht. Du musst dir wenn schon den kompletten Namespace + Klassennamen als String zusammenbauen.

      PS: Per String Instanzierte Klassen gehen nicht vom aktuellen Namespace aus, du musst also in jedem Fall den kompletten Namespace zusammenbauen.
      Na ja, hatte ich ja schon probiert:
      Code:
              $controller = '\Joy\Controllers'.ucfirst($route[0]).'Controller';
              $controller = new $controller;
      Problem ist, es fehlt ein Backslash. Aber wenn ich es so probiere:
      Code:
      $controller = '\Joy\Controllers\'.ucfirst($route[0]).'Controller';
      Würde ich auch erst recht eine Fehlermeldung erhalten, weil dann noch ein einige Anführungszeichen fehlen würden & co.
      Habt Ihr nicht eine Idee wie ich dieses Problem lösen kann? :S

      MfG.
      Dir gefällt mein Beitrag, ich habe Dir geholfen?
      Bewerte mich doch einfach!

      Kommentar


      • #4
        Zitat von NecmiH Beitrag anzeigen
        Problem ist, es fehlt ein Backslash.
        Warum? Pack ihn halt mit in den String, damit er eben nicht mehr fehlt.
        [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

        Kommentar


        • #5
          PHP-Code:
          $controllerClass sprintf("Joy\\Controllers\\%s\\Controller"ucfirst($route[0]));
          $controller = new $controllerClass
          Alternativ Reflections nutzen wenn du auf was spezielles der Klasse reagieren willst oder die Klasse validieren musst.

          PHP-Code:
          $controllerReflection(sprintf("Joy\\Controllers\\%s\\Controller"ucfirst($route[0])));
          $controller $controllerReflection->newInstance(); 
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Sind Namespaces überhaupt case-sensitiv? Ich glaube nicht.
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Bitte verwende kein die() in deinen Scripten, wenn dies nicht absolut notwendig ist, an dieser Stelle. Besser Exceptions verwenden, diese können auch abgefangen werden können im Gegensatz zu die.

              Mit einem Autoloader wäre das ganze vermutlich auch einfacher, da es scheint, dass deine Namespaces und Klassennamen in der Verzeichnisstruktur (bis auf die evtl. inkonsistente Gross-/Kleinschreibung) auftauchen.

              Ich bevorzuge es die if-Abfragen ein wenig zu entschachteln für mehr Übersichtlichkeit.


              PHP-Code:
              spl_autoload_register(function($className) {
                  
              $fileName APP_ROOT.'/'.str_replace('\\''/'$className).'.php';
                  include 
              $fileName;
              });


              if(isset(
              $route[0])) {
                  
              $controllerClass sprintf("Joy\\Controllers\\%sController"ucfirst($route[0]));

                  if(!
              class_exists($controllerClass)) {
                      throw new 
              Exception(sprintf('Controller "%s" not found'$route[0));
                  }

                  
              $controller = new $controllerClass();

                  if(!
              method_exists($controller'Main')) {
                      throw new 
              Exception('Method "Main" not found');
                  }

                  
              $controller->Main();

              Kommentar


              • #8
                PHP-Code:
                    if(!method_exists($controller'Main')) {
                        throw new 
                Exception('Method "Main" not found');
                    } 
                Sowas regelt man besser über ein Interface.
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar

                Lädt...
                X