OOP und clone
Tom
- php
0 Sven Rautenberg1 globe
Hello,
was passiert mit dem Clone?
<?php ### clone_class.php ###
class test
{
public $testvar = 'Self HTML';
public function put()
{
echo $this->testvar.'<br>';
}
}
function clone_class($cl1)
{
$cl2 = clone $cl1;
$cl2->testvar = 'Get Script';
$cl1->put();
$cl2->put();
}
$testclass = new test;
clone_class($testclass);
?>
Was passiert mit dem Clone wenn die Funktion endet?
Wird der automatisch zerstört?
Harzliche Grüße vom Berg und Frohe Weihnachtszeit
Tom
Moin!
Was passiert mit dem Clone wenn die Funktion endet?
Wird der automatisch zerstört?
Was passiert mit lokalen Variablen, wenn eine Funktion endet?
- Sven Rautenberg
Hello,
Blöde Antwort!
Was passiert mit lokalen Variablen, wenn eine Funktion endet?
function neu($cnt)
{
$fh = array();
for ($i=1; $<=$cnt; $i++)
{
$fh[$i] = fopen('file$cnt','w+');
frite($fh,'Blödmann');
}
}
Mit dem Ende der Funktion endet die Lebensdauer der Variablen...
Würdest Du das so machen? Dann darfst Du Dir ein möglichst hohes $cnt aussuchen :-)
Ich finde meine Frage durchaus berechtigt und Deine Antwort daneben.
Wie beseitige ich ein Objekt?
Es gibt ein new aber kein dispose in PHP.
Harzliche Grüße vom Berg und Frohe Weihnachtszeit
Tom
n'abend,
Wie beseitige ich ein Objekt?
Es gibt ein new aber kein dispose in PHP.
a) werden Objekte dann zerstört, wenn es keine Referenzen mehr gibt, die auf sie zeigen. Eine Variable, die innerhalb einer Funktion definiert wird, ist halt nur um Scope der Funktion sichtbar. Ist die Funktion fertig, weiss niemand mehr was von dieser Variable; sie wird zerstört.
b) es gibt unset(). Was dir aber nur dann helfen wird, wenn das Objekt nicht noch anderer orts referenziert wird.
weiterhin schönen abend...
Hello,
b) es gibt unset(). Was dir aber nur dann helfen wird, wenn das Objekt nicht noch anderer orts referenziert wird.
Das bedeutet also, das Objekt wird automatsich mit zerstört, wenn seine _einzige_ Referenz gelöscht wird... Also keine Chance, Speicherleichen zu erzeugen. Ist doch schon mal 'was!
Wenn ich Kopien von der Referenz (nicht vom Objekt) anfertige, kann ich alle bis auf eine ruhig löschen, das Objekt bleibt dann trotzdem erhalten?
Harzliche Grüße vom Berg und Frohe Weihnachtszeit
Tom
n'abend,
Das bedeutet also, das Objekt wird automatsich mit zerstört, wenn seine _einzige_ Referenz gelöscht wird... Also keine Chance, Speicherleichen zu erzeugen. Ist doch schon mal 'was!
Das Objekt wird, wie jede andere Variable auch, zerstört, sobald der Scope (nach oben, also abschliessend) verlassen wird, in welchem es erstellt wurde.
Wenn du dir Sorgen um den Speicherverbrauch machst, würde ich mir zuerst mal die Frage stellen warum du hier überhaupt klonst. Ist das wirklich notwendig?
Wenn ich Kopien von der Referenz (nicht vom Objekt) anfertige, kann ich alle bis auf eine ruhig löschen, das Objekt bleibt dann trotzdem erhalten?
Ich kenne zwar deine Gründe für's Klonen nicht, aber prinzipiell ja. Dein Objekt, das du der Funktion übergibst, wurde ja ausserhalb - in einem höheren Scope - erstellt und ist somit nach Beendigung des inneren Scopes (nämlich der der Funktion) immer noch verfügbar. Was innerhalb der Funktion deklariert wurde, verschwindet nach dem Verlassen des (inneren) Scopes aus dem Speicher. Unabhängig davon, ob es ein Objekt, ein Array oder ein Primitive ist - so wie du das seit je her kennst.
weiterhin schönen abend...
Blöde Antwort!
Nein, war sie nicht.
Mit dem Ende der Funktion endet die Lebensdauer der Variablen...
Ja eben. Das beantwortet Dir doch Deine ursprüngliche Frage:
Was passiert mit dem Clone wenn die Funktion endet?
Wird der automatisch zerstört?
Deine ursprüngliche Frage war NICHT, wie Du Variablen manuell wieder los wirst VOR Ende der Funktion (worauf Dein Code anspielt). Wenn Du das meintest, dann hättest Du auch das fragen sollen. Woher soll Sven denn wissen, dass Du etwas ganz anderes meinst, als Du sagst?
Hello,
Mit dem Ende der Funktion endet die Lebensdauer der Variablen...
Ja eben. Das beantwortet Dir doch Deine ursprüngliche Frage:
Nein. Tut es nicht.
Was hat die Variable mit dem Speicherplatz für das Objekt zu tun?
Genau DAS wollte ich abe wissen.
Deine ursprüngliche Frage war NICHT, wie Du Variablen manuell wieder los wirst
Nein, sie war "Was passiert mit dem Clone, wenn die Funktion endet?"
Mit Clone war selbstverständlich der Clone des Objektes gemeint, und nciht eine Kopie einer Variable. Da ich kein "dispose" oder "finalize" oder ähnliches finden konnte im PHP-Manual, bestand meine Frage daraus, ob ich selber dafür sorgen muss, dass ein Objekt wieder aus dem Speicher entfernt wird, bevor ich die Referenz darauf aufgebe.
Ist doch klar formuliert gewesen.
Aber globe hat es mir inzwischen ja gepostet und Dank seiner Hilfe konnte ich auch weitere Erklärungen darüber finden.
Harzliche Grüße vom Berg und Frohe Weihnachtszeit
Tom
n'abend,
Mit dem Ende der Funktion endet die Lebensdauer der Variablen...
Ja eben. Das beantwortet Dir doch Deine ursprüngliche Frage:
Nein. Tut es nicht.
Was hat die Variable mit dem Speicherplatz für das Objekt zu tun?
Genau DAS wollte ich abe wissen.
Also eigentlich hat Sven dir eine korrekte Antwort gegeben.
Was ist denn eine "Variable" überhaupt? Ist das nicht einfach nur eine Referenz auf einen Bereich im Speicher? Ist dadurch nicht implizit klar, dass wenn die Variable zerstört wird, der zugeordnete Speicher ebenfalls freigegeben wird?
Wäre dem nicht so, würde ledigliche eine (von potentiell vielen) Referenzen auf den Speicherbereich aufgelöst, der Speicher an sich aber noch erhalten bleiben, da ja noch weitere Referenzen existeren.
Deine ursprüngliche Frage war NICHT, wie Du Variablen manuell wieder los wirst
Nein, sie war "Was passiert mit dem Clone, wenn die Funktion endet?"
Mit Clone war selbstverständlich der Clone des Objektes gemeint, und nciht eine Kopie einer Variable.
Was ist eine Kopie einer Variable? Ist das eine weitere Referenz auf den selben Speicherbereich (also keine wirkliche Kopie), oder ist das eine Referenz auf einen anderen Speicherplatz, der (zumindest anfangs) den Selben Inhalt hat? Ist dabei der Inhalt des Speicherbereichs nicht egal?
Da ich kein "dispose" oder "finalize" oder ähnliches finden konnte im PHP-Manual, bestand meine Frage daraus, ob ich selber dafür sorgen muss, dass ein Objekt wieder aus dem Speicher entfernt wird, bevor ich die Referenz darauf aufgebe.
PHP - Pubertierende Hauptschüler Programmieren - ist gemacht um möglichst schnell und unkompliziert ein Progrämmchen dahin rotzen zu können. Würde PHP vom Programmierer verlangen, dass er Speicher alloziert und dementsprechend auch wieder frei gibt, wäre es nicht da, wo es heute ist: marktführende Web-Scriptsprache.
PHP verfügt über einen GarbageCollector, der das Aufräumen des Speichers übernimmt - und den Programmierer damit nicht behelligt. Prinzipiell musst du da erst mal gar nichts selbst machen.
Aber globe hat es mir inzwischen ja gepostet und Dank seiner Hilfe konnte ich auch weitere Erklärungen darüber finden.
Ich habe dir den selben Sachverhalt mit höherem Wortaufwand erläutert - mehr nicht.
weiterhin schönen abend...
n'abend,
Was passiert mit dem Clone wenn die Funktion endet?
Wird der automatisch zerstört?
da es nach dem Verlassen des Funktionsblock keine offene Referenz mehr auf das Objekt gibt, wird es zerstört, korret. Wie es den __construct() Konstruktor gibt, gibt es auch den __destruct() Destruktor, der analog zum Konstruktor aufgerufen wird, bevor das Objekt zerstört wird.
<?php
class Demo
{
public $var = null;
public function __construct( $var=null )
{
$this->var = $var;
echo "constructing »", $this->var, "«\n<br>";
}
public function in( $var )
{
$this->var = $var;
echo "setting »", $this->var, "«\n<br>";
}
public function out()
{
echo "printing »", $this->var, "«\n<br>";
}
public function __destruct()
{
echo "destroying »", $this->var ,"«\n<br>";
}
}
function clone_class( $c )
{
$cc = clone $c;
$cc->in( 'foobar' );
$c->out();
$cc->out();
}
$c = new Demo( 'hello world' );
$c->out();
echo "--calling clone_class()\n<br>";
clone_class( $c );
echo "--finished clone_class()\n<br>";
$c->out();
?>
weiterhin schönen abend...