Ver Mensaje Individual
  #11 (permalink)  
Antiguo 14/08/2014, 13:17
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
Respuesta: Extraño comportamiento de foreach

Tienes razon, muchas gracias por resolver mi duda, como para cerrar y completar lo dicho (que esta muy claro) hice este codigo:

Código PHP:
Ver original
  1. <?php
  2.     error_reporting(E_ALL);
  3.    
  4.     class A implements Iterator
  5.     {
  6.         public $datos = [1, 2, 3, 4, 5];
  7.  
  8.         public function rewind() { reset($this->datos); }
  9.         public function current() { return current($this->datos); }
  10.         public function key() { return key($this->datos); }
  11.         public function next() { return next($this->datos); }
  12.         public function valid() { return (key($this->datos) !== NULL && key($this->datos) !== FALSE); }
  13.         public function __destruct()
  14.         {
  15.             echo("destruido");
  16.         }
  17.     }
  18.    
  19.     $test = new A();
  20.     $instancia = $test;
  21.     debug_zval_dump($instancia);
  22.     foreach($instancia as $test)
  23.     {    
  24.         debug_zval_dump($instancia);
  25.         var_dump($test);
  26.     }
  27.     var_dump($test);

cuya salida es:
Cita:
object(A)#1 (1) refcount(3){ ["datos"]=> array(5) refcount(1){ [0]=> long(1) refcount(2) [1]=> long(2) refcount(2) [2]=> long(3) refcount(2) [3]=> long(4) refcount(2) [4]=> long(5) refcount(2) } } object(A)#1 (1) refcount(3){ ["datos"]=> array(5) refcount(1){ [0]=> long(1) refcount(2) [1]=> long(2) refcount(2) [2]=> long(3) refcount(2) [3]=> long(4) refcount(2) [4]=> long(5) refcount(2) } }
int 1
object(A)#1 (1) refcount(3){ ["datos"]=> array(5) refcount(1){ [0]=> long(1) refcount(2) [1]=> long(2) refcount(2) [2]=> long(3) refcount(2) [3]=> long(4) refcount(2) [4]=> long(5) refcount(2) } }
int 2
object(A)#1 (1) refcount(3){ ["datos"]=> array(5) refcount(1){ [0]=> long(1) refcount(2) [1]=> long(2) refcount(2) [2]=> long(3) refcount(2) [3]=> long(4) refcount(2) [4]=> long(5) refcount(2) } }
int 3
object(A)#1 (1) refcount(3){ ["datos"]=> array(5) refcount(1){ [0]=> long(1) refcount(2) [1]=> long(2) refcount(2) [2]=> long(3) refcount(2) [3]=> long(4) refcount(2) [4]=> long(5) refcount(2) } }
int 4
object(A)#1 (1) refcount(3){ ["datos"]=> array(5) refcount(1){ [0]=> long(1) refcount(2) [1]=> long(2) refcount(2) [2]=> long(3) refcount(2) [3]=> long(4) refcount(2) [4]=> long(5) refcount(2) } }
int 5
int 5
destruido
alli se ve que la cantidad de referencias al objeto aumenta dentro del foreach (sigue igual, pero porque una se elimina al hacer la asignacion) confirmándose lo que dices.

Saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios