Создание глобальной переменной изнутри функции в PHP - PullRequest
1 голос
/ 15 октября 2010

Я пытаюсь определить динамически переменные.Я использую функцию для этого, но я не знаю, как определить новый var как глобальный (потому что он никогда не создавался до функции).

это возможно?

Спасибо.


edit

хорошо, это то, что я построил.это так опасно?

function extract_values($row) {
    foreach ($row as $key => $value){
        global $$key;
        $$key = $value;
    }
}

и затем я пытаюсь сделать мою жизнь проще:

$result = mysql_query("SELECT first_name, last_name, address FROM users ORDER BY id ASC");

    while ($row = mysql_fetch_array($result)){
        extract_values($row);
#[do some stuff with the variables.]#
}

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

$first_name = $row['first_name'];

Эта функция делает это для меня.Я не понимаю, почему в этом случае это может быть опасно .. или, как обычно, я что-то упускаю ..

Ответы [ 3 ]

5 голосов
/ 15 октября 2010

Попробуйте это:

function doSomething() {
  global $x;
  $x = 5;
}

Если вы предпочитаете сохранить пару байтов, вы можете использовать для этого массив $_GLOBALS:

$_GLOBALS['x'] = 5;
3 голосов
/ 15 октября 2010

Относительно вашего редактирования: это делает ваш код менее понятным.

На самом деле, уже существует функция, которая делает это: extract().

while (($row = mysql_fetch_assoc($result))){
    extract($row);
    // ...
}

extract() еще лучше, потому что он позволяет вам указать, что должно произойти, если переменная уже существует, и / или позволяет указать префикс (чтобы вы не перезаписывали уже существующие переменные с этим именем).Например, вы можете сделать:

extract($row, EXTR_PREFIX_ALL, 'db');

, что приведет к $db_first_name и т. Д.

Конечно, extract() также выполняет некоторую внутреннюю работу здесь, но использование встроенных функций всегдалучше, чем создавать свой собственный.


Другой возможностью будет использование list():

while (($row = mysql_fetch_row($result))){
    list($first_name, $last_name, $address) = $row;
    // ...
}
2 голосов
/ 15 октября 2010

Вы можете сделать это двумя способами:

Сделать переменную глобальной, используя ключевое слово global:

function fun1() {
        global $foo;
        $foo = 1;
}

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

function fun2() {

        $GLOBALS['bar'] = 1;
}

Рабочий код

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

...