Ankündigung

Einklappen
Keine Ankündigung bisher.

externe API ohne Namespaces nutzen

Einklappen

Neue Werbung 2019

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

  • externe API ohne Namespaces nutzen

    Folgendes Problem:

    Benutzt wird ein Framework, welches auf PHP5.3 aufbaut und dementsprechend auch Namespaces verwendet. Als Template-Engine soll Twig benutzt werden, welches aber noch keine Namespaces unterstützt. Wenn ich nun aus dem Framework heraus Twig-Klassen aufrufen möchte sagt PHP es kenne die Klasse nicht.

    Beispiel:
    PHP-Code:
    class CTwig extends AEngine implements IEngine
    {
        
    /**
         * twig environment
         * @var Twig_Environment
         */
        
    private $twig null;

        
    /**
         * create twig template engine instance
         * @param string $pSection
         */
        
    public function __construct($pSection 'default')
        {
            
    parent::__construct($pSection);
            
    spl_autoload_register(array(__CLASS__,'loadClass'));
            
    $loader = new \Twig_Loader_Filesystem($this->TEMPLATE_DIR);
            
    $options = array('cache' => $this->COMPILE_DIR);
            
    $this->twig = \Twig_Environment($loader$options);
        }
        
        
    /**
         * class loader for twig classes
         * @param string $pClass twig class
         */
        
    public function loadClass($pClass)
        {
            
    $twigDir = \Savant\CBootstrap::$EXT_DIR . \DIRECTORY_SEPARATOR 'Twig' . \DIRECTORY_SEPARATOR 'lib';
            
    $pClass = \array_reverse(\explode('\\'$pClass));
            
    $twigFile $twigDir . \DIRECTORY_SEPARATOR str_replace('_', \DIRECTORY_SEPARATOR$pClass[0]) . '.php';
            if(!\
    file_exists($twigFile))
            {
                throw new 
    ETwig("can't find Twig class in %s"$twigFile);
            }
            require_once 
    $twigFile;
        } 
    Die Klasse Twig_Loader_Filesystem implementiert aber das Interface Twig_LoaderInterface, das durch den Autoloader auch korrekt gefunden wird, allerdings nicht aufgerufen werden kann, da ihm kein \ vorangestellt ist.

    Kann ich dieses Problem irgendwie umgehen, ohne den Code von Twig anpassen zu müssen?

  • #2
    Zitat von McLain Beitrag anzeigen
    Die Klasse Twig_Loader_Filesystem implementiert aber das Interface Twig_LoaderInterface, das durch den Autoloader auch korrekt gefunden wird, allerdings nicht aufgerufen werden kann, da ihm kein \ vorangestellt ist.
    Was meinst du damit? Interfaces werden nicht aufgerufen, sie werden implementiert. An welcher Stelle in deinem Code kommt eine Fehlermeldung und um welche Fehlermeldung handelt es sich?
    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

    Kommentar


    • #3
      In folgender Zeile tritt der Fehler auf:

      $loader = new \Twig_Loader_Filesystem($this->TEMPLATE_DIR);


      Twig_Loader_Filesystem implementiert Twig_LoaderInterface, der Twig Code sieht also wie folgt aus:

      class Twig_Loader_Filesystem implements Twig_LoaderInterface {}

      müsste aber so aussehen:

      class Twig_Loader_Filesystem implements \Twig_LoaderInterface {}


      Ich kann also Twig_LoaderInterface nicht im globalen Namespace implementieren, sonst müsste ich den Twigcode dementsprechend ändern.

      Kommentar


      • #4
        ähm wenn eine datei in der klassen und interfaces definitiert sind keinen namespace enthält, dann haben führende \ da auch nichts zu suchen, das müsste dann imho ein bug in deinem autoloader sein, der ein \ erwartet, aber keins findet oder ähnliches.

        Debugge doch mal deinen autoloader und schau was er als klasse übergeben bekommt und welchen pfad er daraus generiert den er dann nicht laden kann, dort sollte wohl der fehler zu finden sein.

        hätte den code ja mal getestet aber zu faul mir jetzt serpent, twig und alles runterzuladen und ne umgebung einzurichten für.

        Ansonsten schau dir mal eine PSR-0-kompatible autoloader-implementierungen an, die können PEAR-Style-Class-Loading mit und ohne Namespaces (z.b. der von Symfony2, der hat auch sonst keine dependencies), dann musst du nämlich nicht umständlich für jede deiner libs die du nutzen willst und die PEAR-Naming (ob mit oder ohne namespaces) folgt nen eigenen autoloader schreiben, testen und einbinden.

        -> src/Symfony/Framework/UniversalClassLoader.php at master from symfony's symfony - GitHub
        [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
        | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

        Kommentar

        Lädt...
        X