Ankündigung

Einklappen
Keine Ankündigung bisher.

Referenzen-Artikel: Erster Satz stimmt so nicht (ganz).

Einklappen

Unconfigured Ad Widget

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • jwka61
    hat ein Thema erstellt Referenzen-Artikel: Erster Satz stimmt so nicht (ganz)..

    Referenzen-Artikel: Erster Satz stimmt so nicht (ganz).

    Im Artikel "Referenzen" stimmt m.E. der erste Satz NICHT:
    Eine Referenz stellt einen Verweis auf eine Speicherstelle dar, in der der Wert einer bereits initialisierten Variablen abgelegt wurde.
    Es muss vor der Referenz nicht zwingend ein Wert zugewiesen worden sein, Referenzen können auch VOR der Belegung der Speicherstelle mit einem Wert erstellt werden:

    PHP-Code:
    $myRef =& $theval;
    $myRef2 =& $thearr;

    $theval=100;
    echo 
    $myRef "\n";

    $thearr[]=1;
    $thearr[]=2;
    print_r$myRef2 );

    return; 
    Als immer noch Lernender würde ich daher vorschlagen, den ersten Block zu ändern, um dem Neulingen das Thema Referenzen noch leichter verständlich zu machen:


    Eine Referenz stellt - wie das intern ein Variablenname übrigens auch tut - nur einen (weiteren) Verweis auf eine Speicherstelle dar. Dabei übt sie praktisch die Funktion eines Aliasnamens für eine Variable aus.

    Eine Referenz kann zu jedem Zeitpunkt erstellt werden, also ins besondere auch schon bevor die Speicherstelle einen Wert über eine Zuweisung erhalten hat.

    Wird eine Referenz angetroffen, bevor eine Zuweisung zur Variable erfolgte, so wird die Speicherstelle initialisiert (ohne Wert) und zu dieser in der Lookup-Tabelle sowohl eine Verbindung zu der in der Referenz benutzten Variablen als auch zur Referenz selbst eingetragen.

    Eine Zuweisung kann fortan sowohl über den Variablennamen als auch über die Referenz erfolgen und bewirkt die Änderung der Speicherstelle.

  • mermshaus
    antwortet
    Perfekt ist es noch nicht, aber:

    - https://github.com/php-de/php-de.git...a1bf241b6a5ddb (Live-Version: http://php-de.github.io/jumpto/referenz/)

    Alle zufrieden genug?

    Einen Kommentar schreiben:


  • bwoebi
    antwortet
    @tr0y: Für mich ist es fertig genug, so dass ich es schon auf so manchem Server laufen habe Und auch schon viel PHP 7 Syntax nutze... (bzw. älteren Code mit PHP 7 kompatibel mache).

    @mermshaus: natürlich ist es auf dem C-Level keine atomare Aktion, aber naja. Nur so mal: http://3v4l.org/S0pvB
    Warum $a vor $b auftaucht oder umgedreht in anderen Versionen, ist das Result einiger Optimierungen, wann die Symboltabelle gebaut wird usw. Und u.a. in welcher Reihenfolge die Variabeln im Code definiert sind (wo der AST die Reihenfolge auch stark beeinflusst hat usw.). Das jetzt genau zu analysieren, liegt nicht im Rahmen dieses Forums, denke ich mal.

    Und nein, Referenzen werden nicht in jedem Fall überschrieben, sondern halt wenn der Referenz ein Wert zugewiesen wird, wenn nicht ist sie halt null. Bei verschiedenen Funktionen wird sie halt in jedem Fall überschrieben, da die Funktion es so vorsieht. Und da ist es mMn sinnlos sie zuerst zu initialisieren, auch von einem stilistischen Aspekt hier, aber das ist wohl jetzt Geschmackssache

    Einen Kommentar schreiben:


  • mermshaus
    antwortet
    @bwoebi: Danke für die Ausführungen. Wie gesagt, ich finde es nicht unbedingt hübsch, Variablen nicht zu deklarieren/initialisieren, bevor sie als Argument/Referenz irgendwo übergeben werden – selbst wenn sie in jedem Fall (?) überschrieben werden. Das ist aber letztlich wohl eher eine stilistische Frage.

    Zitat von bwoebi
    Übrigens, technisch ist es so, dass beide Operanden gleichzeitig definiert werden im Falle von $a = &$b; (ZEND_ASSIGN_REF opcode).
    Ich hatte da auch ein wenig gestochert.

    - http://3v4l.org/VZn00

    Bei den php7-Varianten taucht a vor b auf, ansonsten b vor a. Das ist aber insgesamt mehr so eine Randbeobachtung, die wohl nicht als definiert anzusehen ist. (Und laut VLD ist es im Rahmen eines Opcodes, ja.)

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Zitat von bwoebi Beitrag anzeigen
    @tr0y: Ich möchte dazu nur anmerken, dass & new seit PHP 7 einen Parse Error wirft. (Schon seit PHP 5.0 deprecated)

    Ich würde heutzutage davon absehen es "äquivalent" zu nennen, da es schlicht und einfach nicht mehr funktioniert.
    notiert, wobei ein ungelegtes ( äh, nicht fertiggestelltes ) Ei für mich noch nicht "heutzutage" ist sondern eher "in der kommenden PHP Version".

    Einen Kommentar schreiben:


  • bwoebi
    antwortet
    @mermshaus: (Anmerkung: die Codebeispiele sind valide PHP 7 Syntax… Ich weiß, dass es mit 5.6 noch einen Parse Error gibt, aber ist mir erst nach dem Schreiben jetzt aufgefallen … Und Einzeiler sind doch viel schöner, nicht wahr?)

    $a = &$b; wirft keine Notice, da Referenzen generell ohne Notice erzeugt werden können.
    Also spezifisch &$b wirft keine Notice. Beispielhafter Anwendungsfall sind hier Funktionsaufrufe:
    PHP-Code:
    (function (&$var) { $var })($foo); // $foo ist 1 
    $foo wird hier als Referenz übergeben und wirft daher keine Notice.


    Dass &$b keine Notice wirft, kommt daher, dass wir früher call-time pass-by-reference hatten und man &$var schreiben musste, um eine Referenz zu erzeugen.

    Was aber immer noch geht (und der Grund warum wir da jetzt keine Notice haben … Und es wäre schon komisch wenn [&$b] geht, $a = &$b; aber eine Notice wirft.):
    PHP-Code:
    (function ($array) { $array[0] = })([&$bar]) // $bar ist 5 

    Genau für solche Fälle (preg_match_all) ist es explizit gedacht, dass man die Variable davor nicht initialisieren muss. Es ist komplett egal was $matches enthält, es wird eh überschrieben. Das ist durchaus eine erwünschte Anwendung.


    Übrigens, technisch ist es so, dass beide Operanden gleichzeitig definiert werden im Falle von $a = &$b; (ZEND_ASSIGN_REF opcode).


    Was ich allerdings anmerken würde, ist dass eine Referenz kein Aliasname für eine Variable ist, sondern im Prinzip alle Variabeln Bezeichner für einen Speicherplatz sind. Also implizit alle Variabeln Referenzen sind, nur ist es möglich, dass sich eben mehrere Variabeln denselben Speicherplatz teilen (explizite Referenz: Referenzcounter > 1). (P.s.: Ich rede nicht von Copy-on-Write, das nur ein internes Detail ist.)
    Das ist meiner Meinung nach eine korrektere Formulierung, da, wäre es ein reiner Alias auf eine Variable, so würde das genau genommen bedeuten, dass nach $b = 2; $a = &$b; unset($b); jetzt $a auch verschwunden sein müsste (wenn $a strikter Alias von $b wäre).

    Einen Kommentar schreiben:


  • bwoebi
    antwortet
    @tr0y: Ich möchte dazu nur anmerken, dass & new seit PHP 7 einen Parse Error wirft. (Schon seit PHP 5.0 deprecated)

    Ich würde heutzutage davon absehen es "äquivalent" zu nennen, da es schlicht und einfach nicht mehr funktioniert.

    Einen Kommentar schreiben:


  • mermshaus
    antwortet
    Also, es stimmt, dass…

    PHP-Code:
    $a = &$b
    …klaglos (ohne Notice) funktioniert, auch wenn $b vorher nicht gesetzt wurde. PHP generiert in diesem Fall automatisch den Wert null und verwaltet $a und $b als gleichberechtigte Symboltabellenaliase zum Zugriff darauf. (Wurde so auch schon gesagt.)

    Ich habe keine Ahnung, warum keine Notice erzeugt wird. Ich vermute aber, dass das durchaus so gewollt ist. (Wahrscheinlich, damit Code wie der erste Block unten geschrieben werden kann, auch wenn das keine wirkliche Erklärung ist.)

    Die Formulierung aus dem Wiki/Repo…

    Eine Referenz stellt einen Verweis auf eine Speicherstelle dar, in der der Wert einer bereits initialisierten Variablen abgelegt wurde. Dabei übt sie praktisch die Funktion eines Aliasnamens für eine bereits existente Variable aus.
    …kann man deshalb schon als nicht völlig exakt ansehen, ja. Technisch ist es zwar vermutlich trotzdem so, dass $b vor $a angelegt wird, aber eben automatisch intern in der Engine, wohingegen bei derlei Formulierungen immer anzunehmen ist, dass sie sich auf Userland-Code beziehen.

    Andererseits enthält der Artikel auch bereits einen Abschnitt, der sich genau mit der angesprochenen Sache befasst.

    - http://php-de.github.io/jumpto/refer...erte-variablen

    Bis mir jemand erklärt, warum es guter Stil ist oder Sinn ergibt, auf diese Weise neue Variablen einzuführen, würde ich das alles aber eher unter „Trivia“ abheften.

    Diesen Vorschlag…

    Zitat von jwka61
    Eine Referenz kann zu jedem Zeitpunkt erstellt werden, also ins besondere auch schon bevor die Speicherstelle einen Wert über eine Zuweisung erhalten hat.
    …würde ich so jedenfalls nicht übernehmen, weil sich das so liest, als wäre das eine übliche oder sogar erwünschte Anwendung. (Und „zu jedem Zeitpunkt“ ist so eine Formulierung, über die es dann möglicherweise in zwei, drei Jahren wieder so einen Thread gibt, weil jemand feststellt, dass das innerhalb von evaluiertem Code oder so nicht funktioniert. )

    Meines Erachtens fehlt da einfach die Initialisierung. Genau wie hier…

    PHP-Code:
    preg_match_all('/[0-9]+/''123 hello 456'$matches);
    var_dump($matches); 
    …ein $matches = array(); fehlt oder hier…

    PHP-Code:
    if (true) {
        
    $s 'Hello';
    }
    var_dump($s); 
    …ein $s = ''; vor der Bedingung.

    Einen Kommentar schreiben:


  • tkausl
    antwortet
    Zitat von jwka61 Beitrag anzeigen
    Einerseits habe ich nicht die Kenntnisse, es final zu bestimmen, ob die Änderung durchgeführt werden soll, andererseits bin ich kein Autor im Wiki.
    Die foreninterne Wiki wird nicht mehr gepflegt und bei dieser Wiki kannst du hier einen Pull-Request erstellen, einer der Mitglieder der Gruppe kann/wird ihn dann überprüfen und entweder Annehmen oder Ablehnen.

    Einen Kommentar schreiben:


  • jwka61
    antwortet
    Vielleicht kann der Thread einfach auf das zurückgeführt werden, wozu ich ihn gestartet habe?

    --> Hinweis für die Personen, die das Wiki schreiben, dass da vielleicht eine Änderung vorgenommen werden sollte, weil einfach etwas sachlich falsches geschrieben steht.

    Einerseits habe ich nicht die Kenntnisse, es final zu bestimmen, ob die Änderung durchgeführt werden soll, andererseits bin ich kein Autor im Wiki.

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Objekte werden immer Referenziert, das sollte dir der Beispielcode sagen.

    new ... oder & new ... ist equivalent.

    Einen Kommentar schreiben:


  • SebTM
    antwortet
    Ich verstehe nicht was mir der Code sagen soll?

    In dem Code erzeugst du ein Objekt und ein Objekt von der Referenz "new XYZ"? Inwiefern passiert hier was automatisch - du schreibst das & ja hin? bzw. inwiefern ist es hier notwendig auf die Referenz zurückzugreifen?

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Zitat von SebTM Beitrag anzeigen
    Frage an den/die Profi(s): Wann referenziert PHP automatisch? Beispiel? bzw. in welchem Anwendungsszenario ist es notwendig "manuelle" Referenzierung zu nutzen?
    https://eval.in/private/86dda31e3687b2

    Einen Kommentar schreiben:


  • SebTM
    antwortet
    Frage an den/die Profi(s): Wann referenziert PHP automatisch? Beispiel? bzw. in welchem Anwendungsszenario ist es notwendig "manuelle" Referenzierung zu nutzen?

    Einen Kommentar schreiben:


  • tr0y
    antwortet
    Man sollte auch darauf hinweisen das PHP automatisch referenziert wo es nötig ist. Userland Referenzen sind zwar möglich, aber in nahezu allen fällen nicht nötig.

    Einen Kommentar schreiben:

Lädt...
X