Gemäß den meisten Bereichsregeln für Programmiersprachen kann ich auf Variablen zugreifen, die außerhalb der darin enthaltenen Funktionen definiert sind. Warum funktioniert dieser Code jedoch nicht?
<?php
$data = 'My data';
function menugen() {
echo "[" . $data . "]";
}
menugen();
?>
Die Ausgabe ist []
.
Antworten:
Es funktioniert nicht, weil Sie deklarieren müssen, auf welche globalen Variablen Sie zugreifen:
$data = 'My data'; function menugen() { global $data; // <-- Add this line echo "[" . $data . "]"; } menugen();
Ansonsten können Sie darauf zugreifen als
$GLOBALS['data']
. Siehe Variabler Bereich .Auch wenn dies ein wenig vom Thema abweicht, würde ich vorschlagen, dass Sie die Verwendung von Globals überhaupt vermeiden und es vorziehen, als Parameter zu übergeben.
quelle
This script will not produce any output because the echo statement refers to a local version of the $a variable, and it has not been assigned a value within this scope.
Sie können eine der folgenden Aktionen ausführen:
<?php $data = 'My data'; function menugen() { global $data; echo "[" . $data . "]"; } menugen();
Oder
<?php $data = 'My data'; function menugen() { echo "[" . $GLOBALS['data'] . "]"; } menugen();
Allerdings kann eine übermäßige Verwendung von Globals zu einem schlechten Code führen. Es ist normalerweise besser, das einzugeben, was Sie brauchen. Anstatt beispielsweise auf ein globales Datenbankobjekt zu verweisen, sollten Sie ein Handle an die Datenbank übergeben und darauf reagieren. Dies wird als Abhängigkeitsinjektion bezeichnet . Es erleichtert Ihnen das Leben erheblich, wenn Sie automatisierte Tests implementieren (was Sie sollten).
quelle
Es ist eine Frage des Umfangs. Kurz gesagt, globale Variablen sollten vermieden werden, um :
Sie müssen es entweder als Parameter übergeben:
$data = 'My data'; function menugen($data) { echo $data; }
Oder haben Sie es in einer Klasse und greifen Sie darauf zu
class MyClass { private $data = ""; function menugen() { echo this->data; } }
Siehe auch die Antwort von @MatteoTassinari, da Sie sie als global markieren können, um darauf zuzugreifen. Globale Variablen sind jedoch im Allgemeinen nicht erforderlich. Daher ist es ratsam, Ihre Codierung zu überdenken.
quelle
menugen()
, bedeutet dies, dass mehr als nur ein Menü generiert wird. Wie wäre es beispielsweise mit der Erweiterung dieses Menüs, um weitere Elemente aus einer anderen Quelle hinzuzufügen, und mit der Auswahl der aktuell ausgewählten Seite im Menü. Überall zufällige globale Variablen und Logik zu haben, schreit nach OOP-Design. Die Tatsache, dass PHP / JS nicht strukturiert werden muss, ist einer der Hauptgründe, warum Sie viel unordentlichen, klobigen Code finden. Es kann sehr gut gemacht werden, aber die Leute können sich keine Gedanken über die Wartbarkeit in der Zukunft machen.Ein anderer Weg, es zu tun:
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen();
UPDATE 2020-01-13: angefordert von Peter Mortensen
Ab PHP 5.3.0 unterstützen wir anonyme Funktionen, mit denen Schließungen erstellt werden können. Ein Abschluss kann auf die Variable zugreifen, die außerhalb ihres Bereichs erstellt wurde.
In diesem Beispiel kann auf den Abschluss zugegriffen werden,
$data
da er in deruse
Klausel deklariert wurde .quelle
Seit vielen Jahren verwende ich immer dieses Format:
<?php $data = "Hello"; function sayHello(){ echo $GLOBALS["data"]; } sayHello(); ?>
Ich finde es einfach und leicht zu folgen. Mit $ GLOBALS können Sie mit PHP auf eine globale Variable verweisen. Wenn Sie Dinge wie $ _SERVER, $ _POST usw. verwendet haben, haben Sie eine Referenz auf eine globale Variable, ohne es zu wissen.
quelle
$GLOBAL
(Text) oder$GLOBALS
(Beispielcode)? (Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten , nicht hier in den Kommentaren (Sie müssen die Variable an die Funktion übergeben:
$data = 'My data'; function menugen($data) { echo $data; }
quelle
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[ $data ]"; }; $menugen(); ?>
Sie können auch vereinfachen
echo "[" . $data . "]"
zu
echo "[$data]"
quelle
echo "[" . $data . "]"
undecho "[ $data ]"
sind nicht gleich (zwei zusätzliche Leerzeichen in der Ausgabe für letztere).Wenn Sie möchten, können Sie die Funktion "Definieren" verwenden. Diese Funktion erstellt jedoch eine Konstante, die nach der Definition nicht mehr geändert werden kann.
<?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?>
PHP-Konstanten
quelle