Использование глобальных переменных внутри функции в PHP, как вы делаете это в Javascript - PullRequest
0 голосов
/ 09 февраля 2012

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

$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 для этого способа?

Ответы [ 5 ]

2 голосов
/ 09 февраля 2012

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

function foo() {
  **global $a, $b, $c;**
 echo "$a 
       $b[0] 
       $b[1] 
       $c";
}
1 голос
/ 09 февраля 2012

Поскольку в 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

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

1 голос
/ 09 февраля 2012

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

$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();

Передача переменных в функции

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

0 голосов
/ 09 февраля 2012

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

В Php.net есть пост на тему здесь .

function foo() {
    global $a, $b, $c;
    echo "$a 
    $b[0] 
    $b[1] 
    $c";
}
0 голосов
/ 09 февраля 2012

Вы можете получить доступ к глобальным переменным с помощью ключевого слова 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...