Klasse in einer anderen Klasse verwerden?

ich habe noch ne weitere frage, hoffentlich die letzte ;)

PHP:
<?php
class Connection {

    // Speichert die Instanz der Klasse
    private static $instance;

    // Ein private Konstruktor; verhindert die direkte Erzeugung des Objektes
    private function __construct()
	{
		$dbname = "cdcol";
		$user = "root";
		$password = "";

		try
		{
			$this->instance = new PDO("mysql:host=localhost; $dbname", $user, $password);
		}
		catch (PDOException $e)
		{
			echo 'Fehler beim Öffnen der Datenbank: ' . $e->getMessage();
		}
	}

    // Die Singleton Funktion
    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new Connection();
        }

        return self::$instance;
    }

    // Halte Benutzer vom Klonen der Instanz ab
    public function __clone()
    {
        trigger_error('Klonen ist nicht erlaubt.', E_USER_ERROR);
    }


public function holeBenutzerId($benutzername)
{
    $sql = "SELECT benutzerid FROM benutzer WHERE benutzername = :benutzername";
	$stmt = $this->instance->prepare($sql);
	$stmt->bindParam( ':benutzername', $benutzername);
	$result = $stmt->execute();
	if(!$result) echo "FEHLER BEI ABFRAGE (benutzerid)<br";
	$data = $stmt->fetch(PDO::FETCH_OBJ);
	return $data->benutzerid;
}

public function Rights($typ,$userid)
{
	$sql = "SELECT $typ FROM benutzerrechte WHERE benutzerid = :benutzerid";
	$stmt = $this->instance->prepare($sql);
	$stmt->bindParam( ':benutzerid', $userid);
	$result = $stmt->execute();
	if(!$result) echo "FEHLER BEI ABFRAGE (rechte)<br";
	$data = $stmt->fetch(PDO::FETCH_OBJ);
	return $data->$typ;
}
}

Nun will ich dass die Methode holeBenutzerId und Rights auf meine Connection zugreifen können, aber irgendwie funktioniert das nicht weil $instance ja static ist.

Meine index.php beinhaltet folgendes, muss ich daran auch noch was ändern oder nur in den Methoden?
PHP:
  $RECHTE = Connection::getInstance();
  $userid = $RECHTE->holeBenutzerId($_SESSION['benutzername']);
$rights = $RECHTE->Rights($pagename,$userid);
 
ich hab das nur mal so konstruiert zum testen
denn wenn ich die singleton-klasse zum DB-connecten auslager wird es noch schwerer für mich alles zum laufen zu bringen ;)

aber ich versuchs mal
 
ok ich habs nun ausgelagert:

config.php:
PHP:
<?php
class Connection {

    // Speichert die Instanz der Klasse
    private static $instance = null;

    // Ein private Konstruktor; verhindert die direkte Erzeugung des Objektes
    private function __construct()
	{
		$dbname = "mysql:dbname=cdcol;host=localhost";
		$user = "root";
		$password = "";

		try
		{
			$this->instance = new PDO($dbname, $user, $password);
		}

		catch (PDOException $e)
		{
			echo 'Fehler beim Öffnen der Datenbank: ' . $e->getMessage();
		}

	}

    // Die Singleton Funktion
    public static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new Connection();
        }

        return self::$instance;
    }

    // Halte Benutzer vom Klonen der Instanz ab
    public function __clone()
    {
        trigger_error('Klonen ist nicht erlaubt.', E_USER_ERROR);
    }

}

?>


funktion.php:
PHP:
<?php
require("config/config.php");

class DB {

    public $instance;

    public function __construct()
	{
		$this->instance = Connection::getInstance();
	}



public function holeBenutzerId($benutzername)
{
    $sql = "SELECT benutzerid FROM benutzer WHERE benutzername = :benutzername";
	$stmt = $this->instance->quote->prepare($sql);
	$stmt->bindParam( ':benutzername', $benutzername);
	$result = $stmt->execute();
	echo var_dump($result);
	if(!$result) {echo "FEHLER BEI ABFRAGE (benutzerid)<br";}
	else {}

	$data = $stmt->fetch(PDO::FETCH_OBJ);

	return $data->benutzerid;
}
}
?>


Klappt aber immer noch nicht.
Immer der Fehler:
Call to a member function prepare() on a non-object in...

$stmt = $this->instance->quote->prepare($sql);

irgendwie passt da bei der $instance etwas nicht keine ahnung was
 
Eine Alternative duerfte doch die Verwendung von Referenzen darstellen, oder?
Ich selbst nutze dies z.B. in meiner Klasse um Sessions in der Datenbank zu speichern, wobei die Datenbankverbindung halt aus meiner Datenbank-Klasse kommt. Da diese ja auch im eigentlichen Code genutzt wird uebergebe ich der Session-Klasse lediglich eine Referenz auf die Datenbank-Klasse und umgehe somit das Problem zwei Instanzen haben zu muessen.
 
ja wäre auch ne möglichkeit
bietet diese vorteile?


By the way:
Ich habs jetzt hinbekommen!
wenn ich $instance aus meiner connection klasse public anstatt private schreibe und folgendes verwende funktioniert es:

PHP:
$stmt = $this->instance->instance->prepare($sql);

nur wie bekomme ich es hin dass ich die es verwenden kann wenn $instance private ist?!
 
Was ich daran vorteilhaft finde ist dass man sich nicht mit Singletons oder anderem Kram rumschlagen muss, sondern einfach die Klassen wie gewohnt schreibt und verwendet. ;)

Um die Instanz in der Klasse private deklarieren zu koennen und trotzdem von aussen drauf zu zu greifen brauchst Du die Methode __get()

Hier mal ein Beispiel aus meiner Template-Klasse:
PHP:
public function __get($name)
{
	return $this->getcontent($name);
}

Oder aber Du machst es ganz einfach ueber eine normale Methode.
Der Unterschied ist lediglich wie es dann im Code aussieht.
Methode __get():
PHP:
$obj->irgendwas
Normale Methode:
PHP:
$obj->irgendwas()

Auf jeden Fall laeuft es halt darauf hinaus eine Methode zu schreiben die mittels return die Instanz zurueckgibt.
 
Zurück