.MB: Verständnisfrage andere Zuweisung in PHP

Guten Abend,

${$variable} = wert; Ich hab gegoogeln und nix gefunden was diese besondere Form von Wertzuweisungen Erklärt

$variable = wert; geht genauso. was ist der unterschied???

Gruß MB

  1. Tach!

    ${$variable} = wert; Ich hab gegoogeln und nix gefunden was diese besondere Form von Wertzuweisungen Erklärt

    Das PHP-Handbuch im Kapitel zu den variablen Variablen kann das erklären.

    $variable = wert; geht genauso. was ist der unterschied???

    Nein, das ist nicht miteinander gleichsetzbar. Wenn du das Konzept im Handbuch gelesen und verstanden hast, wirst du den Unterschied kennen.

    dedlfix.

    1. Hallo,

      Das PHP-Handbuch im Kapitel zu den variablen Variablen kann das erklären.

      Habs von einer gut erklärenden Internetseite mit dene ich vom Buch her paralell arbeite.

      Nein, das ist nicht miteinander gleichsetzbar. Wenn du das Konzept im Handbuch gelesen und verstanden hast, wirst du den Unterschied kennen.

      Im Buch steht diese Zuweisung nicht, aber in der Internetseite. Kannst dus Erklären. Ist das Typecasting oder so? Ich verstehe es nicht. deswegen frage ich.

      Gruß MB

      1. Tach!

        Kannst dus Erklären. Ist das Typecasting oder so?

        Nein, das nennt sich "variable Variablen" (deutsche Übersetzung), wie ich schon sagte. Lies bitte zuerst das PHP-Handbuch, wenn es nicht in deinem Buch steht. Wenn dann noch Fragen offenbleiben, dann frag bitte konkret.

        dedlfix.

        1. Ach, Dieses Handbuch in php.net meinst du. Ja da habe ich auch nach gesuch, nix gefunden. ich wusste nicht das dieser Begriff ein eigenstndiger Name ist. Werds mir durchlesen Danke Dir.

          Gruß MB

          1. Hallo,

            Ach, Dieses Handbuch in php.net meinst du.

            ja, das ist das offizielle PHP-Handbuch.

            Ja da habe ich auch nach gesuch, nix gefunden. ich wusste nicht das dieser Begriff ein eigenstndiger Name ist. Werds mir durchlesen Danke Dir.

            Nachdem dedlfix dir schon den Begriff genannt hat, hättest du Variable variables eigentlich schnell finden können. Gibt's auch in Deutsch.

            So long,
             Martin

            1. also wenn ich das richtig verstanden habe ist das eine Variable in einer variable???

              wenn ich "intern" $a = 1; definiere und "extern" ${$a} = a; ist das wie eine art baumstruktur???

              "intern" darf ich das nicht verändern also $a = 2; es sei den ich ändere das "extern" wie ${$a} = b; dann kann ich auch "intern" verändern???

              
              <?php
              
              	$a = "1";
              	echo $a . "<br />";
              	
              	${$a} = "a";
              	echo ${$a} . "<br />";
              	
              	echo $a . " " . ${$a} . "<br />";
              	
              	$a = "2";
              	echo $a . "<br />";
              	
              	${$a} = "b";
              	echo ${$a} . "<br />";
              	
              	echo $a . " " . ${$a} . "<br />";
              	
              ?>
              
              

              So habe ich es jedenfals verstanden. It das richtig und wofü macht man das?

              gruß MB

              1. Hallo,

                also wenn ich das richtig verstanden habe ist das eine Variable in einer variable???

                naja, so ähnlich. Es ist eine Variable, deren Name sich aus einem beliebigen Ausdruck ergibt, der natürlich auch weitere Variablen enthalten kann.

                wenn ich "intern" $a = 1; definiere und "extern" ${$a} = a; ist das wie eine art baumstruktur???

                Nein, dann würdest du eine Variable mit dem Namen "1" erzeugen. Und der Ausdruck a, den du dieser Variablen zuweist, wäre eigentlich der Wert einer Konstanten mit dem Namen "a"; da es aber vermutlich keine definierte Konstante mit diesem Namen gibt, nimmt PHP stattdessen den String "a".

                "intern" darf ich das nicht verändern also $a = 2; es sei den ich ändere das "extern" wie ${$a} = b; dann kann ich auch "intern" verändern???

                Hä? Das habe ich nicht verstanden.

                <?php
                	$a = "1";                // $a enthält nun den String "1"
                	echo $a . "<br />";      // 1 <CR>
                	
                	${$a} = "a";             // ${"1"} enthält nun den String "a"
                	echo ${$a} . "<br />";   // a <CR>
                	
                	echo $a . " " . ${$a} . "<br />";   // 1 a <CR>
                	
                	$a = "2";                 // $a enthält jetzt den String "2"
                	echo $a . "<br />";       // 2 <CR>
                	
                	${$a} = "b";              // ${"2"} enthält jetzt den String "b"
                	echo ${$a} . "<br />";    // b <CR>
                	
                	echo $a . " " . ${$a} . "<br />";   // 2 b <CR>
                ?>
                

                So habe ich es jedenfals verstanden. It das richtig und wofü macht man das?

                Es ist anscheinend nicht ganz richtig, wie du es bisher verstanden hast; und mit rund 30 Jahren Programmierer-Erfahrung würde ich sagen, eigentlich macht man das gar nicht. Das PHP-Konzept der variablen Variablen verführt einen zu Fehlkonstruktionen, die man meist mit Arrays oder Objekten sehr viel besser lösen könnte.
                Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                So long,
                 Martin

                1. Hallo Martin,

                  und mit rund 30 Jahren Programmierer-Erfahrung würde ich sagen, eigentlich macht man das gar nicht. Das PHP-Konzept der variablen Variablen verführt einen zu Fehlkonstruktionen, die man meist mit Arrays oder Objekten sehr viel besser lösen könnte.

                  Ok besten Dank, ich hab das immer noch nicht sorichtig kappiert. ich werd mir wo anders den kopf zerbrechen und dieses Thema auslassen.

                  Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                  Das beruhigt mich

                  Schönen Abend MB

                2. @@Der Martin

                  Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                  Ich hab heute zum ersten Mal davon gehört. Ich bin Profi.

                  LLAP 🖖

                  --
                  „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
                  „Hat auf dem Forum herumgelungert …“
                  (Wachen in Asterix 36: Der Papyrus des Cäsar)
                3. Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                  Full Ack! Gar nicht erst anfangen!

                  1. Moin!

                    Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                    Full Ack! Gar nicht erst anfangen!

                    Das wäre falsch. Man zeigt die Technik, erläutert aber, warum deren Verwendung vermieden werden soll.

                    Jörg Reinholz

                4. Tach!

                  Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                  Vom Weglassen von Dingen, die in der Welt draußen vorkommen, verschwinden diese nicht von selbst. Zeigen und Aufklärung über die besseren Alternativen fände ich sinnvoller.

                  Für variable Variablen fällt mit grad kein Anwendungsbeispiel ein, aber variable Funktionen sind ja so ähnlich. Hier gab es auch eine historische Entwicklung in der Reihenfolge, wie ich die Alternativen gleich aufführen werden. Variable Funktionen haben als Callback eine Relevanz. Man übergibt einen Funktionsnamen als String. Um die Funktion mit diesem Namen auszuführen, braucht es eine variable Funktion. Das ist relativ einfach zu verstehen. Die besseren Alternativen wären call_user_func(), damit kann man dann auch Methoden von Objekten und Klassen übergeben und ausführen. Und schon kann man einen Nachteil an der einfachen Variante aufzeigen, die kann nur simple Funktionsnamen übergeben bekommen. Anschließend kann man die wenig intuitive Umständlichkeit beim Notieren von komplexen Callables (Array-Schreibweise) zeigen und die moderne Alternative vorstellen: anonyme Funktionen. Damit kommt man ganz weg von den "stringly-typed" Varianten, was dann auch einen entscheidenden Vorteil nicht nur beim Arbeiten in modernen IDEs bringt. Aus Strings kann die IDE die Zusammenhänge zwischen Stringinhalt und real existierender Funktion/Klasse/Variable nicht oder nur schwer erkennen und auch als Mensch hat man so seine Schwierigkeiten, besonders wenn ein und derselbe Wert in unterschiedlichen Kontexten verwendet wird. Bei auf Code basierenden Lösungen kann es zu keinen Verwirrungen kommen, denn da muss man die Dinge immer eindeutig benennen.

                  dedlfix.

                  1. Variable Funktionen haben als Callback eine Relevanz. Man übergibt einen Funktionsnamen als String.

                    Nicht generell in jeder PL. JS fasst Funktionsname je nach Kontext als Referenz auf und in Perl ist es ebenfalls üblich, Funktionsnamen nicht als String sondern als Referenz zu übergeben.

                    1. Tach!

                      Variable Funktionen haben als Callback eine Relevanz. Man übergibt einen Funktionsnamen als String.

                      Nicht generell in jeder PL.

                      Wir diskutieren hier grad nicht über generell jede PL, sondern über PHP.

                      dedlfix.

                  2. Tach!

                    Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                    Vom Weglassen von Dingen, die in der Welt draußen vorkommen, verschwinden diese nicht von selbst. Zeigen und Aufklärung über die besseren Alternativen fände ich sinnvoller.

                    Variable Variablenamen sind ein Graus für die Fehlersuche. Insbesondere in Teamarbeit kann sich sowas mächtig querlegen und kostbare Zeit vernichten.

                  3. Hallo,

                    Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                    Vom Weglassen von Dingen, die in der Welt draußen vorkommen, verschwinden diese nicht von selbst.

                    das ist natürlich richtig, aber ich dachte wirklich konkret an Anfänger, die neu einsteigen. Die möchte man am besten gar nicht erst auf dumme Gedanken bringen. Zu groß ist die Gefahr, dass sie später doch auf den Gedanken kommen, dieses ach so praktische Feature zu nutzen, obwohl ich mich bemüht habe, stichhaltige Argumente dagegen anzuführen.

                    Zeigen und Aufklärung über die besseren Alternativen fände ich sinnvoller.

                    Ja, einverstanden. Aber erst dann, wenn jemand kommt und fragt: "Ich hab da mal was gehört ... was ist das eigentlich und wie geht das?"

                    Für variable Variablen fällt mit grad kein Anwendungsbeispiel ein

                    Mir auch nicht. ;-)
                    Jedenfalls keines, das man nicht mit einer anderen Datenstruktur besser anpacken könnte, etwa das, was man in PHP assoziatives Array nennt.

                    So long,
                     Martin

                    1. Variablen in die Welt hecken und der Kollege sucht sich dumm und dämlich wo die herkommen.

                      1. Moin!

                        Variablen in die Welt hecken und der Kollege sucht sich dumm und dämlich wo die herkommen.

                        Ja. Das ist fast noch übler. So ziemlich der einzige Fall, wo (und wie) ich das akzeptieren würde:

                        <?php
                        // Daten, woher auch immer:
                        $template['foo']='<b>etwas</b>';
                        $template['bar']='<strong>anderes</strong>';
                        
                        // Minimalste Template-Engine
                        
                        $allowSpecialcharsIn=array('bar');
                        
                        foreach ( array_keys($template) as $k ) {
                           if (! in_array($k, $allowSpecialcharsIn)  ) {
                              $template[$k]=htmlspecialchars($template[$k]);
                           }
                        }
                        
                        extract ($template, EXTR_OVERWRITE);
                        echo <<< EOT
                        Wenn $foo falsch ist:
                        - Dann nimm halt etwas $bar.
                        
                        EOT;
                        exit;  # Ich würde schon sehr genau wissen wollen, dass die Variablen sofort wieder vergessen werden...
                        

                        Jörg Reinholz

                    2. Tach!

                      Vom Weglassen von Dingen, die in der Welt draußen vorkommen, verschwinden diese nicht von selbst.

                      das ist natürlich richtig, aber ich dachte wirklich konkret an Anfänger, die neu einsteigen. Die möchte man am besten gar nicht erst auf dumme Gedanken bringen.

                      Naja, als eines der wichtigen Features würde ich das auch nicht darstellen wollen, aber auch nicht totschweigen. Es gehört zum Sprachumfang, also sollte man auch irgendwie darauf eingehen.

                      Zu groß ist die Gefahr, dass sie später doch auf den Gedanken kommen, dieses ach so praktische Feature zu nutzen, obwohl ich mich bemüht habe, stichhaltige Argumente dagegen anzuführen.

                      Dann fehlt denen die Erfahrung, dass dieses Feature doch nicht so toll ist, wie es auf den ersten Blick aussieht. Am besten lernt man wohl eher aus seinen eigenen Fehlern, als aus Zeigefingern von anderen. Man kann auch an Negativbeispielen zeigen, was es für Auswirkungen haben kann.

                      dedlfix.

                  4. Moin!

                    Wenn ich einem Anfänger PHP beibringen wollte, wären variable Variablen ein Kapitel, das ich ganz bewusst auslassen würde.

                    Vom Weglassen von Dingen, die in der Welt draußen vorkommen, verschwinden diese nicht von selbst. Zeigen und Aufklärung über die besseren Alternativen fände ich sinnvoller.

                    Eben. Zudem frisst das nicht viel Zeit. Das kann man auch in einem 3-Tage-Kurs "PHP-Grundlagen" machen.

                    Jörg Reinholz

    2. Hallo dedlfix,

      Das PHP-Handbuch im Kapitel zu den variablen Variablen kann das erklären.

      Ein Link wäre durchaus angebracht gewesen: jedes Posting, das Schlüsselworte aus dem PHP-Handbuch enthält verringert die Relevanz des Handbuchs und macht das auffinden via Suchmaschine schwieriger. Ein Link verhindert dies.

      LG,
      CK

      1. Tach!

        Ein Link wäre durchaus angebracht gewesen: jedes Posting, das Schlüsselworte aus dem PHP-Handbuch enthält verringert die Relevanz des Handbuchs und macht das auffinden via Suchmaschine schwieriger. Ein Link verhindert dies.

        Und nofollow verhindert das nicht?

        Ich kann auch argumentieren, dass das PHP-Handbuch für einen, der PHP programmiert, so wichtig ist, dass der sich darin selbständig zurechtfinden muss, und das Nichtverlinken den Umgang mit dem Handbuch schulen soll.

        Außerdem ist der Link ja in einem Nachfolgeposting drin, weil es der OP ja anscheinend nicht geschafft/gewollt/wasweißich hatte, die gemeinte Seite zu finden.

        dedlfix.

        1. @@dedlfix

          jedes Posting, das Schlüsselworte aus dem PHP-Handbuch enthält verringert die Relevanz des Handbuchs und macht das auffinden via Suchmaschine schwieriger. Ein Link verhindert dies.

          Und nofollow verhindert das nicht?

          Wie wär’s mit einer Whitelist von Domains (selfhtml.org, w3.org, apache.org, php.net, jquery.com, bittersmann.de 😇, …), für die kein nofollow gesetzt wird?

          LLAP 🖖

          --
          „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
          „Hat auf dem Forum herumgelungert …“
          (Wachen in Asterix 36: Der Papyrus des Cäsar)
          1. Tach!

            Wie wär’s mit einer Whitelist von Domains (selfhtml.org, w3.org, apache.org, php.net, jquery.com, bittersmann.de 😇, …), für die kein nofollow gesetzt wird?

            Am Ende stellt man sich ungefähr dieselbe Sinnfrage wie für das Wählengehen. Was macht eine weitere Stimme für Großgewichte, die eh schon sehr weit oben stehen? Und warum haben es die Kleinen nicht verdient, gefördert zu werden?

            dedlfix.

            1. Hallo dedlfix,

              Am Ende stellt man sich ungefähr dieselbe Sinnfrage wie für das Wählengehen. Was macht eine weitere Stimme für Großgewichte, die eh schon sehr weit oben stehen? Und warum haben es die Kleinen nicht verdient, gefördert zu werden?

              Das nofollow ist ein Schutz gegen Spammer und Beurteilungs-Postings: wir hatten in der Vergangenheit öfter das Problem, dass Postings mit Problemseiten ein hohes Ranking hatten und bei Google vor der eigentlichen Seite gefunden wurde. Meines Erachtens kann man da ruhig eine exzessive Whitelist pflegen. Das nofollow war nie als Politikum gedacht.

              LG,
              CK

          2. Hallo Gunnar,

            jedes Posting, das Schlüsselworte aus dem PHP-Handbuch enthält verringert die Relevanz des Handbuchs und macht das auffinden via Suchmaschine schwieriger. Ein Link verhindert dies.

            Und nofollow verhindert das nicht?

            Wie wär’s mit einer Whitelist von Domains (selfhtml.org, w3.org, apache.org, php.net, jquery.com, bittersmann.de 😇, …), für die kein nofollow gesetzt wird?

            Gibt es schon lange, sonst hätte ich das nicht angemerkt ;-)

            LG,
            CK

            1. Hallo Christian,

              Wie wär’s mit einer Whitelist …

              Gibt es schon lange, sonst hätte ich das nicht angemerkt ;-)

              in deinem Posting ist aber das nofollow noch drin:

              <p><a href="http://php.net/manual/de/language.variables.variable.php" rel="nofollow">Ein Link</a> wäre durchaus angebracht gewesen: …
              

              Gruß Jürgen

              1. Hallo JürgenB,

                Wie wär’s mit einer Whitelist …

                Gibt es schon lange, sonst hätte ich das nicht angemerkt ;-)

                in deinem Posting ist aber das nofollow noch drin:

                Ja, PHP.net war noch nicht eingetragen. Das ist halt die Crux mit einer Whitelist: man muss dort Sachen eintragen ;-) hab das jetzt mal nachgeholt.

                LG,
                CK

                1. @@Christian Kruse

                  Das ist halt die Crux mit einer Whitelist: man muss dort Sachen eintragen ;-)

                  Ich verlinke öfter Mal Artikel meines geschätzten Kollegen (ist irgendiwe ein geflügeltes Wort geworden). IMHO könnte https://maddesigns.de/ auch mit auf die Whitelist.

                  Mir fallen sicher noch andere ein. Kann man die Whitelist irgendwo einsehen?

                  LLAP 🖖

                  --
                  „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
                  „Hat auf dem Forum herumgelungert …“
                  (Wachen in Asterix 36: Der Papyrus des Cäsar)
                  1. Hallo Gunnar,

                    Kann man die Whitelist irgendwo einsehen?

                    Nein.

                    LG,
                    CK

                    1. Hallo,

                      Nein.

                      Aus Gründen?

                      Gruß
                      Kalk

                      1. Hallo Tabellenkalk,

                        Aus Gründen?

                        nicht aus politischen, höchstens aus technischen.

                        Bis demnächst
                        Matthias

                        --
                        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
                      2. Hallo Tabellenkalk,

                        Nein.

                        Aus Gründen?

                        Was soll ich auf diese Frage anderes als „Ja“ antworten? 😂 Alles hat einen Grund. In diesem Fall den, dass bisher keiner auf die Idee gekommen war das einsehen zu wollen und ich deshalb da auch nichts gebaut habe.

                        LG,
                        CK

                  2. Hallo Gunnar Bittersmann,

                    IMHO könnte https://maddesigns.de/ auch mit auf die Whitelist.

                    Ich stimme zu. Hab ich mal getan.

                    Mir fallen sicher noch andere ein.

                    Immer her damit.

                    Kann man die Whitelist irgendwo einsehen?

                    Derzeit ist sie sehr überschaubar.

                    • selfhtml.org
                    • caniuse.com
                    • php.net
                    • perl.org
                    • wikipedia.org

                    Bis demnächst
                    Matthias

                    --
                    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
                  3. Tach!

                    IMHO könnte https://maddesigns.de/ auch mit auf die Whitelist.

                    Bist du sicher, dass du https-Seite verweisen möchtest? Da wird ein selbst signiertes Zertifikat verwendet. Das ist zwar nicht prinzipiell schlecht, aber es ist noch dazu auf eine andere Domain ausgestellt. Das sind gleich zwei Gründe, warum die Browser bitterlich zu weinen anfangen.

                    P.S. ich hab die andere Erwähnung mit Verlinkung auf die http-Variante umgeschrieben.

                    dedlfix.

  2. Moin!

    Beispiel:

    <?php
    // Beim Schreiben des Pogrammms ist nicht bekannt, welche Variable einen bestimmten Wert (hier: 'bar') erhält.
    // Aber während des Programmablaufes ist es das. Der Name der Variable soll 'foo' sein
    $vName='foo';
    // So wird es gemacht:
    ${$vName}='bar';  // $$vName='bar'; geht übrigens auch!
    //Und das klappt auch:
    echo $foo, "\n";
    
    
    1. Das weicht aber schon von Deinem Beispiel ab...
    2. Die Verwendung wird allgemein (aus den gleichen Gründen wie die Verwendung von eval auch) missbilligt. Grund: Es tauchen wie hier Variablen auf, deren Herkunft höchst mühseelig zu ermitteln ist und es werden Variablen ggf. überschrieben ohne dass dieses dem Plan des Programmierers entspricht. Besser wäre es allenfalls einen Hash zu benutzen:
    <?php
    // Beim Schreiben des Pogrammms ist nicht bekannt, welche Variable einen bestimmten Wert (hier: 'bar') erhält.
    // Aber während des Programmablaufes ist es das. Der Name der Variable soll 'foo' sein:
    $vName='foo';
    // So wird es gemacht:
    $vars[$vName]='bar';
    //Und das klappt auch:
    echo $vars['foo'], "\n";
    

    Jörg Reinholz