Какой лучший способ ссылки на переменную вне области действия функции? - PullRequest
3 голосов
/ 13 сентября 2011

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

$var1 = 10;

function test1() {
    global $var1;
    $var1++;
}

function test2(&$var) {
    $var++;
}

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

Ответы [ 3 ]

5 голосов
/ 13 сентября 2011

1. Ни один из них не является предпочтительным.

Если у вас нет особых причин поступать иначе, предпочтительным будет

$var1 = 10;
$var1 = test3($var1);
function test3($var)
{
    return $var + 1;
}

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

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

2. Вам не нужно думать о том, какой из них быстрее.

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

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

1 голос
/ 13 сентября 2011

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

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

1 голос
/ 13 сентября 2011

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

Однако во многих случаях (когда структуры данных являются более сложными), вам следует использовать объекты вместо этого, например:

class Counter {
  private $val = 10;
  public function increment() {
    $this->val++;
  }
}

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

...