View Issue Details

IDProjectCategoryView StatusLast Update
0000220Adventure PHP FrameworkCode-Verbesserung // Code improvementpublic2016-02-28 16:41
ReporterdingsdaAssigned ToChristianAchatz 
PrioritynormalSeveritytweakReproducibilityN/A
Status resolvedResolutionfixed 
Product Version2.1 
Target Version3.2Fixed in Version3.2 
Summary0000220: unnötigen Referenzoperator entfernen bei Übergabe von Objekten
Descriptionseit php 5.3 werden standardmäßig pointer auf objekte übergeben, wenn ein objekt einer methode als parameter übergeben wird oder aus einer methode zurückgegeben wird oder einer anderen variable zugewiesen wird.

es wird also nie eine kopie des objektes erstellt (außer man nutzt clone). daher ist der Referenzoperator in den meisten fällen unnötig geworden.

wird der Referenzoperator genutzt wird aber eine Referenz auf die Variable, die das Object enthält.
um den unterschied mal zu verdeutlichen:

-------------- Mit Referenzoperator ----------------

$t1= & Singleton::getInstance('APF\core\benchmark\BenchmarkTimer');
var_dump($t1); // ausgabe vom Benchmarktimerobject mit allem drum und dran.
$t1 = 'test' // hier wird nicht nur $t1 überschrieben, sondern auch
                    die stelle im array von Singleton wo der Timer gespeichert
                    ist

$t2= & Singleton::getInstance('APF\core\benchmark\BenchmarkTimer');
var_dump($t2); // ausgabe 'test'

-------------- Ohne Referenzoperator ----------------

$t1= Singleton::getInstance('APF\core\benchmark\BenchmarkTimer');
var_dump($t1); // ausgabe vom Benchmarktimerobject mit allem drum und dran.
$t1 = 'test' // nur $t1 wird überschrieben, das array im Singleton
                    bleibt unberührt

$t2= Singleton::getInstance('APF\core\benchmark\BenchmarkTimer');
var_dump($t2); // selbe ausgabe wie var_dump($t1)


da kann man eigentlich auch gleich die properties von Objekten wie dem Singleton public machen, wenn man sie sowieso nach belieben ändern kann :D

spaß beiseite. den referenzoperator sollte man mit vorsicht nutzen. und weglassen, wenn er unnötig ist. um Singleton::getInstance() zu nutzen ist er z.b. nicht nötig, weil auch ohne den immer das selbe objekt zurückgegeben wird.
Wird das objekt manipuliert so wird auch das objekt im Singleton manipuliert.

das selbe gilt für alle stellen, wo objekte als referenz zurückgegeben werden.

noch ein kleines gist zur verdeutlichung:
https://gist.github.com/dingsda87/7866bd20bfdecb544ca7
man beachte auch die nummern hinter den objekten beim var_dump
z.b. object(Bar)[1]
welche die interne referenznummer zum objekt anzeigt (zval oder so)

@christian:
ich kenne auch schon die diskusion dazu im php forum
http://www.php.de/php-fortgeschrittene/78028-performance-problem.html#post585026
allerdings konnte ich das von dir beschriebene verhalten nicht nachstellen (siehe mein gist)
TagsNo tags attached.
Codereferenz: ([Datei]:[Zeile])
Namespacenone

Activities

ChristianAchatz

2014-07-02 13:14

administrator   ~0000429

Hallo dingsda,

ich lasse mich gerne davon überzeugen, dass wir die Referen-Operatoren nicht brauchen. Einzige Bedingung: ich möchte in einem Controller auf der Referenz eines Dokuments arbeiten können und nicht auf einer Kopie und wenn ich die Instanz einem Tag und(!) einem Controller bearbeite (aus welchem Grund auch immer) muss die Änderung, die (zuvor) in einem Tag passiert ist, später im Controller ebenso sichtbar sein.

Ist das gegeben und stimmt die Performance, habe ich kein Problem auf die Operatoren zu verichten. Meine bisherige Erfahrung ist z.B. im verlinkten Foren-Post beschrieben. Insbesondere, dass ohne Referenz-Operator nach dem Transformieren ein nicht erwartetes Ergebnis entsteht hat mich bishe davon abgehalten, diese zu entfernen.

dingsda

2014-07-04 22:08

developer   ~0000437

Last edited: 2014-07-04 22:17

View 2 revisions

Dann probieren wir es doch einfach mal aus:
https://github.com/dingsda87/code/tree/%23220-POC-remove-all-references

Alle "&" entfernt

Performanceprobleme konnte ich keine feststellen.
bei der darstellung hab ich nichts ungewöhnliches feststellen können.

einen fehler konnte ich bisher nur beim appendNodeTag entdecken und beheben.
Alle tags konnte ich natürlich nicht testen. hab vor allem in den examples alle links angeklickt zum test
https://github.com/dingsda87/examples/tree/%23220-POC-remove-all-references

wenn es fehler mit den taglibs gibt, werden die höchstwahrscheinlich ähnlich sein wie im appendNodeTag

dingsda

2014-07-04 22:11

developer   ~0000438

Last edited: 2014-07-04 22:15

View 2 revisions

interessant ist, dass wenn man ein var_dump vom dom-baum macht, die child-nodes und parent nodes immer noch als referenz markiert sind. so zumindest mit xdebug. ohne will ich grad nich testen.

edit: ich dachte da schon erst, dass ich einige referenzoperatoren vergessen hätte. aber ein kleiner test mit ner miniklasse hat gezeigt, dass das immer so dargestellt wird, wenn man objekte kopiert.

dingsda

2014-07-04 22:34

developer   ~0000441

als nächsten werd ich dann noch alle dummy-schleifen entfernen, falls du nicht jetzt schon auf Probleme stößt.
Ich denke auch das wird nichts an der ausgabe ändern.

ChristianAchatz

2014-07-05 09:30

administrator   ~0000446

Darauf bin ich wirklich mal gespannt. An das Thema, die foreach zu ersetzen/umzuschreiben habe ich mich bisher nicht getraut... :)

ChristianAchatz

2015-09-05 17:07

administrator   ~0000595

Moved to 3.2 to shape scope for 3.1.

ChristianAchatz

2016-02-28 16:37

administrator   ~0000674

Last edited: 2016-02-28 16:40

View 2 revisions

- Removed unnecessary & characters.
- Validated remaining & characters to be necessary (e.g. AppendNodeTag).

Issue History

Date Modified Username Field Change
2014-07-02 12:18 dingsda New Issue
2014-07-02 13:14 ChristianAchatz Note Added: 0000429
2014-07-04 22:08 dingsda Note Added: 0000437
2014-07-04 22:11 dingsda Note Added: 0000438
2014-07-04 22:15 dingsda Note Edited: 0000438 View Revisions
2014-07-04 22:17 dingsda Note Edited: 0000437 View Revisions
2014-07-04 22:34 dingsda Note Added: 0000441
2014-07-05 09:30 ChristianAchatz Note Added: 0000446
2015-01-28 19:14 ChristianAchatz Target Version 3.0 => 3.1
2015-09-05 17:07 ChristianAchatz Note Added: 0000595
2015-09-05 17:07 ChristianAchatz Target Version 3.1 => 3.2
2016-02-28 16:37 ChristianAchatz Note Added: 0000674
2016-02-28 16:40 ChristianAchatz Note Edited: 0000674 View Revisions
2016-02-28 16:41 ChristianAchatz Status new => resolved
2016-02-28 16:41 ChristianAchatz Fixed in Version => 3.2
2016-02-28 16:41 ChristianAchatz Resolution open => fixed
2016-02-28 16:41 ChristianAchatz Assigned To => ChristianAchatz