Gibt es eine Möglichkeit, den Gültigkeitsbereich von require_once() explizit auf global???
Ich bin auf der Suche nach einem Weg, um den Umfang der require_once()
auf die Globale Reichweite, wenn require_once()
verwendet wird, innerhalb einer Funktion. So etwas wie der folgende code sollte funktionieren:
Datei `foo.php':
<?php
$foo = 42;
tatsächlichen code:
<?php
function includeFooFile() {
require_once("foo.php"); //scope of "foo.php" will be the function scope
}
$foo = 23;
includeFooFile();
echo($foo."\n"); //will print 23, but I want it to print 42.
Gibt es eine Möglichkeit explizit den Umfang der require_once()
? Gibt es einen schönen workaround?
- Der Umfang der
require_once
ist explizit festgelegt, Sie definieren, Sie zu nutzen. - Ich denke, der kann eine schreckliche Arbeit um, wenn Sie wollen, dass...
- Gibt es nicht. Sie müssen ausdrücklich Liste der Variablen, die ein Aliasing in den globalen Bereich. Entweder in der Funktion oder über den include-Skript.
- Wahrscheinlich sollten Sie es als eine Antwort ^^
- Warum sind Sie die Verpackung einer
require_once()
in einer Funktion? - Der obige code ist nur ein Beispiel für meine Frage. In meiner Anwendung habe ich eine Funktion, in der ich laden will ein dynamisch berechnete Liste der Quellcode-Dateien.
- Sie sind sich bewusst, dass
require_once
nur eingeschränkt verwenden, da es wird definieren Sie die Variablen nur einmal? - Ja, ich bin mir dessen bewusst... Danke für deinen Hinweis^^.
- möglich, Duplikat der führen Sie die Funktion block im Kontext der globalen namespace in PHP
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie diese hacky-Funktion, die ich schrieb:
Es verschiebt alle neu definierten vars zurück in den globalen Raum, wenn die include-Datei zurück. Es gibt einen VORBEHALT, dass, wenn die mitgelieferte Datei enthält eine andere Datei, wird Sie nicht in der Lage sein, um Zugriff auf alle Variablen aus der übergeordneten Datei über
$GLOBALS
weil Sie noch nicht globalisierten doch.Abgesehen von der "Globalisierung" für eine variable, es gibt keine Möglichkeit, dies zu tun:
ODER
Dann ist dein Wert sollte 42, wenn Sie es ausdrucken.
UPDATE
Hinblick auf die Einbeziehung von Klassen oder Funktionen, beachten Sie, dass alle Funktionen und Klassen immer als Globale, es sei denn, wir reden hier über eine Methode der Klasse. An diesem Punkt, die Methode in einer Klasse ist nur aus der definition der Klasse selbst und nicht als eine Globale Funktion.
foo.php
enthält Funktionen oder Klassen, richtig?Müssen Sie deklarieren, die global in Ihrem
foo.php
:Ansonsten ist es wohl nicht möglich.
Könnten Sie versuchen zu spielen, um mit
extract()
,get_defined_vars()
,global
und$GLOBALS
in verschiedenen Kombinationen vielleicht... wie Durchlaufen alle definierten Variablen und Aufruf der globalen, bevor die erfordern einer Datei...Aber ich bin mir nicht ganz sicher, ob Sie erhalten, wo Sie gehen möchten...
Dies ist definitiv nicht eine "schöne" Arbeit, aber es würde funktionieren:
Allerdings die eingebundene Datei kann nicht definieren, Funktionen oder Klassen (und möglicherweise einige andere Dinge, wie gut, dass ich derzeit nicht denken), weil es bewirkt einen parse-error, da du nicht verschachteln, Klassen oder Funktionen.
BEARBEITEN anscheinend können Sie Funktionen in Ihrer Datei. Ich hatte immer gedacht, Sie konnten nicht, aber nach dem Test es scheint, dass Sie können.
get_defined_vars()
nicht wieder diejenigen, die sowieso in den lokalen Gültigkeitsbereich von Funktionen.$GLOBALS
) - wie Sie sagen, Sie würden bereits überschrieben werden, so ist es sollte wenig praktische Unterschied.get_defined_vars()
zurückkehren wird alle erreichbar vars in den aktuellen Bereich). In PHP 5.3.3 es einfach nur wieder Variablen in der Funktion Umfang...Als der Geltungsbereich wird explizit definiert, wo Sie
require
und dergleichen, müssen Sie angeben, was mit den Variablen innerhalb des Gültigkeitsbereichs der Funktion:Diesem Beispiel übernimmt die Betreuung der beiden, Variablen und Referenzen, welche könnte das sein, was du bist suchen für. Demo. Bitte beachten Sie, dass
require_once
wäre nur einmal Arbeit und würde nur definieren Sie die Variablen einmal.Ich habe es nicht ausprobiert (da die Verwendung von globalen vars ist eine schlechte Idee, tbh), aber das könnte funktionieren:
Alternativ können Sie tun es einfach manuell:
Je nach Ihrer genauen Anforderungen, die Sie nutzen könnten Konstanten. Benötigen Ihre Datei in den globalen scope, aber innen ist es eine Konstante.
IE file.php:
Dann überall in Ihrem script verwenden Sie einfach
MY_CONSTANT
zu finden, um den Wert, werden Sie nicht in der Lage, zu Bearbeiten, nachdem es einmal gesetzt wurde obwohl. Andere als das, könnten Sie globalisieren Ihre Variablen als die andere Antwort sagt, aber es ist nicht 100% klar ist, was Sie zu erreichen versuchen, andere als einfach abrufen einen Wert aus der Datei enthalten? In dem Fall Konstanten sollten in Ordnung sein.Update:
Jetzt haben Sie erklärt, dass Sie eine Objekte-Eigenschaften, die überall verfügbar sind, schlage ich vor, Sie schauen in die Erstellung einer statische Klasse, die nach der Instanziierung in Ihrem globalen Rahmen kann verwendet werden, überall in der app. Lesen Sie den verlinkten manual-Seite, es ist ein bare-bones-Beispiel.
$foo
wird ein Objekt. Objekte können nicht gespeichert werden, die Konstanten, richtig?