Zgodnie z większością reguł zakresu języków programowania, mogę uzyskać dostęp do zmiennych, które są zdefiniowane poza funkcjami wewnątrz nich, ale dlaczego ten kod nie działa?
<?php
$data = 'My data';
function menugen() {
echo "[" . $data . "]";
}
menugen();
?>
Wynik jest []
.
Odpowiedzi:
To nie działa, ponieważ mają zadeklarować zmienne globalne, które będziesz dostępu:
$data = 'My data'; function menugen() { global $data; // <-- Add this line echo "[" . $data . "]"; } menugen();
W przeciwnym razie możesz uzyskać do niego dostęp jako
$GLOBALS['data']
. Zobacz zakres zmienny .Nawet jeśli jest to trochę nie na temat, sugerowałbym unikanie używania globali i preferowanie przekazywania jako parametrów.
źródło
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.
Możesz wykonać jedną z następujących czynności:
<?php $data = 'My data'; function menugen() { global $data; echo "[" . $data . "]"; } menugen();
Lub
<?php $data = 'My data'; function menugen() { echo "[" . $GLOBALS['data'] . "]"; } menugen();
To powiedziawszy, nadużywanie globalnych może prowadzić do słabego kodu. Zwykle lepiej jest przekazać to, czego potrzebujesz. Na przykład, zamiast odwoływać się do obiektu globalnej bazy danych, należy przekazać uchwyt do bazy danych i działać na jego podstawie. Nazywa się to iniekcją zależności . Wdrażanie testów automatycznych (co powinieneś) znacznie ułatwia życie.
źródło
To kwestia zakresu. Krótko mówiąc, należy unikać zmiennych globalnych, więc :
Musisz albo przekazać go jako parametr:
$data = 'My data'; function menugen($data) { echo $data; }
Możesz też mieć to na zajęciach i uzyskać do niego dostęp
class MyClass { private $data = ""; function menugen() { echo this->data; } }
Zobacz również odpowiedź @MatteoTassinari, ponieważ możesz oznaczyć ją jako globalną, aby uzyskać do niej dostęp, ale zmienne globalne generalnie nie są wymagane, więc rozsądnie byłoby ponownie przemyśleć kodowanie.
źródło
menugen()
, oznacza to, że będzie więcej niż tylko generowanie menu. Na przykład, co z rozszerzeniem tego menu, aby dodać więcej elementów z innego źródła, co z wyborem aktualnie wybranej strony, która jest w menu. Posiadanie losowych globalnych zmiennych i logiki w całym miejscu wymaga projektowania OOP. Fakt, że PHP / JS nie musi mieć struktury, jest jednym z największych powodów, dla których znajdujesz dużo niechlujnego, niezgrabnego kodu. Można to zrobić bardzo dobrze, ale pozwala ludziom nie myśleć o możliwościach utrzymania w przyszłości.Inny sposób na zrobienie tego:
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen();
UPDATE 2020-01-13: na wniosek Petera Mortensena
Od PHP 5.3.0 mamy obsługę anonimowych funkcji, które mogą tworzyć domknięcia. Zamknięcie może uzyskać dostęp do zmiennej, która została utworzona poza jego zakresem.
W tym przykładzie zamknięcie ma dostęp,
$data
ponieważ zostało zadeklarowane wuse
klauzuli.źródło
Od wielu lat używam tego formatu:
<?php $data = "Hello"; function sayHello(){ echo $GLOBALS["data"]; } sayHello(); ?>
Uważam to za proste i łatwe do naśladowania. $ GLOBALS to sposób, w jaki PHP umożliwia odwoływanie się do zmiennej globalnej. Jeśli używałeś takich rzeczy jak $ _SERVER, $ _POST, itp., To masz odwołanie do zmiennej globalnej, nie wiedząc o tym.
źródło
$GLOBAL
(tekst) czy$GLOBALS
(przykładowy kod)? (Prosimy o odpowiedź, edytując swoją odpowiedź , a nie w komentarzach (jeśli dotyczy).)Musisz przekazać zmienną do funkcji:
$data = 'My data'; function menugen($data) { echo $data; }
źródło
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[ $data ]"; }; $menugen(); ?>
Możesz też uprościć
echo "[" . $data . "]"
do
echo "[$data]"
źródło
echo "[" . $data . "]"
iecho "[ $data ]"
nie są takie same (dwie dodatkowe spacje na wyjściu dla tego ostatniego).Z tego powodu PHP może być frustrujące. Powyższe odpowiedzi
global
nie zadziałały w moim przypadku i zajęło mi trochę czasu, zanim wymyśliłem prawidłowe użycieuse
.To jest poprawne:
$functionName = function($stuff) use ($globalVar) { //do stuff } $output = $functionName($stuff); $otherOutput = $functionName($otherStuff);
To jest niepoprawne:
function functionName($stuff) use ($globalVar) { //do stuff } $output = functionName($stuff); $otherOutput = functionName($otherStuff);
Na podstawie twojego konkretnego przykładu:
$data = 'My data'; $menugen = function() use ($data) { echo "[" . $data . "]"; } $menugen();
źródło
Jeśli chcesz, możesz użyć funkcji „define”, ale ta funkcja tworzy stałą, której po zdefiniowaniu nie można zmienić.
<?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?>
Stałe PHP
źródło