Как изменить переменные вне функции в PHP / лучший способ сделать что-то - PullRequest
1 голос
/ 03 февраля 2011

У меня есть скрипт со следующей частью:

function checkDays($oldDate){
    // calculate time
    // Print table row style based on number of days passed 
    // (eg less than 1 week, 1 week, 2 weeks, 3weeks+)
}

//Some code
checkdays($value)

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

Ответы [ 4 ]

5 голосов
/ 03 февраля 2011

НЕ ИСПОЛЬЗУЙТЕ ИСПОЛЬЗОВАНИЕ ГЛОБАЛОВ

Вы можете передавать переменные по ссылке, это означает, что передается фактическая переменная, а не ее копия:

$count = 0;

//Some code
checkdays($value, $count);
checkdays($value, $count);
checkdays($value, $count);

// This will output 3
echo $count;

// Use a & to pass by reference
function checkDays($oldDate, &$count){
    // Your code goes here as normal
    // Increment $count, because it was passed by reference the 
    // actual variable was passed
    // into the function rather than a copy of the variable
    $count++;
}
4 голосов
/ 03 февраля 2011

Вероятно, вам следует создать класс и использовать личные свойства для хранения необходимых данных.

2 голосов
/ 03 февраля 2011

Я думаю, что риск, на который вы ссылаетесь, связан с register_globals, что является чем-то совершенно другим.

Внутри функции используйте ключевое слово global, например,

function myFunction($someParam) {
    global $counter;
    ++$counter;
    // do something
}
* 1007.* В качестве альтернативы, вы можете сделать так называемую передачу по ссылке, чтобы изменить переменную во внешней области, которая передается вашей функции, например,
function myFunction($someParam, &$counter) {
    ++$counter;
    // do something
}

Обратите внимание на амперсанд.

Дополнительная информациядоступно на странице руководства PHP о переменной области

0 голосов
/ 03 февраля 2011

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

function myFunction($param)
{
  static $count;
  if (empty($count)) $count = 0;
  $count++;

  //rest of your function
}

К сожалению, я не могу найти, где эта функциональность документирована в документации php. Нашел его: переменная область действия

Я не могу получить доступ к переменным, определенным вне самой функции

Я пропустил эту строку.

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

Если вы не можете использовать пространства имен, используйте псевдо-пространства имен для всего . Вместо function someFunction используйте function projectName_someFunction или какую-либо их комбинацию. Таким образом, вы можете комбинировать несколько проектов, не беспокоясь об использовании неправильной функции. Таким же образом все глобальные переменные могут быть сохранены как $projectName_someVar.

Существуют другие методы для псевдо-именования имен ваших функций / переменных.

Причина, по которой не использует глобальные переменные, заключается в том, что глобальная переменная с общим именем может быть легко перезаписана и может быть неоднозначной: что $count на самом деле считает в глобальное пространство имен?

...