Guten Morgen zusammen,
vielleicht hat jemand die Geduld mir zu erläutern, wie PHP Klasseninstanzen zählt. Beispiel:
[PHP]
$shopdb = new DB ();
var_dump($shopdb); // ergibt: object(DB)#1 (1) { [„shopdb“:„DB“:private]=> object(PDO)#2 (0) { } }
$shopdb = new DB ();
var_dump($shopdb); //ergibt: object(DB)#3 (1) { [„shopdb“:„DB“:private]=> object(PDO)#4 (0) { } }
[/PHP]Es wird also 2 x hintereinander derselbe Variablenname vergeben.
Ich versuche nun die Logik zu ergründen, mit der die Objekte numeriert werden. Aber erst Object 1, dann Object 3? Ich nix verstehen.
Well, Du hast recht, war ein bisserl knapp, die Frage.
Meine Klasse sieht so aus:
[PHP]
class DB {
private $shopdb;
public function __construct()
{
/*
* ATTR_PERSISTENT = Verbindung offen halten
* MYSQL_ATTR_USE_BUFFERED_QUERY = wenn mehrere Abfragen hinereinander dann puffern
* ATTR_ERRMODE = jeder Fehler wirft eine Exception
* ATTR_DEFAULT_FETCH_MODE = Abfragen geben ein assoziatives Array zurück
* query(‚SET NAMES utf8‘) = Abfragen geben UTF8 zurück
*/
$options = array
(
PDO::ATTR_PERSISTENT => true,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
);
$this->shopdb = new PDO('mysql:host=localhost;dbname=' . CON_DBNAME, CON_DBUSER, CON_DBPASS, $options);
$this->shopdb->query('SET NAMES utf8');
// var_dump($this->db);
}
public function getDB()
{
return $this->shopdb;
}
};
[/PHP]
Jetzt mache ich mir Gedanken, was wohl passiert, wenn ich mehrere DB-Objekte erzeuge. Vermutlich ist das ja mindestens Speicherverschwendung, vielleicht hat’s sogar Nebenwirkungen, die ich nicht kenne.
Um diesbezüglich Erleuchtung zu finden (om mani padme hum) hab’ ich mal ein bissserl experimentiert und bin gleich über die Zählung gestolpert.
Welche Lücken?
Das bei dir 1,2,3 fehlen muss an etwas anderem liegen, nicht an dem Code, den du uns gezeigt hast.
Und ob PHP eine Debuggingmöglichkeit bietet, die Objekte zu zählen weiß ich nicht. Dazu müßtest du die Dokumentation danach durchsuchen. Aber sowas braucht man i.d.R. auch nicht.
Ich bin nicht sicher, ob meine Idee sinnvoll ist. Aber wie ich schon sagte: ich möchte vermeiden, daß z. B. ein DB-Connect per new erzeugt wird, wenn es noch einen gibt.
Du könntest die Instanz als Singleton deklarieren oder in einer Registry ablegen. Finde ich aber beides unschön. Ich würde Dependency Injection vorziehen, also einer Klasse, die die DB-Verbindung braucht, im Konstruktor eine Instanz übergeben.
Instanzen koennte man auch folgendermassen zaehlen:
[PHP]
<?php
class Test {
public static $count = 0;
function __construct() {
self::$count++;
}
function __destruct() {
self::$count--;
}
}
$test1 = new Test();
$test2 = new Test();
var_dump(Test::$count);
$test1 = new Test();
var_dump(Test::$count);
$test2 = null;
var_dump(Test::$count);
?>
[/PHP]
Ich bin mir jetzt aber nicht sicher, ob du sowas gesucht hast…
Danke für eure Antworten. Ich glaube, die Anregung von mermshaus „Dependancy Injection“ ist der richtige Weg.
Es macht micht trotzdem neugierig, ob es nicht eine Möglichkeit gibt Objekte zu zählen; ich meine jenseits der Idee von Anusha, die Dingers schon beim Entstehen zu numerieren.
Naja bei meinem Code werden ja nicht die Objekte numeriert, sondern einfach per Klassenvariable die Anzahl der Instanzen gezaehlt
Also die $count Variable sagt nichts anderes, als wie Die momentane Anzahl der erzeugten Instanzen.