Преимущество / недостаток между глобальными переменными и параметрами функции в PHP?

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

если наше использование этих двух ниже является тем же, которое лучше?

function doSomething ($var1,$var2,..){
    ...
}

ИЛИ

function doSomething (){
    global $var1,$var2,..;
    ...
}

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

18
задан Mohammad 7 February 2010 в 08:07
поделиться

5 ответов

Использование памяти - ничтожная проблема. Гораздо важнее, чтобы код было легко читаемым и не давал ... непредсказуемых ... результатов. Добавление глобальных переменных - ОЧЕНЬ ПЛОХАЯ ИДЕЯ с этой точки зрения, ИМО.

Если вас беспокоит использование памяти, то следует сделать следующее:

function doSomething (&$var1, &$var2,..) {
   ...
}

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

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

function doSomething ($var1, $var2) {
    ...
}
22
ответ дан 30 November 2019 в 06:42
поделиться

Недавно я написал запись в блоге, в которой объясняется , как получить время в миллисекундах между платформами .

Он будет работать как время (NULL), но будет возвращать количество миллисекунд вместо секунд из эпохи Unix в окнах и Linux.

Вот код

#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif

/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
 * windows and linux. */

int64 GetTimeMs64()
{
#ifdef WIN32
 /* Windows */
 FILETIME ft;
 LARGE_INTEGER li;
 uint64 ret;

 /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
  * to a LARGE_INTEGER structure. */
 GetSystemTimeAsFileTime(&ft);
 li.LowPart = ft.dwLowDateTime;
 li.HighPart = ft.dwHighDateTime;

 ret = li.QuadPart;
 ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
 ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */

 return ret;
#else
 /* Linux */
 struct timeval tv;
 uint64 ret;

 gettimeofday(&tv, NULL);

 ret = tv.tv_usec;
 /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
 ret /= 1000;

 /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
 ret += (tv.tv_sec * 1000);

 return ret;
#endif
}

Вы можете изменить его, чтобы вернуть микросекунды вместо миллиэсконд, если хотите.

-121--3159594-

Запишите его для получения параметров. Ремонтопригодность гораздо важнее микрооптимизации. При выборе параметров переменные нельзя изменять в неожиданных местах.

-121--2245987-

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

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

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

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

14
ответ дан 30 November 2019 в 06:42
поделиться

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

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

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

1
ответ дан 30 November 2019 в 06:42
поделиться

Хэш-таблица реализует карту . Функция Map.entureSet возвращает коллекцию ( Set ) экземпляров Map.Entry , имеющих методы getKey и getValue .

Итак:

Iterator<Map.Entry>  it;
Map.Entry            entry;

it = yourTable.entrySet().iterator();
while (it.hasNext()) {
    entry = it.next();
    System.out.println(
        entry.getKey().toString() + " " +
        entry.getValue().toString());
}

Если известны типы записей в хэш-таблице, можно использовать шаблоны для исключения вызовов toString выше. Например, элемент может быть объявлен как Map.Entry < Строка, Строка > , если хэш-таблица объявлена как Хэш-таблица < Строка, Строка > .

Если вы можете комбинировать шаблоны с дженериками, это просто коротко:

for (Map.Entry<String,String> entry : yourTable.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

Это предполагает, что ваша таблица является хэш-таблицей < строка, строка > . Просто покажет, как далеко Ява зашла за последние несколько лет, в значительной степени не потеряв свой существенный Java-ness.

Немного OT: Если синхронизация не требуется, используйте HashMap вместо Hashtable . В этом случае используйте ConcurrentHashMap (спасибо, акаппа!).

-121--3783495-

Недавно я написал запись в блоге, в которой объясняется как получить время в миллисекундах между платформами .

Он будет работать как время (NULL), но будет возвращать количество миллисекунд вместо секунд из эпохи Unix в окнах и Linux.

Вот код

#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif

/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
 * windows and linux. */

int64 GetTimeMs64()
{
#ifdef WIN32
 /* Windows */
 FILETIME ft;
 LARGE_INTEGER li;
 uint64 ret;

 /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
  * to a LARGE_INTEGER structure. */
 GetSystemTimeAsFileTime(&ft);
 li.LowPart = ft.dwLowDateTime;
 li.HighPart = ft.dwHighDateTime;

 ret = li.QuadPart;
 ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
 ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */

 return ret;
#else
 /* Linux */
 struct timeval tv;
 uint64 ret;

 gettimeofday(&tv, NULL);

 ret = tv.tv_usec;
 /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
 ret /= 1000;

 /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
 ret += (tv.tv_sec * 1000);

 return ret;
#endif
}

Вы можете изменить его, чтобы вернуть микросекунды вместо миллиэсконд, если хотите.

-121--3159594-

Запишите его для получения параметров. Ремонтопригодность гораздо важнее микрооптимизации. При выборе параметров переменные нельзя изменять в неожиданных местах.

6
ответ дан 30 November 2019 в 06:42
поделиться

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

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

function get_things($thing_name,$opt= array() {
   if(!isset($opt["order"])) $opt["order"]= 'ASC';
}
2
ответ дан 30 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: