Hi,
wenn ich in einem Inhaltselement oder Modul eine eigene kleine Klasse einsetze, wie kann ich aus dieser Klasse heraus die Datenbank oder Log-Funktion ansprechen? Mit $this->... gehts ja logischerweise nicht mehr!
Druckbare Version
Hi,
wenn ich in einem Inhaltselement oder Modul eine eigene kleine Klasse einsetze, wie kann ich aus dieser Klasse heraus die Datenbank oder Log-Funktion ansprechen? Mit $this->... gehts ja logischerweise nicht mehr!
Musst sie dir holen :)
PHP-Code:
$this->import('Database');
Ah du bist komplett ausserhalb :D
Äh, nicht sonderlich schlau...du bist ausserhalb des Systems. Ich würde halt von Backend erben lassen :)
Ist eine Frage von "was willst du nutzen?" :)
Ja, kommt ja vielleicht noch mehr dazu ;) Aber hast schon Recht, wenn man's genau nehmen will, dann System :)
Der Tipp mit System ist gut. Nur eines fehlt noch, ich muss auch auf die Klasse Environment zugreifen, das scheint mit System nicht zu gehen. Oder kann ich das auch importieren
mit $this->import(Environment); ?
Hi
laut api.https://contao.org wird Environment schon im Konstruktor im importiert und ist dann unter $this->Environment verfügbar.
Gruß b2m
Also bei mir funktioniert es nur wenn ich es zusätzlich mit Import übernehme, habs ausprobiert. Ist die API Doku falsch oder muss ich den Construktur von Systems manuell noch aufrufen? Hier Codeauszug:
Code:class Paypal extends System
{
public function __construct()
{
$this->import('Environment');
$this->import('Database');
...
}
Hi
versuche es doch mal mit einem
in deiner __construct().PHP-Code:
parent::__construct();
Gruß b2m
Geht's nicht so?
dann hast du Zugriff:Code:$objEnv = $this->Environment->getInstance();
undCode:string __get (string $strKey) // $Key abfragen
also z.B.Code:void __set (string $strKey, mixed $varValue) // $Key eintragen
Code:echo $objEnv->__get('url'); //Rückgabe der aktuellen URL ohne Pfad und Querystring
Guten Morgen Seitengestalter,
theoretisch geht es auch so, wie du es beschrieben hast. Aber was wenn Leo jetzt beschließen sollte ein anderes Design Pattern zu verwenden, das Singleton für Environment ersetzt oder eine __construct() mit Parametern für Environment definiert?
Dann funktioniert dein Code plötzlich nicht mehr , wohingegen die Lösung mit parent::__construct() (ist glaube ich eine Form des Fabric Patterns) bzw. $this->import('Environment'); auch weiterhin funktionieren wird, da in diesen Fällen das Typolight-Framework für eine korrekte Initialisierung des Objektes sorgt.
Gruß b2m
Moin alle,
also __set() und __get() sind NICHT dafür vorgesehen, direkt aufgerufen zu werden! Es sind magische Methoden, die von PHP aufgerufen werden, wenn eine unbekannte Member-Variable zugegriffen wird. Siehez.B. hier.
Natürlich nur, wenn die Methoden __set/__get 'abc' bzw. 'xyz' auch behandeln.PHP-Code:
// Falsch:
echo $object->__get('abc');
$object->__set('xyz', $some_value);
// Richtig:
echo $object->abc;
$object->xyz = $some_value;
Die eigene Definition eines Konstruktors a la
ist, wenn ich richtig informiert bin, für einige älter PHP 5 Versionen nötig, weil in denen der Konstruktor der Superklasse nicht automatisch aufgerufen wurde, wenn man keinen Konstruktor definiert hatte; ein Bug in diesen Versionen, ich glaube, der wurde in 5.3 gefixt. Jedenfalls erforderlich ist der Aufruf von parent::__construct(), wenn man einen eigenen Konstruktor definiert hat, egal, ob er noch andere Initialisierungen vornimmt, oder nicht.PHP-Code:
public __construct()
{
parent::__construct();
}
LG, Georg
Hi Georg,
danke für deine sinnvollen Ergänzungen. Das mit den Gettern und Settern habe ich ganz übersehen :cool:
Gruß b2m