Использование вызова функции в цикле foreach

Существуют ли какие-либо проблемы с точки зрения эффективности использования вызова функции в цикле foreach. Например:

foreach ($this->getValues() as $value) {
  //Do something with $value
}

против

$values = $this->getValues();
foreach ($values as $value) {
  //Do something with $value
}

По сути, он достаточно умен, чтобы вызывать $ this-> gt; getValues () только один раз в первом примере, или он вызывает его на каждой итерации. Если он вызывает его на каждой итерации, то как он отслеживает, в каком элементе он находится в данный момент,

 Emil Vikström17 июн. 2012 г., 21:32
пирсы, «дополнительная переменная» не совсем там. PHP использует копирование при записи, что означает, что$values и цикл foreach будет ссылаться на тот же набор данных. Единственное, что нужно учитывать, - это когда переменная может быть собрана сборщиком мусора, что раньше в первом примере (в конце цикла), чем во втором (в конце функции / файла или когдаunset() называется).
 David04 июл. 2015 г., 13:24
@ goat, вызов функции не "внутри" петля.
 martinstoeckli17 июн. 2012 г., 21:37
@rambo coder - Если вы посмотрите на пример, вы увидите, что вызов функции не находится внутри цикла.
 user104399417 июн. 2012 г., 21:27
Ну, единственный недостаток второго подхода заключается в том, что вам требуется дополнительная переменная (которая занимает память). Так что я бы пошел с первым подходом.
 goat17 июн. 2012 г., 21:27
everything Вы делаете внутри цикла снижает эффективность.

Ответы на вопрос(2)

Решение Вопроса

foreach ($this->getValues() as $value) {
 //
}

$values = $this->getValues();
foreach ($values as $value) {
  //
}

$this->getValues() будет выполняться только один раз, так как он не находится внутри самого цикла. Если вам нужно использовать возвращаемое значениеgetValues позже, продолжайте и присвойте ее переменной, чтобы вам больше не приходилось вызывать функцию. Если нет, то вам действительно не нужна переменная.

 17 июн. 2012 г., 21:38
Итак, категорически, $ this-> gt; getValues () вызывается один раз и только один раз?
 17 июн. 2012 г., 21:40
Это правильно, но я не уверен, что вы подразумеваете под "категорически". Почему бы вам не проверить это? ЕстьgetValues Записать сообщение или вывести что-либо напрямую с помощью echo перед возвратом массива, чтобы вы могли видеть, сколько раз оно вызывалось.

но она будет незначительной в 99,9% случаев из реальной жизни. В любом случае PHP вызовет вашу функцию / метод только один раз. Что происходит внутри, когда вы используетеforeach является то, что PHP оценивает итератор (часть доas) один раз, сохраняет результат, а затем перебирает его, помещая текущий элемент в локальную переменную, заданную послеas, Если вы записываете итератор в локальную переменную самостоятельно, вы практически просто дублируете усилия PHP, поэтому первый подход может повлечь за собой дополнительные издержки, но этого будет недостаточно для беспокойства. Вместо этого я оптимизируюсь на удобочитаемость: если вызов функции короткий и самоописательный, вставьте его; если он сложный или неясный, вместо этого сохраните его в описательной переменной.

Обратите внимание, что ситуация отличается с типичнымfor а такжеwhile петли, которые, вероятно, откуда вы это поняли. Например, в следующем коде:

for ($number = 0; $number < $this->getNumberOfItems(); ++$number) {
    // do stuff...
}

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

 09 дек. 2015 г., 13:37
Когда ты сказалso the first approach may carry an extra overhead Я думаю ты имеешь ввидуthe second approach

Ваш ответ на вопрос