Использование глобальных vars внутри функции в PHP, как вы это делаете в Javascript

У меня есть функция, которая использует множество глобальных варов и массивов – например

$a=1; $b[0]='a'; $b[1]='b'; $c='Hello'; function foo() { echo "$a $b[0] $b[1] $c"; } 

Я понимаю, что в отличие от JS, вы должны включать в себя вары, когда вы вызываете функцию:

 function foo($a,$b,$c) 

но поскольку я использую множество функций и массивов в функции, и поскольку основным источником большинства варов является массив $ _GET (после использования extract ($ _ GET)), я не уверен, как это сделать ,

есть ли способ заставить PHP-функцию вести себя как функция JS таким образом?

Вы можете использовать глобальное ключевое слово:

 $a = "Hello World"; $b = "Hello World"; function outputStrings(){ global $a, $b; echo $a." - ".$b; } $b = "Goodbye World"; outputStrings(); // ouputs "Hello World - Goodbye World" 

Однако лучше не использовать эту структуру. Это в целом запутывает и затруднит работу с вашим кодом. WordPress очень часто использует этот подход в своей базе кода и делает очень сложную отладку. Другие плагины и код могут вставлять и изменять глобальные переменные, изменяя вывод вашего скрипта.

Что было бы лучше:

Используйте структуру ООП для своего веб-приложения.

Таким образом, вы можете использовать объекты вместо случайных глобальных переменных. Это связано с тем, что вы случайно перезаписываете глобальную переменную в ходе сценария. Это также помогает правильно упорядочить переменные, поэтому все переменные, относящиеся к пользователям, могут быть в классе User . Имеет смысл структурировать это так.

 class User { private $firstName; private $secondName; private $gender; public function __construct($fname, $sname, $gend){ $this->firstName = $fname; $this->secondName = $sname; $this->gender = $gend; } public function outputDetails(){ echo $this->firstName." ".$this->secondName." is ".$this->gender; } } $user = new User("Thomas", "Clayson", "Male"); $user->outputDetails(); 

Передать переменные в функции

Так же, как вы показали в своем примере. Это общепринятый стандартный способ сделать это. Вы должны всегда передавать такие переменные, как это, это помогает определить области и правильную структуру. Также это означает, что вы знаете, что такое значение переменных, поскольку вы их владеете и передаете им в функции, а не просто выщипывание переменных из глобальной области.

Вы должны использовать ключевое слово «global», которое сообщает компилятору искать глобальные переменные.

 function foo() { **global $a, $b, $c;** echo "$a $b[0] $b[1] $c"; } 

Поскольку в PHP вам не нужно объявлять переменные до их использования, следующий код неоднозначен относительно того, к какой переменной относится эта функция.

 $a = 'ten'; function foo($a) { echo($a); } foo(10); // Outputs: 10 

PHP устраняет двусмысленность, предполагая, что все переменные в области функции являются локальными, если только они не объявлены в функции из глобальной области с помощью global ключевого слова.

 $a = 10; function foo($b) { global $a; echo($a); } foo('ten'); // Outputs: 10 

В общем случае использование глобальных переменных не рекомендуется, поскольку оно вводит жесткую связь между вашими объектами, снижает читаемость и локальность кода, загрязняет глобальное пространство имен и увеличивает умственную нагрузку на разработчиков, которые должны помнить, сколько / каких глобальных переменных они имеют ,

Вы можете получить доступ к глобальным варам с global ключевым словом:

 global $a=1; global $b[0]='a'; global $b[1]='b'; global $c='Hello'; function foo() { global $a, $b, $c; echo "$a $b[0] $b[1] $c"; } 

В противном случае вы можете использовать предопределенный массив $GLOBALS :

 function foo() { echo "$GLOBALS['a'] $GLOBALS['b'][0] $GLOBALS['b'][1] $GLOBALS[c]"; } 

Здесь у вас есть дополнительная информация:

http://php.net/manual/en/language.variables.scope.php

Когда у вас есть функция, управление контекстом в PHP 5.3 не разрешает доступ к глобальным переменным без использования «глобального» ключевого слова.

У Php.net есть сообщение о теме.

 function foo() { global $a, $b, $c; echo "$a $b[0] $b[1] $c"; }