[PHP] Namensraum einer Klasse.

krizzelfix

Commander
Registriert
Sep. 2005
Beiträge
2.626
Hallo User,

ich habe mir eine Klasse erstellt mit der ich die Verbindung zur Datenbank verwalten will.
Am Anfang in der Index Datei erstelle ich dann eine neue Instanz der Klasse:
PHP:
include('inc/class.sql.inc.php5');

$Database = "******";
$DatabaseHost = "****";
$DatabasePassword = "****";
$DatabaseUser = "****";
$SQL = new SQL($Database, $DatabaseHost, $DatabasePassword, $DatabaseUser, false);

include('class.function.php5');
include('ipblocker.inc.php5');
Nur wenn ich jetzt eine Funktion aus der class.function.php5 aufrufe, bekomm ich immer den Fehler
Notice: Undefined variable: SQL in /var/www/ud08_125/html/test/class.function.php5 on line 370

Fatal error: Call to a member function query() on a non-object in /var/www/ud08_125/html/test/class.function.php5 on line 370

Habe schon probiert ein Globales Objekt zu erstellen, aber dann wir an einer anderen Stelle der gleiche Fehler ausgegeben.

Danke im vorraus.

Grüße

tewes
 
Was du meinst ist der Gültigkeits- bzw. Sichtbarkeitsbereich (Scope) von Variablen ;)

Bau dir einen Singleton für die Klasse SQL und hol dir die Instanz innerhalb der Funktionen von diesem Singleton:

PHP:
public class TewesSQL extends SQL
{
  private static $instance;

  public static function getInstance()
  {
    if (!isset(self::$instance)) {
      try {
        self::$instance = new SQL(...);
      } catch (Exception $e) {
        throw $e;
      }
    }

    return self::$instance;
  } //  end func getInstance

} // end class TewesSQL

public function foo()
{
  $SQL = TewesSQL::getInstance();
  ...
} // end func foo

greetings, Keita
 
Hallo Keita,

erstmal danke für dein Antwort.

Habe aber noch ein paar fragen.
Muss in die Klasse noch ein Construct und destruct definiert sein?
Bekomme immer eine Fehlermeldung:
Fatal error: Call to private SQL::__destruct() from context '' in /var/www/ud08_125/html/test/class.function.php5 on line 2
Mein Quelltext sieht zz so aus.
PHP:
class Basic_SQL extends SQL {
	private static $instance;
	public  static function  getinstance () {
		if (!isset(self::$$instance)) {
			try {
				self::$instance = new SQL(....);
			}
			catch (Exception $e){
				throw $e;
			}
		}
		return self::$instance;
	}
}
Und am anfang der Datei mit den ganzen Funktionen rufe ich:
PHP:
$SQL = Basic_SQL::getinstance();
auf.
Oder muss ich das in jeder Funktion erneut aufrufen?

Grüße

tewes
 
Einen Destruktor als private zu deklarieren ist irgendwie keine gute Idee, da er gar nicht aufgerufen werden kann... Du kannst das Problem dadurch umschiffen, daß du in Basic_SQL einen als public deklarierten Destruktor definierst:
PHP:
class Basic_SQL extends SQL {
    private static $instance;
    public  static function  getinstance () {
        if (!isset(self::$$instance)) {
            try {
                self::$instance = new SQL(....);
            }
            catch (Exception $e){
                throw $e;
            }
        }
        return self::$instance;
    }

    public function __destruct()
    {
    }
}

Den Singleton mußt du in jeder Funktion aufrufen, in der eine Instanz von SQL benötigt wird, er sorgt dafür, daß nur eine einzige Instanz erzeugt wird und bei konsekutiven Anforderungen auf diese Instanz zurückgegriffen wird.

greetings, Keita
 
Muss ich das Objekt vorher noch in der Funktion speichern oder so?
Jetzt bekomm ich immer den Fehler
Fatal error: Call to a member function query() on a non-object in /var/www/ud08_125/html/test/class.function.php5 on line 377
D.H. ja eigentlich das noch nichts in der getInstance() gespeichert wurde.
 
Hurz... was spuckt denn var_dump($SQL) aus, wenn du den Singleton aufgerufen hast? Es sollte ein Objekt der Klasse SQL sein.

greetings, Keita
 
da bekomme ich dass ausgegeben:
object(SQL)#3 (5) { ["connection_id"]=> resource(2) of type (mysql link) ["last_error"]=> string(0) "" ["all_error"]=> array(0) { } ["all_querys"]=> array(0) { } ["debug"]=> bool(false) }
Das sind nur die Variablen der Klasse.
 
Dann ist alles soweit richtig, var_dump() gibt nur die Eigenschaften eines Objekts aus, jedoch nicht die Methoden.
Den o.g. Fehler bekommst du, wenn du $SQL->query() aufrufst? Vergiß nicht, daß der Singleton in allen Funktionen und Methoden aufgerufen werden muß, um $SQL zu initialisieren.

greetings, Keita
 
bekommst du, wenn du $SQL->query() aufrufst?

Ja aber komischer Weise nicht beim ersten aufruf. :confused_alt:
PHP:
function get_clicks($dir, $pic)
{
	$SQL = Basic_SQL::getinstance();
	$result = $SQL->query("SELECT * FROM `pic` WHERE `show`='".$dir."' AND `pic`='".$pic."' LIMIT 1");//Zeile 380
	if (mysql_affected_rows() == 0) {
		$result = $SQL->query("INSERT INTO `pic` SET `clicks`=0, `show`='".$dir."', `pic`='".$pic."'");
	}
	$SQL = "SELECT * FROM `pic` WHERE `show`='".$dir."' AND `pic`='".$pic."' LIMIT 1";
	$result = $SQL->query($SQL);//Zeile 385
	$clicks = mysql_fetch_array($result, MYSQL_ASSOC);
	return $clicks['clicks'];
}
Bekomme den Fehler in Zeile 385. Sollte ja eigentlich gehen, da es in Zeile 380 auch klappt.
 
Nee, du überschreibst die Instanz von SQL aus Zeile 379 mit einem String in Zeile 384, so kann das nicht funktionieren ;) Nenn die Variable mit dem Query einfach $query oder $sql, dann klappts auch in Zeile 385:
PHP:
$sql = "SELECT * FROM `pic` WHERE `show`='".$dir."' AND `pic`='".$pic."' LIMIT 1";
$result = $SQL->query($sql);

greetings, Keita
 
Na toll das hat man vom suchen&ersetzen-.-

Aber jetzt Funktioniert es soweit.

Vielen Danke Keita

Mit freundlichen Grüßen

tewes
 
Zurück
Oben