Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

splObjectStorage detach

Estas en el tema de splObjectStorage detach en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola Gente, necesito eliminar todos los objetos de una lista de objetos. No encontré un metodo que lo haga de una, asi que intenté recorrer ...
  #1 (permalink)  
Antiguo 25/07/2008, 12:31
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
splObjectStorage detach

Hola Gente, necesito eliminar todos los objetos de una lista de objetos. No encontré un metodo que lo haga de una, asi que intenté recorrer la lista y hacer un detach.

El tema es que borra todos menos uno
Lo estoy haciendo de esta forma:


Código PHP:
<?
class a
{
}

$lista = new SplObjectStorage();
$a= new a();
$lista->attach($a);
$a= new a();
$lista->attach($a);
$a= new a();
$lista->attach($a);
$a= new a();
$lista->attach($a);

echo 
"antes"$lista->count(); //          imprime 4

echo $lista->count();
foreach (
$lista as $a)
{
$lista->detach($a);
}
echo 
"despues"$lista->count();   //          imprime 1
?>


muchas gracias desde ya
  #2 (permalink)  
Antiguo 25/07/2008, 12:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Segun la documentación de SPL, cada vez que tu llamas a detach, la lista se reduce y se regresa al primer elemento, por lo que siempre te pasara eso y necesitaras llamar a
Código PHP:
$lista->detach($lista->current()); 
Al final de tu foreach. Otra opción es que extiendas SplObjectStorage e implementes un método clear.

Saludos.
  #3 (permalink)  
Antiguo 30/07/2008, 12:32
Avatar de Jesica  
Fecha de Ingreso: agosto-2007
Mensajes: 78
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: splObjectStorage detach

buenas...
como seria eso del SplObjectStorage clear???
Saludos
  #4 (permalink)  
Antiguo 30/07/2008, 12:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Mmmm un ejemplo:
Código PHP:
class myCustomStorage extends SplObjectStorage {
         public function 
clear() {
                 while( 
$item $this->current() ) {
                        
$this->detach$item );
                        
$item $this->next();
                 }
                 
                 if( 
count$this ) > ) {
                      
$this->detach$this->current() );
                 }
         }

Saludos.

Última edición por GatorV; 06/08/2008 a las 08:28
  #5 (permalink)  
Antiguo 30/07/2008, 13:17
Avatar de Jesica  
Fecha de Ingreso: agosto-2007
Mensajes: 78
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: splObjectStorage detach

current me lo toma como null y me da error
<b>Warning</b>: SplObjectStorage::detach() expects parameter 1 to be object, null given in .... on line <b>281


Código PHP:
function borrarListaAutoresNoInstitucionales()
    {
        
$listaAutoresNoInstitucionales=$this->getListaAutoresNoInstitucionales();
        foreach (
$listaAutoresNoInstitucionales as $autorNoInstitucional)
        {
            
$listaAutoresNoInstitucionales->detach($autorNoInstitucional); 
        }
        
$listaAutoresNoInstitucionales->detach($listaAutoresNoInstitucionales->current());  
    } 
  #6 (permalink)  
Antiguo 30/07/2008, 14:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Entonces en tu foreach ya te borro todo, y no es necesario borrar el ultimo elemento.

Saludos.
  #7 (permalink)  
Antiguo 05/08/2008, 09:06
Avatar de Jesica  
Fecha de Ingreso: agosto-2007
Mensajes: 78
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: splObjectStorage detach

Hola!
no, no me borró todo...
si quiero borrar el ultimo elemento, ($listaAutoresNoInstitucionales->detach($listaAutoresNoInstitucionales->current()); ) me tira el error que te mostré antes, pero si no pongo eso, me deja siempre un elemento. Como lo soluciono? tendré algún error de sintaxis o me faltara declarar algo?
Muchas gracias
Saludos
  #8 (permalink)  
Antiguo 05/08/2008, 09:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Hola Jesica,

Porque no pruebas lo que puse anteriormente, extender la clase y comprobar para agregar el método clear.

Saludos.
  #9 (permalink)  
Antiguo 05/08/2008, 09:47
Avatar de Jesica  
Fecha de Ingreso: agosto-2007
Mensajes: 78
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: splObjectStorage detach

Disculpa que siga insistiendo, pero soy nueva en esto...
Intenté, pero no se como se vincula esa función con las listas
hice esta prueba, pero no me funcionó

Código PHP:
class j
{
    
}

class 
borrarListas extends SplObjectStorage
{    
    public function 
clear($item) {
                 while( 
$item $this->current() ) {
                        
$this->detach$item );
                        
$item $this->next();
                 }
                 
                 if( 
count$this ) > ) {
                      
$this->detach$this->current() );
                 }
         }
}


$a=new SplObjectStorage();

$j=new j();
$a->attach($j);
$j=new j();
$a->attach($j);

$z=new borrarListas();
$z->clear($a);


echo 
"despues"$a->count();// esto me tira 2 
muchas gracias por tus respuestas
  #10 (permalink)  
Antiguo 05/08/2008, 11:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Mmm tienes un error de concepto muy profundo, te recomendaria que leyeras un libro sobre POO, ya que lo que yo te propuse es que exitendas SplObjectStorage para que le agregues la funcionalidad de clear internamente y poder usar tu nuevo objeto.

Esa es la finalidad de extender una clase, y si no sabes realizarlo no te recomendaria que siguieras programando ya que en un futuro cuando quieras hacer cambios tendrás un grave problema.

Saludos.

PD. Lo que puse en negritas son conceptos clave en POO.
  #11 (permalink)  
Antiguo 06/08/2008, 08:04
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

a ver si entre todos sacamos algo, porque sigo yo también con el problema:

sería algo asi gatorV?

Código PHP:
class borrarListas extends SplObjectStorage 
{  

private 
$lista;

function 
__construct()
{  
 
$this->lista= new splObjectStorage();
 }  

public function 
clear() { 
                 while( 
$item $this->lista->current() ) { 
                        
$this->lista->detach$item ); 
                        
$item $this->lista->next(); 
                 } 
                  
                 if( 
count$this->lista ) > ) { 
                      
$this->detach$this->lista->current() ); 
                 } 
         } 

  #12 (permalink)  
Antiguo 06/08/2008, 08:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Hola moron,

Te voy a hacer el mismo comentario que a Jesica, debes de leer sobre como trabajar con clases, ya que tu duda es conceptual, yo ya te puse el código funcional más arriba, solo es cuestión de que lo utilices.

Saludos.
  #13 (permalink)  
Antiguo 06/08/2008, 08:39
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

ok, leeré un poco mas.
aunque si pudieras agregar una lista a tu código o mostrarnos como se usa el ejemplo para que pueda (o podamos) entender un poco mas como funciona te lo voy a agradecer, de paso, solucionamos un problema y porque no, aclaramos con el ejemplo el problema conceptual.

Muchas gracias desde ya
  #14 (permalink)  
Antiguo 06/08/2008, 08:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

El problema aquí es que aunque ya les dije la solución y expuse el código que necesitan usar, parece que no leen, y de ahí viene el problema.

Pero de todos modos hago un copy/paste directo:
Cita:
Iniciado por GatorV
Otra opción es que extiendas SplObjectStorage e implementes un método clear.
Cita:
Iniciado por GatorV Ver Mensaje
Mmmm un ejemplo:
Código PHP:
class myCustomStorage extends SplObjectStorage {
         public function 
clear() {
                 while( 
$item $this->current() ) {
                        
$this->detach$item );
                        
$item $this->next();
                 }
                 
                 if( 
count$this ) > ) {
                      
$this->detach$this->current() );
                 }
         }

Saludos.
Con eso tienes para solucionar tu problema.

Saludos.
  #15 (permalink)  
Antiguo 06/08/2008, 09:10
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

perdon por mi dureza cerebral ..

si no es asi mandame a leer de nuevo, pero creo que ahora lo entiendo.


Código PHP:
class clase
{
    
}

class 
myCustomStorage extends SplObjectStorage {
         public function 
clear() {
                 while( 
$item $this->current() ) {
                        
$this->detach$item );
                        
$item $this->next();
                 }
                 
                 if( 
count$this ) > ) {
                      
$this->detach$this->current() );
                 }         }
}  

class 
lista
{
    private 
$l;
    
    public function 
__construct()
    {
        
$this->l= new myCustomStorage();
        
$this->l->attach(New clase);        
        
$this->l->attach(New clase);    
        
$this->l->clear();
        
    }
    
}

new 
lista 

esto me tira el mismo error que al principio del post:

<b>Warning</b>: SplObjectStorage::detach() expects parameter 1 to be object, null given in <b>PHPDocument2</b> on line <b>16</b><br />
  #16 (permalink)  
Antiguo 06/08/2008, 09:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Que bueno que ya entendiste como usar objetos sobrecargados,

Prueba hacer esto:
Código PHP:
class myCustomStorage extends SplObjectStorage {
         public function 
clear() {
                 while( 
$item $this->current() ) {
                        
$this->detach$item );
                        
$this->next();
                 }
                 
                 if( ( 
count$this ) > ) && ( ( $item $this->current() ) !== null ) ) {
                      
$this->detach$item );
                 }
        }

Saludos.
  #17 (permalink)  
Antiguo 06/08/2008, 09:25
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

Ahora no tira error, pero tampoco hace el detach.
lo seguí y veo que no pasa por el while del metodo clear
  #18 (permalink)  
Antiguo 06/08/2008, 09:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Mmm segun veo puedes usar un foreach directamente ya que implementa Traversable:
Código PHP:
class myCustomStorage extends SplObjectStorage {
         public function 
clear() {
                 foreach( 
$this as $item ) {
                         
$this->detach$item );
                 }
        }

  #19 (permalink)  
Antiguo 06/08/2008, 09:37
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

si, asi lo hice yo al principio, si te fijas en el primer post de este hilo.
Para el caso no tendría sentido heredar la clase.
Sea como fuere, me sigue dejando un objeto sin eliminar en la lista
  #20 (permalink)  
Antiguo 06/08/2008, 10:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Mmm cierto, no entiendo porque la necesidad de en SPL de hacer el atributo como private, porque no mejor creas una clase propia que tenga bien los métodos implementados?
  #21 (permalink)  
Antiguo 06/08/2008, 12:16
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

Utilizo la lista como atributo de una clase que contiene una lista de objetos, la cual se accede mediante get y set, por eso lo pongo como private.

Por ejemplo:

Código PHP:
class persona
{
private 
$listaHijos= new splObjectStorage();

     public 
setHijo(hijo $hijo )
    { 
     
$this->listaHijos->attach($hijo);
    }
    public 
getListaHijos()
   {
    return 
$this->listaHijos;
   }


hace tiempo trabajo con ese tipo de listas, y no tuve problemas hasta que tuve que borrarla
  #22 (permalink)  
Antiguo 06/08/2008, 12:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

No me refiero a tu clase, me refiero a la clase de splObjectStorage, la lista deberia de ser protected para si necesitamos borrarla todo solo bastaria con limpiar el array interno y pasar el index a 0.
  #23 (permalink)  
Antiguo 06/08/2008, 12:41
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

Cita:
Iniciado por GatorV Ver Mensaje
Mmm cierto, no entiendo porque la necesidad de en SPL de hacer el atributo como private, porque no mejor creas una clase propia que tenga bien los métodos implementados?
Es que tengo muchas listas ya creadas con la clase spl, intento reutilizar lo que ya esta hecho y modificar todo eso me significa una perdida de tiempo que no tengo.
Me cuesta creer que no se pueda dejar en cero la lista.
  #24 (permalink)  
Antiguo 06/08/2008, 12:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: splObjectStorage detach

Pues en la pagina oficial de SPL no indica como método clear ni nada por el estilo, por eso dudo que puedas hacer algo, o de plano cambiar todas tus listas a otro objeto.

Saludos.
  #25 (permalink)  
Antiguo 06/08/2008, 12:47
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: splObjectStorage detach

Espero encontrar alguna solución.
desde ya te agradezco mucho la paciencia gatorV.

saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:43.