php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.08.2010, 13:16  
Neuer Benutzer
 
Registriert seit: 06.09.2003
Beiträge: 14
McLain
Standard 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 SavantCBootstrap::$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?
McLain ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.08.2010, 14:31  
Erfahrener Benutzer
 
Registriert seit: 23.08.2010
Beiträge: 492
PHP-Kenntnisse:
Fortgeschritten
mimomamu sorgt für eine eindrucksvolle Atmosphäremimomamu sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
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

Geändert von mimomamu (27.08.2010 um 14:43 Uhr).
mimomamu ist offline   Mit Zitat antworten
Alt 27.08.2010, 14:45  
Neuer Benutzer
 
Registriert seit: 06.09.2003
Beiträge: 14
McLain
Standard

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.

Geändert von McLain (27.08.2010 um 14:52 Uhr). Grund: Ich habe die php-bbcodes entfernt, da sonst der backslash escaped wird
McLain ist offline   Mit Zitat antworten
Alt 27.08.2010, 17:37  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

ä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
robo47 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Namespaces: Fremde API importieren Griffith PHP Tipps 2010 2 16.03.2010 16:25
Definierte Variable auf nächster Seite nutzen Extremefall PHP Tipps 2009 10 02.01.2010 19:10
MySQL Verbindung in Function nutzen ohne zusätzlichen Parameter dsmcg PHP Tipps 2009 7 07.04.2009 08:58
PHP Namespaces ab 5.3 drsoong Off-Topic Diskussionen 18 25.09.2008 09:57
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
externe Variable im Skript ausgeben kampfnickel PHP Tipps 2007 17 29.01.2007 18:05
Klassen sinnvoll nutzen, Grundlegendes nikosch PHP-Fortgeschrittene 1 30.09.2006 22:08
Mit Apache über einen Proxy auf externe quellen zugreifen Server, Hosting und Workstations 4 24.10.2005 13:23
Externe HTML oder PHP Datei auslesen (von XAMPP ins WWW) PHP Tipps 2005-2 4 09.09.2005 08:12
[Erledigt] Design Pattern - MySQL Sitzung in allen Objekten nutzen PHP-Fortgeschrittene 21 28.04.2005 22:18
Externe Datei auslesen und auf Webspace speichern Beitragsarchiv 9 19.04.2005 16:44
Variabel aus while schleife ausserhalb der schleife nutzen PHP Tipps 2005 8 12.02.2005 18:04
[Erledigt] Externe Mysql Datenbanken 3 06.10.2004 17:55
Externe Referenzen in Klassen nutzen PHP Tipps 2004 3 16.08.2004 21:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php externe api aufrufen, http://www.php.de/php-fortgeschrittene/71203-externe-api-ohne-namespaces-nutzen.html, php externe api, php klassen ohne namespace, php externe klasse, xampp externer api, php - fremde namespaces laden, php class ohne namespace aufrufen, php auf externen namespace, twig template namespace, twig namespace in template, api ohne php, jwplayer hd youtube not set, ohne namespace, twig nutzen, php dateien mit und ohne namespace, twig klassen template, php twig, example twig_loader_filesystem, php api nutzen

Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum