2012-06-17 19 views
28

¿Hay algún problema, con respecto a la eficiencia, para usar una llamada de función en un bucle foreach. Por ejemplo:Uso de la llamada de función en el bucle foreach

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

frente

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

Esencialmente, es php suficientemente inteligente como para llamar a $ this-> getValues ​​() sólo una vez en el primer ejemplo, o se lo llama en cada iteración. Si se lo llama en cada iteración, entonces ¿cómo hacer un seguimiento de qué elemento de su actualidad en,

+0

* todo * lo que hace dentro de un bucle reduce la eficiencia. – goat

+0

Bueno, el único inconveniente con el segundo enfoque es que necesita una variable adicional (que ocupa memoria). Así que iría con el primer enfoque. –

+1

muelles, la "variable extra" no está realmente allí. PHP utiliza copy-on-write, lo que significa que '$ values' y el bucle foreach harán referencia al mismo conjunto de datos. Lo único a considerar es cuando la variable puede ser recogida de basura, que es anterior en el primer ejemplo (al final del ciclo) que en el segundo (al final de la función/archivo o cuando 'unset()' es llamado). –

Respuesta

32

Ambos son esencialmente los mismos:

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

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

$this->getValues() sólo se ejecutará una vez, ya que no está dentro de el bucle en sí. Si necesita usar el valor de retorno de getValues nuevamente más adelante, adelante y asígnelo a una variable para que no tenga que volver a llamar a la función. Si no, realmente no necesitas una variable.

+0

Entonces, categóricamente, ¿se llama a $ this-> getValues ​​() una vez, y solo una vez? –

+7

Eso es correcto, pero no estoy seguro de lo que quiere decir con "categóricamente". ¿Por qué no lo pruebas? Haga que 'getValues' registre un mensaje o genere algo directamente con echo antes de devolver la matriz para que pueda ver cuántas veces se ha llamado. –

15

Puede haber una diferencia, pero va a ser insignificante en el 99,9% de los casos del mundo real. En cualquier caso, PHP llamará a su función/método solo una vez. Lo que ocurre internamente cuando usas foreach es que PHP evalúa el iteradoe (la parte anterior al as) una vez, almacena el resultado y luego lo repite, poniendo el elemento actual en la variable local dada después del as. Si usted mismo escribe el iteratee en una variable local, prácticamente solo está duplicando el esfuerzo de PHP, por lo que el primer enfoque puede tener una carga adicional, pero no será suficiente para preocuparse. En su lugar, optimizaría la legibilidad: si la llamada a la función es corta y autodescriptiva, inline it; si es complejo u oscuro, guárdelo en una variable descriptiva.

Tenga en cuenta que la situación es diferente con los típicos for y while bucles, que es probablemente de donde se sacó esta noción. Por ejemplo, en el siguiente código:

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

... getNumberOfItems() el método se llama en cada iteración. En esta situación, tiene sentido precalcularlo y almacenarlo en una variable local.

+0

Cuando dices *, por lo que el primer acercamiento puede tener una carga extra * Creo que quieres decir * el segundo enfoque * – whoan

Cuestiones relacionadas