Chris86 Geschrieben 6. März 2007 Geschrieben 6. März 2007 Hoi, ich habe ein Problem. Wenn ich versuche darauf zuzugreifen kommt ein Fehler. Kann mir jemand sagen an was das liegt? <?php class DBConnection { private $db['host'] = 'localhost'; // Datenbank Host private $db['user'] = 'root'; // Datenbank Benutzername private $db['pass'] = ''; // Datenbank Passwort private $db['db'] = 'test'; // Datenbankname public getHost(){ return $db['host']; } public getUser(){ return $db['user']; } public getPass(){ return $db['pass']; } public getDB(){ return $db['db']; } } ?> [/PHP] Und hiermit versuche ich es abzufrage (Testmäßig) [PHP] <?php require("includes/db.inc.php"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>New Document</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> </head> <body> <?php $db = new DBConnect(); $connect = new mysqli($db->getHost(),$db->getUser(),$db->getPass(),$db->getDB()); if(!$connect){ echo "Es konnte keine Verbindung aufgebaut werden!"; }else{ echo "Alles lief bestens!"; $connect->close(); } ?> </body> </html> Und das ist der Fehler: Parse error: parse error, unexpected '[', expecting ',' or ';' in /srv/www/htdocs/clehmann/test/includes/db.inc.php on line 4 [/PHP] Mfg Chris Zitieren
Aiun Geschrieben 6. März 2007 Geschrieben 6. März 2007 du versuchst verschiedene Variablen zu definieren die gleich heißen aber andere Feldnamen haben. das geht nicht. private $db = array( 'host' => ..., 'user' => ..... ); das sollte gehen. ich würde dir jedoch empfehlen das im Konstruktor zu setzen, ist flexibler Und wenn du einen schritt weiter gehen möchtest, mach ein Singleton draus. (singleton-pattern in einer suchmaschine deiner Wahl) Zitieren
Chris86 Geschrieben 6. März 2007 Autor Geschrieben 6. März 2007 Ich weiß was ein Singleton ist Hatte ein Seminar über Design Pattern (Entwurf Muster) Danke nochmal! Zitieren
geloescht_JesterDay Geschrieben 7. März 2007 Geschrieben 7. März 2007 Der Felher liegt in Zeile 4, also hier: <?php class DBConnection { [b]private $db['host'] = 'localhost';[/b] Da du private und public nutzt, nutzt du also php 5 (davor gab es das nicht). In php 5 kannst du aber Felder in einer Klasse nicht so initialisieren bei der deklaration. Definier deine Felder und initialisiere sie im Konstruktor: <?php class DBConnection { private $db = array(); ... function __construct() { $db["host"] = "bla"; ... } [/php] Die Deklaration als Array ist sauberer, muss aber AFAIK bei php nicht unbedingt sein (sollte aber auf jeden Fall). Siehe: Beispiel 19.2. Einfache Klassendefinition ... Der Standardwert muss ein konstanter Ausdruck sein, keine (z.B.) variable, Klassenattribut oder Funktionsaufruf. [/Quote] Und bei dir ist der Standardwert ja keine Konstante. Ich hab dazu auch irgenwo mal einen vergleich zu php 4 gelesen, da wurde das expliziter beschrieben. Auch auf dieser Seite, aber finde es nicht mehr im Moment. Zitieren
Chris86 Geschrieben 8. März 2007 Autor Geschrieben 8. März 2007 Jetzt sieht das ganze so aus aber funktioniert nicht da er mir anzeigt das die Felder leer sind. also 'host, 'user', 'pass' und 'db'. <?php class DBConnection { private $db; function __construct(){ $db = array( 'host' => 'localhost', 'user' => 'test', 'pass' => 'test', 'db' => 'test' ); } public function getHost(){ return $db['host']; } public function getUser(){ return $db['user']; } public function getPass(){ return $db['pass']; } public function getDB(){ return $db['db']; } } ?> [/PHP] und hier die Index.php (die $connect ist auskommentiert) [PHP] <?php require("includes/db.inc.php"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>New Document</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> </head> <body> <?php $db = new DBConnection(); //$connect = new mysqli($db->getHost(),$db->getUser(),$db->getPass(),$db->getDB()); echo $db->getHost() . ", ". $db->getUser(). ", ". $db->getPass(); ?> </body> </html> An was liegt es das die Array Felder leer sind? Da ich das Array im Konstruktor fülle und ich ja eine neue Instanz der Klasse mache sollte er eigentlich den Konstruktor aufrufen was er, wie es scheint, jedoch nicht tut. Mfg Chris Zitieren
geloescht_JesterDay Geschrieben 9. März 2007 Geschrieben 9. März 2007 Beispiel 19.2. Einfache Klassendefinition <?php class SimpleClass { // Memberdeklaration public $var = 'ein Vorgabewert'; // Methodendeklaration public function displayVar() { echo $this->var; } } ?> OK, hier ist erstmal das mit dem Vorgabewert wieder drin, was man eigentlich so nicht tun sollte, AFAIK Aber was ich meine ist das $this, also bei dir: public function getHost() { return $this->db['host']; } [/php] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.