Ein Wunder $$ geht

Ich wundere mich in erster Linie, wie wenige darüber Bescheid wussten. Dieses Verhalten von PHP ist ja eigentlich ein alter Hut. Mehr dazu: http://www.php.net/manual/de/language.variables.variable.php
Liest denn heutzutage niemand mehr eine Dokumentation?

Aus ebenfalls langjähriger Praxis weiß ich, dass man in seltensten Fällen wirklich darauf zurückgreifen muss. Meist kann man solche Fälle durch bessere Planung vermeiden und auf viel performantere "normale" Variablen wechseln. Die $$a-Schreibweise ist auch IMHO schlecht, ${$a} ist nicht nur lesbarer, da es sofort ins Auge sticht, sondern auch flexibler, z.B. ein Array als variable Variable. Dieses Verhalten ist übrigens auch schön im PHP-Manual dokumentiert, sowohl im Fließtext als auch in den Notes.
 
Lukasz hat gesagt.:
[...] Aber ich denke du hast dennoch nicht richtig gelesen. Ich habe es extra in Dick Rot gedruckt.

$$ benutzt man eben nur dann, wenn man sich eine Dynamische Variable an ein und der selben Stelle wünscht. $$ ist aber nicht geeignet um siene php Seite voll zu ballern ;)
Hab ich auch nicht behauptet... meine Aussage war nur, dass deine Methode in den Anwendungsbereichen, die du aufgezeigt hast, recht unpassend ist :)

Lukasz hat gesagt.:
Hier geht es aber auch nicht um meine oder um deine Meinung. Meinungen sind eben Verschieden. Das ganze Prinzip (mit den listings) läst sich doch anwenden oder etwa nicht? - Hast du probiert.
Klar, deine Listings funktionieren. Aber es gibt einen Unterschied zwischen einer funktionierenden und einer guten Lösung...

Lukasz hat gesagt.:
Und wenn du meinst dass für Templates auch andere Lösungen gibt, so steht genau dies auch im Vordergrund im meinem Tuto ... Es gibt natürlich tausend Möglichkeiten wie man Templates...

Was ich mit dem gesammten Post andeuten wollte, ist das ich denke, dass dir diese Methode nicht liegt. Und das ist mir verständlich.
Ja, sie liegt mir nicht, weil sie eben etliche Nachteile mit sich bringt...

Lukasz hat gesagt.:
Aber du könntest dennoch mal ein Template das einfacher gehen soll mit dem im Tuto geschilderten Eigenschaften posten.
Oder Array die mit anderen Methoden schneller und effektiver ausgezählt werden. Usw, usw....
Ein komplettes Templatesystem zu erklären, würde den Rahmen hier etwas sprengen, aber das mit dem Array auszählen kannst du gerne haben:
PHP:
<?php

$aWohnort = array('Stuttgart', 'München', 'Stuttgart', 'München', 'Stuttgart');

$acWohnort = array_count_values($aWohnort);

$sSuchort = 'Stuttgart';

echo 'Leute aus '.$sSuchort.': ';
if (isset($acWohnort[$sSuchort])) {
	echo $acWohnort[$sSuchort];
} else {
	echo '0';
}

?>


Lukasz hat gesagt.:
P.S Du hast immer noch nicht gepostet was du nicht verstehst, deswegen denke ich eher, das du diese Variante von vorne her gedanklich ablehnst. -> Sowas kann ich auch verstehen, ist aber kein Grund das schlecht zu reden.
Ok, dann formulier ich es eben anders: Ich verstehe deine ganzen Ausführungen auf logischer Ebene. Aber ich weiß nicht, warum jemand ernsthaft dein Verfahren in dem von dir dargestellen Grad verwenden sollte.

Nicht nur gibt es (wie schon erwähnt) meistens performantere Lösungen. Ein anderer, nicht zu unterschätzender Aspekt ist auch die Sicherheit. Wenn du $$ auf eine Benutzereingabe anwendest (wie z.B. bei $$suchwort), kann es zu unerwarteten und unangenehmen Nebeneffekten kommen, da der Benutzer damit praktisch auf jede Variable in deinem Script Zugriff hat (ich denke da an Sachen wie $db_passwort o.ä.) Da müsste man Sicherheitsvorkehrungen treffen. Außerdem kann es dir passieren, dass du mit der Methode (z.B. beim Auszählen von Arrays) eigene, wichtige Variablen deines Scripts überschreibst. Damit schränkst du unter Anderem natürlich auch die im Array erlaubten Werte bzw. die Wahl deiner Variablennamen ein, wenn du dem entgegenwirken willst. Ich wünsch dir schon mal jetzt viel Spaß beim Auffinden eines solchen Fehlers...

Alles in Allem ist es wohl unsinnig, eine von vorneherein schlechte Lösung (Wartbarkeit, Lesbarkeit, Debugging...) durch etliche Sicherheitsabfragen so zu trimmen, dass sie genau so läuft wie eine einfachere, von sich aus sichere Lösung...

Es ist bei mir also keine Frage des Geschmacks, sondern eine Frage des praktischen Nutzens.

Aber sobald du mir auch nur einen sinnvollen Anwendungsbereich für $$ lieferst, der die genannten Schwächen nicht aufweist - dann wäre ich bereit, umzudenken.
 
Hrhr schön dass ihr was neues entdeckt habt :P

Anmerkung von mir:
Java unterstützt das nich
c ebenfalls nich

Ich muss auch Chrstph zustimmen. Ich kenns zwar schon lange und hab mich gefreut dass das mit PHP geht, praktisch anwenden tu ichs aber nicht wirklich oft.
 
Ich weiss nicht mehr genau, wo das war. Aber irgendwo hat mir $$ mal erheblich Arbeit gespart, war irgendwas mit dynamischen Grafischen Buttons und cachen. Genauso, wie das Aufrufen einer Funktion über den Inhalt einer Variablen, die den Funktionsnamen enthält:
PHP:
<?
  function foo() {
    echo "foo";
  }

  $f="foo";
  
  $f();

?>
Gibt tatsächlich foo aus.
Das sind nur zwei von den Möglichkeiten in PHP, von denen ich bei Studium des Handbuchs gedacht habe: "Wer bitteschön braucht sowas denn?"
Aber wie bei den meisten dieser Möglichkeiten habe ich sie früher oder später doch benutzt.
In PHP muss man wirklich vieles nicht selber schreiben, die Entwickler der Sprache haben meist schon dran gedacht.

Gruß hpvw
 
Denket mal an Formulare und die prüfung.

Ihr kennt das Sicherlich wählt der User ein Formular so dass er Ingeneur ist so soll er im nachinein andere Listenfelder ausfüllen, als ein Arbeiter.

mit $$ könnt ihr den folgenden Listenfelder andere Variablen zuweisen.

Unpraktisch ist es also nicht. Aufwändig ist es, wenn man nicht damit umgehen kann. Aber es ist nicht wirklich schwer

PS. Natürlich gibt es da auch andere Wege. Viele Wege führen eben nach Rom!

Grüsse!
 
Zuletzt bearbeitet von einem Moderator:
Ich kenne eigentlich nur eine sinnvolle und vertretbare Anwendung dafür. Und zwar, wenn man ein Script hat, dass für register_globals on programmiert ist:
PHP:
foreach($_GET AS $k => $v)
	$$k = $v;
foreach($_POST AS $k => $v)
	$$k = $v;
 
Zurück