| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

07-09-2011, 00:03
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von h3ll
Zitat:
|
Abgesehen von "cyclic references" sollte das aber möglich sein. Wenn nicht, ist irgendwas am Code unsauber.
|
Das hat nichts mit unsauberen Code zu tun.
|
"Unsauber" ist vielleicht nicht das passende Wort.
(PHP-)Referenzen bleiben "zählbar", wenn man sie vernünftig einsetzt. Für Objekte und "Resourcen" benötigt man keine (expliziten) Referenzen. Bei Arrays kommts auf den Einzelfall an.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (07-09-2011 um 00:44 Uhr)
|

07-09-2011, 01:03
|
 |
mermshaus
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 165
|
|
Ninja-Edit @fireweasel: Ich habe mit dieser Antwort gerade übelste Race Conditions bezüglich deiner Edits. Sorry dafür.
Hast du den Satz mit Stack Overflow wieder rauseditiert? Na ja, egal.
(Verlinkter Artikel: Parameter passing in Java - by reference or by value?. Durchaus interessant zu lesen.)
Das predige (auch) ich seit langem.[1]
Zitat:
|
Zitat von fireweasel
In allen anderen Fällen auch. Sämtliche anderen Variablen, die dieses Objekt referenzieren, zeigen dann auch auf null.
|
Ja, die es (besser gesagt die Variable) (im PHP-Sinne) referenzieren… Gut, so gesehen ist deine Aussage völlig richtig. Ich bin aber nicht sicher, dass wahsaga wirklich Referenzen meinte.
Referenzen spielen bei Objekten in aller Regel absolut keine Rolle.
Es ist schon bemerkenswert, wie sehr man sich auch als gestandener PHP-Programmierer dabei immer wieder in Definitionen oder ungenauer Ausdrucksweise verheddert.[2]
[1] Schamlos!
[2] Die Aussage beziehe ich natürlich zuerst auf mich selbst.
|

07-09-2011, 07:33
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von fireweasel
"Unsauber" ist vielleicht nicht das passende Wort.
(PHP-)Referenzen bleiben "zählbar", wenn man sie vernünftig einsetzt. Für Objekte und "Resourcen" benötigt man keine (expliziten) Referenzen. Bei Arrays kommts auf den Einzelfall an.
|
Objekte werden in PHP immer als Referenz übergeben. OK, es ist keine richtige Referenz, aber trotzdem werden Objekte nicht immer gelöscht, nur weil man eine Variable auf NULL setzt oder unset() verwendet. Das sollte einem bewusst sein.
Auch macht es selten Sinn Variablen auf NULL zu setzen, weil sie am Ende jeder Funktion sowieso automatisch gelöscht werden. Wie gesagt, die Variablen, und nicht unbedingt die Objekte. Es ist nur unnötige Schreibarbeit. Und globale Variablen sollte man sowieso nicht verwenden.
Das selbe gilt für Objektvariablen. Wenn ein Objekt gelöscht wird, werden auch automatisch alle Objektvariablen gelöscht. Deswegen ist es auch ziemlich sinnlos sie im Destruktor nochmal explizit zu löschen bzw. auf NULL zu setzen.
Geändert von h3ll (07-09-2011 um 07:41 Uhr)
|

07-09-2011, 14:22
|
 |
mermshaus
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 165
|
|
Zitat:
|
Zitat von h3ll
Objekte werden in PHP immer als Referenz übergeben. OK, es ist keine richtige Referenz, …
|
Ich seh's so:
(„Objektvariable“ meint hier: eine Variable, deren Wert ein Object Identifier ist. Public/private/protected Variablen innerhalb einer Klasse sind für mich Instanzvariablen.)
Zitat:
Die Parameterübergabe sowohl von primitiven Datentypen (float, string, …) als auch von Objekten geschieht standardmäßig als Call-by-value. Auch Objekte werden nur dann by-reference übergeben, wenn dies durch das &-Zeichen in der Funktionssignatur explizit vermerkt ist. Der Inhalt (im Sinne von value) einer Objektvariable sind nicht die Instanzdaten selbst, sondern eine Art Ressourcen-Kennung (Object-Identifier), über die PHP auf die Instanzdaten zugreift.
PHP-Code:
// Call-by-value
function f($a) {
$a = null;
}
// Call-by-reference
function g(&$a) {
$a = null;
}
$s = 'foo'; f($s); var_dump($s); // string(3) "foo"
$s = 'foo'; g($s); var_dump($s); // NULL
$o = new stdClass(); f($o); var_dump($o); // object(stdClass)#1 (0) { }
$o = new stdClass(); g($o); var_dump($o); // NULL
|
- 4.1: Don't panic! The Hitchhiker's Guide to PHP oddities - php.de
Noch kurz zur Verdeutlichung:
Zitat:
|
Zitat von h3ll
…aber trotzdem werden Objekte nicht immer gelöscht, nur weil man eine Variable auf NULL setzt…
|
Es sei denn, alle Variablen, die auf ein Objekt zeigen, sind Referenzen. (Nein, das ist nicht sonderlich realistisch.)
PHP-Code:
$a = new stdClass();
$b = $a;
$b = null;
var_dump($a, $b); // object(stdClass), NULL
$c = new stdClass();
$d = &$c;
$d = null;
var_dump($c, $d); // NULL, NULL
Zitat:
|
…oder unset() verwendet. Das sollte einem bewusst sein.
|
unset entfernt auch bei Referenzen lediglich das Symboltabellenalias, hat aber keinerlei Auswirkung auf den Inhalt.
PHP-Code:
$e = new stdClass();
$f = $e;
unset($f);
var_dump($e, $f); // object(stdClass), NULL
$g = new stdClass();
$h = &$g;
unset($h);
var_dump($g, $h); // object(stdClass), NULL
|

07-09-2011, 14:40
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Ich kenn den Unterschied zwischen Referenz und Object-Identifier und zwischen unset und Zuweisung. Aber trotzdem danke für die ausführliche Schilderung. Dafür war ich selber zu bequem
Wie du schön gesagt hast, wenn man nur Referenzen verwendet, kann man Objekte (fast) zuverlässig löschen. Nur haben Referenzen so viele mögliche Seiteneffekte, dass man besser die Finger davon lässt.
|

07-09-2011, 14:47
|
 |
mermshaus
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 165
|
|
Offtopic: Ja, ist mir klar, dass du den kennst. Ich dachte, weil wir hier die Begrifflichkeiten teilweise durcheinander gewürfelt haben, schreibe ich's mal einmal sauber auf.
|
LinkBacks (?)
LinkBack to this Thread: http://www.php-resource.de/forum/php-developer-forum/102144-destrutor-problem.html
|
| Erstellt von |
For |
Type |
Datum |
| - RSS Feed URL - Blog RSS Feed |
This thread |
Refback |
05-09-2011 21:31 |
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|