global => mehrfaches include() nicht mehr nötig?
Hans
- php
Hallo,
Ich habe mehrere Funktionen in der Datei "index.php", die alle bestimmte Variablen aus der Datei "inc.php" benötigen, die DAtei daher mit "include" einbinden.
Es werden pro Funktion immer nur einige Variablen benötigt, jedoch weiß man vor der Ausführung nicht, welche.
Deswegen binde ich bei jeder Funktion "inc.php" mit ein.
Jedoch ist das doch umständlich, weil eben nicht alles auis "inc.php" benötigt wird.
Könnte ich nicht einfach in "inc.php" alle Variablen mit "global $variable" definieren und "inc.php" EINMAL am Anfang von "index.php" einbinden?
Oder sind die Variablen aus "inc.php" dann immer noch nicht in den Funktionen verfügbar? (Ich möchte die Variablen auch nicht als PArameter übergeben...)
Danke & MfG
Hans
Es werden pro Funktion immer nur einige Variablen benötigt, jedoch weiß man vor der Ausführung nicht, welche.
Deswegen binde ich bei jeder Funktion "inc.php" mit ein.
Jedoch ist das doch umständlich, weil eben nicht alles auis "inc.php" benötigt wird.Könnte ich nicht einfach in "inc.php" alle Variablen mit "global $variable" definieren und "inc.php" EINMAL am Anfang von "index.php" einbinden?
Nein. Wenn Du momentan tatsächlich folgendes machst..
function bla()
{
include("inc.php");
blabla();
}
..dann wird Dir global alles lahmlegen. So wie im Beispiel oben legst Du nämlich lokale Variablen an, d.h. Variablen, die nur innerhalb der Funktion existieren. global hingegen erweitert den Gültigkeitsbereich einer Variable auf den gesamten Programmcode. Der Unterschied ist, daß damit die Variablen nicht mehr bei jedem Funktionsaufruf neu initialisiert werden, sondern die Werte von alten, möglicherweise ganz anderen Funktionsaufrufen behalten.
Gruß,
soenk.e
Hi,
daß damit die Variablen nicht mehr bei jedem Funktionsaufruf neu initialisiert werden, sondern die Werte von alten, möglicherweise ganz anderen Funktionsaufrufen behalten.
Das wäre mir Wurst, weil die Variablen keine anderen Werte annehmen sondern nur ausgelesen werden.
Nehmen wir mal an:
##########
inc.php
########
<?
global $i=0;
global $k=1;
?>
-------------------
##########
index.php
##########
<?
include('inc.php');
function test()
{
print $i; // Wäre DAS möglich? also würde die Variable existieren?
}
?>
-------------------
Danke ,
Hans
Oi,
warum probierst Du Dein Beispeil nicht aus? Oder liest nach, wie der Scope von Variablen in PHP aussieht (http://de.php.net/manual/en/language.variables.scope.php)?
Nehmen wir mal an:
[...]
global $i=0;
[...]
##########
index.php
##########
<?
include('inc.php');function test()
{
print $i; // Wäre DAS möglich? also würde die Variable existieren?
Mal abgesehen von dem Error, den die sinnlose Verwendung des Schlüsselwortes "global" in inc.php werfen würde, wäre das möglich. Ja, die Variable $i würde existieren und die kommentierte Anweisung schriebe eine 0 auf den Bildschirm. Das würde sie aber auch, wenn in einer syntaktisch korrekten inc.php so etwas wie $i = 4711 stünde.
Das wäre mir Wurst, weil die Variablen keine anderen Werte annehmen sondern nur ausgelesen werden.
Wenn eine Variable keine anderen Werte annimmt und nur ausgelesen wird, ist sie dann nicht per definitionem eine Konstante? Dann könntest Du in inc.php festlegen:
define("CONST_I",4711);
und diese Konstante ohne Problem mit dem Scope überall verwenden. Dann müsstest Du auch nicht nachlesen, wie das mit dem Scope der Variablen in PHP funktioniert...
HTH Robert
Hio,
Könnte ich nicht einfach in "inc.php" alle Variablen mit "global $variable" definieren und "inc.php" EINMAL am Anfang von "index.php" einbinden?
Könntest du. Ich würde dann diese Variablen dann auch global definieren. So hast du sie egal wo Du sie einbindest immer über global erreichbat.
Oder sind die Variablen aus "inc.php" dann immer noch nicht in den Funktionen verfügbar? (Ich möchte die Variablen auch nicht als PArameter übergeben...)
Natürlich sind sie nicht in der Funktion verfügbar. Da PHP eine strenge Unterteilung des Gültigkeitsbereich einer Variablen hat. Aber du kannst Sie verfügbar machen. über global oder über den $GLOBALS-Array kannst du sie ansprechen.
Denoch ist diese Variablen über Parameter zu schicken durchaus der bessere Weg (sofern das innerhalb des Contextes überhaupt geht). Da du sonst eine Funktion von dem Vorhandensein globale Variablen abhängig machst. Wenn du diese Funktion dann irgendwo anders verwenden möchtest, arbeitet sie evtl. nicht, weil entsp. variablen fehlen.
gl & hf
Thorsten