Ankündigung

Einklappen
Keine Ankündigung bisher.

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

Einklappen

Neue Werbung 2019

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

  • 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.
    Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.


  • #2
    In PHP gibt es keine nicht-initialisierten Variablen, die werden alle mit einem Defaultwert initialisiert, wenn sie nicht explizit mit etwas initialisiert werden (Im gegensatz zu C z.B., wo Variablen garbage enthalten können).

    Edit: Im letzten Abschitt wird einmal von nicht-initialisierten und einmal von nicht-existenten Variablen gesprochen, das ist wirklich etwas verwirrend, vieleicht sollte man überall nur von "existierenden" Variablen sprechen.

    Mach nen PR: https://github.com/php-de/php-de.github.io
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      ja. Hast Du meine Sätze gelesen? Ich habe genau das auch geschrieben.

      Falsch ist halt einfach der erste Satz im Artikel! Und wenigstens der sollte korrigiert werden.
      Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

      Kommentar


      • #4
        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.
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


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

          Kommentar


          • #6
            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
            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

            Kommentar


            • #7
              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?
              Gruß,
              SebTM

              Kommentar


              • #8
                Objekte werden immer Referenziert, das sollte dir der Beispielcode sagen.

                new ... oder & new ... ist equivalent.
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar


                • #9
                  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.
                  Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

                  Kommentar


                  • #10
                    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.
                    Zitat von nikosch
                    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

                    Kommentar


                    • #11
                      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.

                      Kommentar


                      • #12
                        @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.

                        Kommentar


                        • #13
                          @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).

                          Kommentar


                          • #14
                            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".
                            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                            Kommentar


                            • #15
                              @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.)

                              Kommentar

                              Lädt...
                              X