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

  • NecmiH
    hat ein Thema erstellt Namespace mit einer Variable kombinieren?.

    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.

  • nikosch
    antwortet
    PHP-Code:
        if(!method_exists($controller'Main')) {
            throw new 
    Exception('Method "Main" not found');
        } 
    Sowas regelt man besser über ein Interface.

    Einen Kommentar schreiben:


  • Blar
    antwortet
    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();

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Sind Namespaces überhaupt case-sensitiv? Ich glaube nicht.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    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(); 

    Einen Kommentar schreiben:


  • tkausl
    antwortet
    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.

    Einen Kommentar schreiben:


  • NecmiH
    antwortet
    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.

    Einen Kommentar schreiben:


  • tkausl
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X