php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack (2) Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #16 (permalink)  
Alt 07-09-2011, 01:03
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
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.

Geändert von fireweasel (07-09-2011 um 01:44 Uhr)
Mit Zitat antworten
  1 links from elsewhere to this Post. Click to view. #17 (permalink)  
Alt 07-09-2011, 02:03
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #18 (permalink)  
Alt 07-09-2011, 08:33
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist gerade online
Registriert seit: Mar 2008
Beiträge: 3.605
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
"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 08:41 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 07-09-2011, 15:22
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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 
Mit Zitat antworten
  #20 (permalink)  
Alt 07-09-2011, 15:40
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist gerade online
Registriert seit: Mar 2008
Beiträge: 3.605
h3ll befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #21 (permalink)  
Alt 07-09-2011, 15:47
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/102144-destrutor-problem.html
Erstellt von For Type Datum
Backlink Analyse www.php.de Kostenloser SEOkicks Backlinkcheck Post #0 Refback 19-11-2012 10:38
- RSS Feed URL - Blog RSS Feed This thread Refback 05-09-2011 22:31

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
problem, das wäre aber ein recht nutzloser titel deshalb: logik-problem o.o! newhx PHP Developer Forum 5 21-01-2003 17:46

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

ModuleStudio ansehen ModuleStudio

Modellgetriebene Entwicklung von Erweiterungen für das Open Source Framework Zikula.

15.01.2019 Guite | Kategorie: PHP ENTWICKLUNGSUMGEBUNG
FAQ Script PHP ansehen FAQ Script PHP

FAQ Script PHP is a simple knowledgebase script and you could use it as a Frequently Asked Question section on your website. It is written in PHP and MySQL.

14.01.2019 nevenov | Kategorie: PHP/ FAQ
Admidio Mitgliederverwaltung

Admidio ist eine kostenlose Online-Mitgliederverwaltung, die für Vereine, Gruppen und Organisationen optimiert ist. Sie besteht neben der Mitgliederverwaltung aus einer Vielzahl an Modulen (Foto-, Download-, Terminverwaltung), die in eine neue oder besteh

08.01.2019 webmaster52@ | Kategorie: PHP/ Groupware
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:56 Uhr.