Hi Carsten_R,
Gibt es da denn keinen einfacheren Weg? Ich verstehe das mit dem überladen nämlich noch nicht so ganz...
Keiner zwingt dich dazu, die Überladungen zu nutzen, du kannst auch herkömmliche Get/Set-Methoden nehmen ;-)
define('CARSTEN_CONFIG_FILE', '/pfad/zur/config.ini');
class Carten_Config {
private static $instance = NULL;
private $config = array();
private function __construct() {
// hier musst du die Konfigurationen einlesen
// z.B. so:
$this->config = parse_ini_file(CARSTEN_CONFIG_FILE);
}
public static function getInstance() {
if (self::$instance === NULL) {
self::$instance = new Singleton;
}
return self::$instance;
}
private function __clone() {}
public function get($value) {
if(!isset($this->config[$value]))
throw new Exception('Config entry ' . $value . ' not found.');
return $this->config[$value];
}
}
// Aufruf wie folgt:
$config = Carsten_Config::getInstance();
echo $config->get('ini_eintrag');
// oder:
echo Carsten_Config::getInstance()->get('ini_eintrag');
Das dürfte als funktionierendes Beispiel schon reichen. Wenn man es ganz sauber objektorientiert programmieren will, sollte man sich vielleicht noch was anderes überlegen, anstatt der Konstante mit dem Pfad zur INI-Datei.
Wenn du dann das jetzt hast, kannst du dir überlegen, ob du die Eigenschaften überladen willst - ist nicht schwer, du musst für deinen Fall eigentlich nur eine Methode hinzufügen, ganz ähnlich wie es im PHP-Manual steht. Letzendlich hast du dann direkten Zugriff auf die Einstellungen der INI über
$config = Carsten_Config::getInstance();
echo $config->ini_eintrag();
Spart etwas Tiparbeit ;-)
ich brauche nen Weg wie ich einfach in einer Unterklasse statt $GLOBALS['smarty']->assign() $smarty->assign() schreiben kann am besten ohne in den einzelnen Klassen noch einen Zusatz zu schreiben. Diese Klassen existieren nämlich eigentlich schon.
Sven hat dir ja schon erklärt, wie ein geeignetes Vorgehen hierfür aussieht. Du übergibst entweder dem Konstruktor der Klasse eine Referenz auf deine Config-Klasse, oder die Klasse holt sich im Konstruktor (oder an den Stellen wo du es benötigst) selber eine Referenz auf deine Config-Klasse, was dank Singleton ja problemlos möglich ist.
Obiges Beispiel war jetzt für eine Klasse, welche eine INI-Datei einliest, weil du im Ausgangsposting von $SETTINGS sprachst, welches du gerne hättest ;-)
Natürlich kannst du auch eine Smarty-Singleton-Klasse erstellen, du musst nur bedenken, dass du dann immmer dasselbe Smarty-Objekt hast und wenn du bereits zugewiesene Variablen löschen willst, dies explizit machen musst.
Ich habe so etwas ähnlich schon mal in einem Projekt verwendet, hier ein Auszug aus meinem damaligen Quellcode, angepasst auf dich:
define('CARSTEN_TEMPLATE_PATH', '/pfad/zu/smarty/templates');
define('CARSTEN_TMP_PATH', '/pfad/zum/tmp/order/deines/projekts');
define('CARSTEN_CONFIG_PATH', '/pfad/zum/config/order');
class Carsten_Smarty extends Smarty {
static private $instance = null;
static public function getInstance() {
if(self::$instance == NULL) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
private function __construct() {
$this->template_dir = CARSTEN_TEMPLATE_PATH;
$this->compile_dir = CARSTEN_TMP_PATH . 'smarty_c';
$this->cache_dir = CARSTEN_TMP_PATH . 'smarty';
$this->config_dir = CARSTEN_CONFIG_PATH . 'smarty';
}
}
Hiermit kannst du dir deine Smarty-Instanz jederzeit über
$smarty = Carsten_Smarty::getInstance();
holen und damit arbeiten. In dem Konstruktor obiger Klasse werden die Pfade aus (globalen) Konstanten gelesen. Das ist im Sinne von OOP natürlich nicht unbedingt so schön, eine Alternative wäre die Verwendung unserer obigen Config-Klasse:
private function __construct() {
$config = Carsten_Config::getInstance();
$this->template_dir = $config->get('smarty_template_dir');
$this->compile_dir = $config->get('smarty_compile_dir');
$this->cache_dir = $config->get('smarty_cache_dir');
$this->config_dir = $config->get('smarty_config_dir');
}
Dazu bastelst du dir dann einfach noch eine passende INI-Datei :-)
Viele Grüße,
~ Dennis.
Mein SelfCode: [link:http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%7C+mo%3A%7D+zu%3A%7C@title=ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|