global $GLOBALS; ?
sandra
- php
Hi,
ich habe eine winzige function, die mir einzelne Blöcke auf meiner Website einfügt und auch phps included. Die includeten phps sollen Zugriff auf alle gesetzen variablen der Site haben. Dadurch, dass sie aber durch eine function aufgerufen werden, ist das momentan nicht so.
Kann ich in der function irgendwie ALLE Variablen integrieren?
Also sowas wie global $GLOBALS; (geht nicht) oder global all; (geht nicht).
Danke für eure Hilfe
LG
Hallo,
Dadurch, dass sie aber durch eine function aufgerufen werden, ist das momentan nicht so.
$foo = 'hund';
function bar(){
echo $foo; // sollte funktionieren
$bla = 'katze';
return true;
}
bar();
echo $bla; // sollte nicht funktionieren
Kann sein dass ich zur Zeit bisschen viel C++ lese aber innerhalb einer Funktion stehen die ausserhalb deklarierten Variablen eigentlich zur Verfügung.
Hab ich etwas falsch verstanden oder durcheinander gebracht?
Grüße, Matze
$foo = 'hund';
function bar(){
echo $foo; // sollte funktionieren
$bla = 'katze';
return true;
}
funktioniert nicht
richtig wäre:
~~~php
$foo = 'hund';
function bar(){
global $foo;
echo $foo; // funktioniert
$bla = 'katze';
return true;
}
global extract($GLOBALS); // Syntaxerror
Übergabe von $GLOBALS an die Funktion [aufruf_funktion($para1,$para2,$GLOBALS)] geht auch nicht.
Mir gehen die Denkansätze aus..
Hallo
$foo = 'hund';
function bar(){
echo $foo; // sollte funktionieren
$bla = 'katze';
return true;
}
>
> funktioniert nicht
> richtig wäre:
>
> ~~~php
$foo = 'hund';
> function bar(){
> global $foo;
> echo $foo; // funktioniert
> $bla = 'katze';
> return true;
> }
... oder
$foo = 'hund';
function bar($foo){
echo $foo; // funktioniert
$bla = 'katze';
return $bla;
}
$bla = bar($foo);
echo $bla; // funktioniert nun auch.
... womit auch $bla
zur Verfügung stünde. Obwohl das *in diesem Szenario* verwirren könnte, da $foo
direkt nichts mit $bla
zu tun hat. Typischerweise prüft oder manipuliert man ja in einer Funktion den Eingabewert. Somit bekommt man eine Prüfausgabe (z.B. true, false, Zahlenwert oder ein Array wie bei getimagesize) oder die veränderte Eingabe zurück.
Für deinen Fall solltest du dir überlegen, inwieweit du im globalen Scope arbeitest, wo in allen includeten Skripten alle Variablen zur Verfügung stehen (Achtung: Namenskonflikte möglich), oder was du in welchen Skripten in Funktionen kapselst. Für die Funktionen wäre dann zu überlegen, was als Parameter übergeben werden kann/soll und was per global
auch innerhalb der Funktionen zur Verfügung stehen soll. Bei global
musst du allerdings alle Variablen einzeln angeben.
Für den Fall, dass Variablen Benutzerdaten enthalten (z.B. Formulareingaben oder Daten angemeldeter Benutzer) bietet sich (je nach Fall) die konsequente Nutzung von $_GET
, $_POST
, $_COOKIE
oder $_SESSION
als Speicher für diese Daten an, da diese Arrays von sich aus superglobal sind, also sowohl innerhalb als auch außerhalb von Funktionen zur Verfügung stehen.
Tschö, Auge
Dein Beispiel ist mir natürlich auch bekannt.
Ich habe habe wie gesagt sehr viele Variablen, die an verschiedenen Stellen auch mehrfach verwendet werden.
Die Funktion ist wie gesagt auch sehr klein und eine temporäre Hilfsfunktion. Sieht ungefähr so aus:
function show_nav_block($name,$id,$class) {
echo "<div id='$id' class='shadow $class'><div class='oben'></div><div class='mid'>";
include("nav_blocks/$name.php");
echo '</div><div class="unten"></div></div>';
}
Wollte eben einfach nur, dass wenn ich änderungen an den nav_blocks machen möchte, ich nicht jeden einzeln behandeln muss. Also die Grundstruktur halt immer die selbe ist.
Da dies anscheind nicht möglich ist, werde ich jetzt halt einfach die dateien ohne function includen und über und unter dem include jeweils ein include für template_head und eins für template_foot machen (ist zwar nicht wirklich hübsch, aber wie gesagt, ist für eine temporäre programmierungsumgebung.
Außer natürlich, euch fällt noch ein besserer Ansatz ein.
LG
Hallo
Dein Beispiel ist mir natürlich auch bekannt.
Ich habe habe wie gesagt sehr viele Variablen, die an verschiedenen Stellen auch mehrfach verwendet werden.
Die Funktion ist wie gesagt auch sehr klein und eine temporäre Hilfsfunktion. Sieht ungefähr so aus:
function show_nav_block($name,$id,$class) {
echo "<div id='$id' class='shadow $class'><div class='oben'></div><div class='mid'>";
include("nav_blocks/$name.php");
echo '</div><div class="unten"></div></div>';
}
>
> Wollte eben einfach nur, dass wenn ich änderungen an den nav\_blocks machen möchte, ich nicht jeden einzeln behandeln muss. Also die Grundstruktur halt immer die selbe ist.
Wie wäre es dann damit, nicht den Namen der Datei, in der die Struktur zusammengebaut ist, zu übergeben, sondern ein Array, das die Infos zur Navigation enthält. Die Navi würde dann ausschließlich in dieser Funktion erstellt.
Beispiel:
~~~php
function buildNav($array,$id,$class) {
$r = "<ul id=\"".$id."\" class=\"shadow, ".$class."\">";
foreach ($array as $item) {
$r .= "<li><a href=\"".$item["url"]."\">".$item["text"]."</a>";
}
$r .= "</ul>";
return $r;
// alternativ: echo $r;
}
$navArray = array(
array("url"=>"/pfad/zu/seite1","text"=>"Seite 1"),
array("url"=>"/pfad/zu/seite2","text"=>"Seite 2"),
array("url"=>"/pfad/zu/seite3","text"=>"Seite 3"));
echo buildNav($navArray, $id, "klassenname");
Jetzt käme es nur darauf an, dass du peu a peu die richtigen Arrays an die Funktion übergibst. Auf die Weise würdest du einerseits den Code wiederverwendbar machen und andererseits diverse Includes sparen.
Tschö, Auge
Hello,
Kann sein dass ich zur Zeit bisschen viel C++ lese aber innerhalb einer Funktion stehen die ausserhalb deklarierten Variablen eigentlich zur Verfügung.
Hab ich etwas falsch verstanden oder durcheinander gebracht?
Ja, in PHP ist das nicht so, wie bei fast allen implizit deklarierenden Sprachen.
Variablen, sie außerhalb einer Funktion deklariert (also angelegt wurden), sind bei PHP innerhalb der Funktion erstmal nicht sichtbar, es sei denn, dass man sie dort auch wieder mit
global variablenname;
auf den Gültigkeitsbereich von außerhalb legt.
http://www.php.net/manual/en/language.variables.scope.php
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
[latex]Mae govannen![/latex]
Also sowas wie global $GLOBALS; (geht nicht)
Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?
Cü,
Kai
Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?
Innerhalb von Funktionen ist das anscheinend nicht so. Sonst müsste man nicht gloable Variablen erneut als solche deklarieren (global $Varaiblenname;)
[latex]Mae govannen![/latex]
Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?
Innerhalb von Funktionen ist das anscheinend nicht so. Sonst müsste man nicht gloable Variablen erneut als solche deklarieren (global $Varaiblenname;)
Doch. Ich rede von $GLOBALS, nicht von anderen Variablennamen. global $GLOBALS
wäre daher sehr sinnfrei.
Cü,
Kai
Hello,
Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?
Innerhalb von Funktionen ist das anscheinend nicht so. Sonst müsste man nicht gloable Variablen erneut als solche deklarieren (global $Varaiblenname;)
Dann schau Dir mal
http://www.php.net/manual/en/reserved.variables.globals.php an und das
Beispiel #2 auf der Seite
http://www.php.net/manual/en/language.variables.scope.php
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
ich habe eine winzige function, die mir einzelne Blöcke auf meiner Website einfügt und auch phps included. Die includeten phps sollen Zugriff auf alle gesetzen variablen der Site haben. Dadurch, dass sie aber durch eine function aufgerufen werden, ist das momentan nicht so.
Kann ich in der function irgendwie ALLE Variablen integrieren?
Also sowas wie global $GLOBALS; (geht nicht) oder global all; (geht nicht).
Trenne das Includen von Code und dessen Ausführung so gut es geht voneinander. Ein eingebundenes Modul sollte also am besten überhaupt keinen Code ausführen. Das sollte erst dann geschehen, wenn eine Klasse daraus instatiiert wird oder eine Funktion daraus benutzt wird.
Diese Forserung lässt sich nicht immer realisieren, manchmal _kann_ es sinnvoll sein, dass durch die Einbundung alleine bereits Code ausgeführt wird. Aber diese Fälle sollten immer Sonderfälle bleiben.
Wenn Du das Ganze nun so aufbaust, dass eben erst eine Instanz aufgebaut werden muss, dann kannst Du der auch eine Referenz auf einen globalen Wertecontainer des Haupt-Scriptes übergeben. Dann können die Funktionen oder Methoden alle darin enthaltenen Elemente erreichen.
Alternativ arbeitest Du gleich sauber mit Vererbung, was aber die Planung aufwändiger macht.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg