Ein Wunder $$ geht

L

Lukasz

Hallo

ich habe mal wieder die nacht lang etwas gebastelt. So wie es freaks tun :-) Und bin an ein erstaunliches Ergebniss gekommen:

Stellt euch Drei Variablen vor

$a
$b = "ab"
$ab

Ich kann jetzt nicht auf den Inhalt $ab zugreifen wie folgt
PHP:
$b = "ab";
$ab = "Lukasz";
$a = "$$b";

aber folgendes geht

PHP:
$b = "ab";
$ab = "Lukasz";
$a = $$b;
//Somit wird $a = $ab gesetzt. also Lukasz



Und es funktioniert auch noch so:
PHP:
$b = "ab";
$ab = "Lukasz";
if(isset($$b)) {....} // prüft ob $ab gesetzt ist

Zusammen mit einem Array, kann man so aus PHP Templates eine Variable ausgeben, falls diese gesetzt ist und falls nicht den Vraiablen namen. Bislang ist es ja so, dass wenn eine Variable nicht gesetzt war, dass dann eben nicht ausgegeben wurde.

Ich habe so ein string replace erarbeitet wie folgt...

PHP:
$ausgabe2=explode(' ',$ausgabe2);
for($i=0;$i<count($ausgabe2);$i++)
{
if ($ausgabe2[($i-1)] == "lgcreplace" && isset($$ausgabe2[$i])) { $ausgabe=preg_replace("/lgcreplace $ausgabe2[$i]/",$$ausgabe2[$i],$ausgabe); }
}
....

Also PHP ist doch klasse, erfinderisch muss man eben sein!

Wenn man sich das vorstell, so habe ich auch in GD Bibiliotheken einen guten Einsatz gefunden. Einfach einen Array mit bleibigen Farben erzeugen, und so durch eine Schleife die Farben wählen. Ist der Array foll (abgearbeitet) entweder array wechseln oder von vorn beginnen, und dabei kann man die RGB Wert nochmals nacharbeiten.

Richtig interessant wird es sofern man das beim prüfen der Variablen in einem Array abspielt. So kann man kurz prüfen ob nicht gestattete oder eingeschränkte Variablen mit erlaubten Inhalt übergeben werden. Arrays prüfen ist dabei auch kein Problem. Kaum Aufwand und bremst den Script nicht.

Und auch mit Sessionen klapts einwandfrei. So kann man ermitteln welche SESSIONS Varaiblen der User aktuell ausführt. Aber alles will ich auch nicht Preis geben!

Ich wollte nur sagen, dass auch hier aber Millionen Wege und Möglichkeiten offen sind.

Höre mir Komentare gerne an!

Liebe Grüsse aus Reutlingen!
 
Zuletzt bearbeitet von einem Moderator:
Mir wird das ehrlich gesagt nicht klar an Hand deines Beispiels. Könntest du das nochmal genauer erläutern?

Aber ansonsten ist es nicht schlecht, was du da gemacht hast!
 
$$ Bediengtes arbeiten:

Da der Wunsch aufgetaucht ist, das ganze etwas näher zu beschreiben, habe ich mich auch dazu entschlossen. Vieleicht kommen so auch Ideen anderer hervor.

Um diese Scripte zu verstehen sollte man um zwei Ecken denken. Ich gebe zu, dass das nicht gerade ganz einfach ist, wird aber mit einer kleinen Auseinandersetzung der Scriptbeispiele verständlich.

Zunächst sollte man erst einmal klären, wozu das ganze überhaupt sinnvoll sein soll. Gerade an diesem Punkt scheitern die Gedankengänge. Der Sinn kommt, und wird meist spähter erst einleuchtend. Ebenso die effektive Nutrung klärt sich erst dann.

Ich hatte bereits erwähnt, mann muss um 2 Ecken denken. Gerade bei dieser Methode muss man sich erst einmal vor die Augen führen, was eine Variable ist. Sicherlich weis das jeder von euch, aber darum geht es nicht. Hier muss eine neue Ansicht der Sache verstanden werden. Wie jeder weiss, wird in php eine Variable mit dem Dollar Zeichen ($) am Anfang gekennzeichtnet. In C++ Bspweise wird diese angelegt, (bsp float apfel) und trägt dacher keine Markierung. Genau hier muss man mit seinen Gedanken ansetzen. $ markiert eine Variable. $ ersetzt aber auch die Variable in den Wert der in der Variable (Bsp. echo "$lukasz";) steht.

Es kann und sollte dacher einleuchten, dass eine Variable garnicht erst mit $ markiert werden müsste, wird aber in php abverlangt. Dieser Vorgang wird eben in php angewendet, und wäre in C++ Beispielweise Compeiler bediengt lösbar. Es ist dacher nicht schlecht zu wissen was sich hinten im System abspielt, sobald man in sein script $lukasz ="ich";. Denn php erstellt dann eine Variable, die mittels float o. a. generiert werden kann.

Was bedeutet $$lukasz ?
Das ist eigentlich leicht erklärt.
echo $$lukasz;
Sollte für den Betrachter gedanklich anders abgelesen werden. Und zwar in etwa so:
echo $($lukasz); Hiermit sieht man schon, dass wir jetzt die Möglichkeit haben, mit dem ersten $ die Variable zu markieren, und mit dem zweiten $ einen Inhalt zu ersetzen. Und so ist es leicht gesagt,
echo $$lukasz; gibt nichts aus. Ist aber die Variable $lukasz gesetzt sieht das ganze ganz anders aus:
$lukasz="apfel";
echo $$lukasz; Was gedanklich wie folgt aussieht
echo $($lukasz) und da die zweite Variable ersetzt wird und $lukasz=apfel ist bedeutet dies
echo $apfel;
Wer in php gut begabt ist, dem ist schon ein Vorteil aufgefallen. Richtig, $$ kann im Stamm verändert werden, und zwar ständig. Dies ist realisierbar, in dem man in diesem Beispiel $lukasz einen neuen Wert zuweist. Man kann aber den Vorteil auch nutzen, sofern der Inhalt von $lukasz immer ein anderer sein kann.

Klar kann mann $$ auch mit einem Array anwenden, auch diese Methode legt kein Problem dar.
$lukasz = array();
$lukasz[]="apfel";
$lukasz[]="birne";
echo $$lukasz[0]; Und gibt in diesem Fall $apfel aus falls $abpfel einen Wert hat.
echo $$lukasz[1]; Und gibt in diesem Fall $birne aus falls $birne einen Wert hat.

So jetzt zu Praxisbeispielen:
Array auszählen (Zählen wie oft eine Eigenschaft vorhanden ist):
tde1.JPG


PHP:
for($a=0; $a<count($namen);$a++){
{ $$name[$a]++; }
{ $$alter[$a]++; }
{ $$wohnort[$a]++; }
{ $$hobby[$a]++; }
{ $$sex[$a]++; }
}

Und schon wars das, alle eigenschaften wurde durchgezählt. Mann kann sich jetzt ausgeben lassen wieviele weibliche und wieviele männliche anbei sind. Aber auch welche hobbys wie oft vorhanden sind. Und welche Städte wieoft... und welches alter wie oft... und welche Namen wie oft...!
Erst mal für die die es nicht gleich begriffen haben, Es wir einfach eine Variable erzeugt, die dann mit ++ einfach erhöt wird, ist diese vorhanden, wird diese nur noch erhöht.
Es gibt auch andere Methoden wie bei mysql SELECT COUNT(*) Beispielweise. Was aber länger dauert, weil man eben den Stamm nicht verändern kann. Und damit meine ich, ich muss erst wissen was gezählt werden soll. An Hand der $$Methode muss ich es nicht wissen, was bedeutet, dass der Stamm auch keinen bestimmten Nenner haben muss.
Ich werde den Vorgang erklären, und das was mit dem Script passiert ist. Schauen wir uns mal das Ergbniss des Scriptes an:
tde2.JPG


Natürlich geht eine Variable wie $21= nicht! Aber hier geht es erstmal um die Logik zu verstehen. Abhilfe damit eine Variable keine Sonderzeichen beinhaltet, oder mit einer Zahl begint, kann man mit replacefunktionen bewirken.
Ich komme mal wieder zum Script zurück. Wenn ihr euch das Ergebniss in der Grafik anschaut, so sieht ihr, dass einfach Varibalen mit einem Inhalt der Wiederholung zurückgegeben wurden. Somit ist jetzt $Stuttgart = 3;
Möchte der Webmaster jetzt wissen wieviel aus Stuttgart kommen, so gibt er folgenden Code aus:
$suchwort="Stuttgart";
echo "Aus $suchwort kommen ".$$suchwort." her";
Hierbei bedeutet $$suchwort nichts anderes wie $Stuttgart, da $suchwort= Stuttgart ist.
Man kann auch dieses sichern, indem man erst prüft
if(isset($$suchwort)){ echo $$suchwort; }

Wichtig man kann $$uchwort nicht in Gänzefüsschen ausgeben also so echo "$$suchwort"; sondern die Variable mus blank darstehen. wie hier in etwa echo "bla bla bla".$$suchwort." bla bla"; oder so echo $$suchwort;

Jedem sollte einläuchtend geworden sein, dass wir nicht nur das Suchwort ausgeben können, sondern alles andere auch. Man kann so also sehr schnell alle Werte auszählen und auch ohne Suchwort alle ausgeben lassen.
 
Zuletzt bearbeitet von einem Moderator:
Naja vorher wollte ich noch auf Schaltungen mit $$ eingehen. Aber bin noch nicht ganz fertig mit dem Beitrag. Werde es aber noch nachposten.
 
hmm, gibts in PHP ne eval()-Funktion? so wie ich das sehe, wäre das genau das gleiche:

eval(lukasz) bei lukasz = apfel und apfel = 2 ergibt 2...

Korrigier mich, wenn ich falsch liege, vielleicht ist mir auch bloß was nicht ganz klar...

Gruß.
 
Sicher aber wir zählen ja nicht einen Array. Dies könnte Besipielweise durch 10 gar tausend Arrays geschehen. Und Mittels Coprozesseors (Als wenn der Script in einer Funktion ausgeführt wird), würden dabei nicht einmal die Grundvariablen verändert.

Ausserdem hast du bei eval nur logische Schaltungen. (Also muss der Script vorher bestimmt sein) -> (Eine bestimmte Aufgabe durchfühern) mit $$ aber kannst du auc´h nicht logische Schaltungen durchführen:

Mir fehlen hier noch die Grafiken aber kommen bald nach:
Hier ein Beispiel Schaltplan mit $$:
Zunächst ein Schaltplan wird ständig in Scripten angewendet. Dies kann durch if() oder andere Funktionen geschehen. OOB oder andere Mittel malen oder beschreiben uns einen Schaltplan.
Man kann sich die if() bzw, Funktionsschatlpläne nicht sparen, jedoch einsparen. Und das geschieht wiederum, in dem man die Variablen verschaltet. Dacher bringe ich das hier auch mittels Schaltplan zum Ausdruck. Aus Beispielweise 5 Schaltungen können so 2 erstehen, muss aber nicht der Fall sein. Und gnau das ist der Punkt. Eine Schaltung mit $$ kann Sein, muss aber nicht. Während eine andere in der Funktion zu einer Bestimmung vogearbeitet ist.

Nehme man an es gibt 3 Variablen, die Sich immer ändern können:
$a="lukasz";
$b="apfel";
$d="verweigert!";

Mit $$ kann man jetzt einen simplen Schlatkreislaufplan erstellen.
$$a=$a;
Somit wäre $a=$lukasz und $lukasz = $a weil $a=luzkasz ist und $$a = $lukasz. Beide aber geben den Wert Lukasz aus.
echo $a; // Ausgabe lukasz
echo $lukasz; // Ausgabe lukasz
Man könnte auch sagen, in diesem Fall wird eine kopie erstellt. Dabie ist die Schaltung die Reihenfolge des Scriptes, und kann somit muss aber nicht sein.

Nochmals die Reihenfolge macht den Script aus.
1. $a="lukasz",
2. $$a=$a; // $($a) = $a; -> $lukasz=$a; -> $lukasz=lukasz; und $a bleibt somit lukasz weil $a=$lukasz ist
Richtig, eine Gleichung. Die Gleichung nimmt hier die wichtigsten Bestandteile des Scriptablufs ein. Aber auch andere Faktoren sollten ins Auge treten. $a und $lukasz tragen den Wert lukasz und sind druch die Schaltung lukasz miteinander verschaltet. Somit wirt der Wert also der Inhalt der Variable zum Schaltidentifikator. Das ist für das nächste Beispiel sehr wichtig. Jetzt kommt eine Schaltung, die keinen bestimmte geschlossene Verzweigung aufweist:
$$a=$b // $lukasz=$b;
$$b=$$a // $apfel = $lukasz;
if($$b = $lukasz) { ..... }
Anfangs haate ich eben schon geschriebn, dass die ersten Variablen geändert werden können. Und da nach $lukasz verglichen wird, so kann auch sein, das zu Anfangs $a nicht lukasz ist. Und Somit auch hier eine Schaltung die kann muss aber nicht sein.


Sicher ist das kompliziert. Aber alles was man braucht ist ein Taschenrecher. Man unterscheidet am besten einfach eine logische Schaltung, und eine nicht logische Schaltung der Variablen. Während die logische einen geschlossenen Kreis darstell, hat die unlogische Schaltung keinen festen geschlossenen Kreis, kann aber mit unter anderem einen beinhalten, muss aber nicht. An Han der Grafiken zeige ich mal eine logische Schaltung:

Hier sind die Symbole in eine logischen Gleichung. 2 minimierte Fenster sind gleich zwei Punkten. Zwei Punkte wiederum sind gleich zwei minimierte Fenster.
Und hier eine nicht logische Schaltung:

Während zwei minimierte Fenster gleich zwei Punkten sind, ist das Ergebniss von zwei Punkten nur eim minimiertes Fenster.

Genau dieses Prinzip kann $$ bewirken. Mitt $$ kann man die Kopie oder den Stamm verändern. Um eine Kopie zu verändern, braucht man kein $$, oft langen simple Methoden. Aber um den Stamm zu ändern, hat man immer einen Aufwand. Dies kann auch durch Funktionen oder anderem bewirkt werden, jedoch muss der Stamm bestimmt sein, oder vorgegeben werden.

Möchte ich durch einen Funktion einen Wert verändern, so muss die Funktion bestimmt also logisch sein, oder der Wert. Während mit $$ die Funktion nicht bestimmt sein muss, kann aber, und der Wert überhaupt keine Rolle spielen muss.

Warum muss der Wet keine Rolle spielen?
Weil $$ sich immer auf die Zweite Variable bezieht. Ist diese nicht gesetzt so bleibt $ und damit nichts übrig.

Wrum muss die Funktion nicht betimmt sein?
Weil hier nur mit anderen Variablen verschaltet wird. $$a = 4; setzt nicht unbediengt eine verzweigung. Besser nur wenn $a gesetzt ist kommt die Verzweigung zu stande.

Auch hier kann, muss aber nicht.

Genug der Theorie. Interessanter ist ein Beispielscript:
Über gibt mal über die URL ?a=a und dann mal ?a=b
PHP:
<?php
if($$a = $a) { echo "Schaltung ist logisch"; }
if($$a != $a) { echo "Keine logische Schaltung"; }
?>
Erklärung:
Wird über die URL ?a=a übergeben so ist $a = a. Somit bedeutet $$a $a und wen der Wert $a (a) dem Wert $a (a) gleich ist, ist die Schaltung logisch.
Wir über die URL ?a=b gestzt so ist $a = b. Somit bedeutet $$a $b und wen der Wert $b () nicht gleich $a(b) ist, so ist die Schaltung nicht logisch. $b ist ja auch nicht gesetzt.
Aber kurz erklärt: Während im ersten Beispiel $a = $a dies kann 0=0 oder 5=5 oder a=a sein, logisch ist, ist im zweitem Beispiel $b nichts also gleich null. Und da (NULL = b) nicht aufgeht, ist die Gleichung unlogisch.
Einsatz: So ein Script kann man dau einwenden, um gerade Werte die übergeben werden zu prüfen. Sind diese erlaubt, kann man die Abweisung ausführen. Ist dies nicht der Fall, wird eben davon abgesehen.

<?php
if(isset($$a) && $$a = $a) { $a = $$a; }

?>


Wie anfangs besprochen, sparren wir uns hier zumindest eine if() else Funktion ein.
 
Zuletzt bearbeitet von einem Moderator:
Natürlich geht das in PHP.

Mein Vorgänger in der Firma in der ich arbeite hat in den PHP Projekten das
extrem genutzt.
Variable Variablen.

Und ich kann euch eines Versprechen:
Wenn jemand zu mir mit Code kommt in dem das vorkommt, dem haue ich den
Code um die Ohren.

Es gibt wenig (ausser in Perl :-) ) was noch schlimmeren Unwartbaren Code
fabriziert.

Stell dir vor du hast ein Script mit 5.000 Zeilen Code. Du musst dich in diesen Code
einarbeiten.
Da greift jemand ganz unten im Code auf die Variable $homeContent zu. Du versuchst
herauszufinden wo der Wert dieser Variable gesetzt wird.
Keine IDE kann dir aber irgendwo, auch in allen includierten Files, ein 2. Vorkommen von
$homeContent finden.

Dann durchsuch mal ein Fremden Code wo irgendwo diese Variable dynamisch benannt wird.

Nach einer stunde hast du das endlich gefunden, und es stellt sich heraus das diese Variable einfach fast komplett unwichtig war und du ca 0,01 % weitergekommen bist den Code zu verstehen.

Das ist jetzt kein theoretisches Beispiel, sondern das habe ich vor 3 Jahren real durchgemacht!
 
@Christian Fein

ich kann dich verstehen. Aber auch hier gibt es ein Simples OOB. Eine Planungsmethode. (Die Gleichung). Komm ich aber am Ende dazu. Das Ganze macht nichts anderes wie ein Tachenrecher aus. Eben den Rechenweg. Man schriebt einen simplen Script. Und setzt ihn in Symbole um. Diese rechnet man dann in die Gleichung.

Liebe Grüsse!
 
Zuletzt bearbeitet von einem Moderator:
Zurück