Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/08/2014, 22:09
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Extraño comportamiento de foreach

Que tal, por un error en mi codigo descubri esta curiosidad del foreach:

Código PHP:
Ver original
  1. <?php
  2.     class A
  3.     {
  4.         public $datos = [1, 2, 3, 4, 5];
  5.        
  6.         public function __destruct()
  7.         {
  8.             echo("destruido");
  9.         }
  10.     }
  11.    
  12.     $test = new A();
  13.     foreach($test->datos as $test)
  14.     {
  15.         var_dump($test);
  16.     }    
  17.    
  18.     var_dump($test);

Produce la salida:
Cita:
destruido
int 1
int 2
int 3
int 4
int 5
int 5
¿Acaso el foreach itera una propiedad de un objeto destruido?
En la version serbia del manual (no en las otras ) esta la siguiente nota:
Cita:
Напомена:
Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.
¿Eso significa que si tengo un array inmenso, php lo duplicara para iterarlo?
para comprobarlo hice esto:
Código PHP:
Ver original
  1. <?php
  2.     class A
  3.     {
  4.         public $datos = [];
  5.        
  6.         public function __destruct()
  7.         {
  8.             echo("destruido");
  9.         }
  10.     }
  11.    
  12.     $test = new A();
  13.     for($i=0; $i<999999; $i++)
  14.         $test->datos[] = $i;  
  15.        
  16.    
  17.     foreach($test->datos as $test)
  18.     {
  19.         var_dump(memory_get_usage());
  20.         break;
  21.     }      
  22.    
  23.     var_dump($test);

la salida es esta:
Cita:
int 84340000
destruido
int 84339928
int 145592
int 0
por lo visto, el consumo de memoria baja dentro del foreach, por lo que no lo esta duplicando, entonces ¿que es lo que hace realmente?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios