У меня есть функция, которая использует множество глобальных варов и массивов – например
$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]"; }
Здесь у вас есть дополнительная информация:
Когда у вас есть функция, управление контекстом в PHP 5.3 не разрешает доступ к глобальным переменным без использования «глобального» ключевого слова.
У Php.net есть сообщение о теме.
function foo() { global $a, $b, $c; echo "$a $b[0] $b[1] $c"; }