require_once und global
Manu
- php
Hallo zusammen,
ich stehe hier gerade etwas auf dem Schlauch.
In einer Funktion brauche ich ein Array, welches ich in einer Extra-Datei angelegt habe.
Diese möchte ich nun inkludieren und das Array per 'global $array;' zur Verfügung stellen. Das klappt aber aus einem mir unerfindlichen Grund nicht...
Hat jemand einen Hinweis für mich?
function setValues ($sFilename) {
require_once('config/constants.conf.php');
global $aServiceCode;
print_r($aServiceCode);
}
Gruß,
Manu
Hat jemand einen Hinweis für mich?
function setValues ($sFilename) {
require_once('config/constants.conf.php');
global $aServiceCode;
print_r($aServiceCode);
}
Ich weis nicht warum, aber er hatte bei mir die selben Probleme, deshalb habe ich zu :
`$GLOBALS['aServiceCode'] = $aServiceCode;`{:.language-php}
gegriffen. Eventuell hilft das auch bei dir.
Hi Manu,
Nun ja, was passiert bei diesem Code? Schauen wir uns das mal im Detail an:
function setValues ($sFilename) {
require_once('config/constants.conf.php');
// Die Datei constants.conf.php wird geladen, diese definiert die
// Variable $aServiceCode, welche nun vom Typ Array ist.
global $aServiceCode;
// Nun wird die globale Variable $aServiceCode an selbige lokale
// Variable gebunden, prinzipiell geschieht also so etwas:
// $aServiceCode = $GLOBALS['aServiceCode']
// Dadurch gehen die Werte aus der constants.conf.php natürlich
// verloren.
print_r($aServiceCode);
// ... und du hast hier wieder den Wert, den du vor Aufruf der
// Fuktion hattest.
}
Kurz um: Vertausche die beiden Zeilen require und global, oder nutze das superglobale Array $GLOBALS, wie Pryos es vorgeschlagen hat.
Noch eine Frage: Warum verwendest du require\_once()? Eine Funktion sollte man normalerweise auch mehrfach aufrufen können, aber wenn du deine Funktion ein zweites Mal aufrufst, gibt es einen Fehler. Du solltest an dieser Stelle aus meiner Sicht lieber nur require() verwenden oder über setzen eines Flags einen zweiten Aufruf von require\_once() verhindern.
Viele Grüße,
~ Dennis.
--
Mein [SelfCode](http://community.de.selfhtml.org/fanprojekte/selfcode.htm): [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:# ss:) de:\] js:| ch:{ sh:| mo:} zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%7C+mo%3A%7D+zu%3A%7C)
Hallo ihr zwei,
nun ja, das Globals-Array wollte ich vorerst vermeiden - aber wie es ausschaut, komme ich nicht drum herum...
@Dennis: meine ersten Versuche habe ich ohne 'global' durchgeführt - mit dem gleichen Ergebnis: das Array war NULL...
Ich bin mir allerdings sicher, dass ich so etwas schon einmal gemacht habe...ich werds mal weiter probieren...
require_once gibt doch imho keinen Fehler aus...? Das wäre mir neu...
Gruß,
Manu
Hi Manu,
nun ja, das Globals-Array wollte ich vorerst vermeiden - aber wie es ausschaut, komme ich nicht drum herum...
Von der Funktionsweise her sind "global" und $GLOBALS gleich. Und wenn du eine Variable aus dem globalen Scope verändern willst, kommst du um eines der beiden nicht herum.
@Dennis: meine ersten Versuche habe ich ohne 'global' durchgeführt - mit dem gleichen Ergebnis: das Array war NULL...
Hast du überhaupt gelesen was ich geschrieben habe? Ich habe nicht gesagt, dass du es ohne "global" machen sollst... ich sprach davon, dass du das ganze lediglich in der falschen Reihenfolge machst.
require_once gibt doch imho keinen Fehler aus...? Das wäre mir neu...
Ok, da hab ich irgendwie einen Knoten im Kopf gehabt, nein, einen Fehler gibt es nicht, aber die Datei wird nicht neu eingebunden. Folglich werden in deinem Fall die Werte bei einem zweiten Aufruf der Funktion nicht neu eingelesen (und evtl. aktualisiert), wie man es von der Funktion vielleicht erwarten würde.
Viele Grüße,
~ Dennis.
Hi!
Guter Tipp mit dem Tausch - so hat es geklappt...
Gruß,
Manu