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

Problemita con array de objetos

Estas en el tema de Problemita con array de objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Tengo la siguiente situación. La clase servicio tiene una lista de elementos UserComment. Agrego comments a un servicio y lo imprimo. La lista se encuentra ...
  #1 (permalink)  
Antiguo 04/11/2008, 08:20
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Problemita con array de objetos

Tengo la siguiente situación. La clase servicio tiene una lista de elementos UserComment. Agrego comments a un servicio y lo imprimo. La lista se encuentra vacía... No se porqué. Capaz que es como manipulo los array.

Clase Servicio
Código PHP:
class Service{

    private 
$_id;
    ...
    private 
$_userComments = array();

public function  
__toString() {
        
$s .= $this->getId();
        
$s .= ' | ';
        
        foreach (
$this->getUserComments() as $num => $c) {
            
$s .= $num '. ' $c->getComment() . '<br/>';
        }
        return 
$s;
    }

public function 
addComment(UserComment $comment){
        
array_push($this->getUserComments(), $comment);
    } 
Clase UserComment
Código PHP:
class UserComment{

    private 
$_id;
    ...
    private 
$_comment;

    public function 
getComment() { return $this->_comment; }
    public function 
setComment($comment) { $this->_comment $comment; }
    ...
    ...


Mi test
Código PHP:

    
require_once('config.php');
    require_once(
CLASSES.'/Service.php');
    require_once(
CLASSES.'/UserComment.php');


    
$s  = new Service();
    
$c = new UserComment();
    
$c->setComment('Este es un comentario de un usuario');

    
$d = new UserComment();
    
$d->setComment('Este OTRO comentario de un usuario');

    
$s->addComment($c);
    
$s->addComment($d);

    
print_r($s->getUserComments());

    echo 
$s
Estoy bloqueado...
__________________
Pasión por la Música
  #2 (permalink)  
Antiguo 04/11/2008, 08:53
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Problemita con array de objetos

Prueba a cambiar la clase Service

Código PHP:
class Service{

    private 
$_id;
    private 
$_userComments = array();

    public function  
__toString() 
    {
        
$s .= $this->getId();
        
$s .= ' | ';
        
        foreach (
$this->_userComments as $num => $c) {
            
$s .= $num '. ' $c->getComment() . '<br/>';
        }
        return 
$s;
    }

    public function 
addComment(UserComment $comment){
        
$this->_userComments[] = $comment;
    } 
A ver que tal te va ahora esto de $this->_userComments[] es lo mismo que tu array_push solo que a mi forma de ver más limpio y rapido trabajamos con la variable interna y ahorramos llamadas. Ya me diras.

por cierto, el método getUserComments() no lo has puesto en el código y donde en teoria, tienes el problema.
  #3 (permalink)  
Antiguo 04/11/2008, 08:59
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
De acuerdo Respuesta: Problemita con array de objetos

Funcionó! Muchas gracias.
Ahora, si alguien me podría dar una breve explicación de porqué esto no funciona, o contarme si no soy el único que se sorprendió, le agradecería.

Porqué no puedo hacer
Código PHP:
array_push($this->getUserComments(), $comment); 
Si getUserComments() retorna un array?

Esa sería la pregunta, ¿no?

Saludos
__________________
Pasión por la Música
  #4 (permalink)  
Antiguo 04/11/2008, 09:04
Avatar de alfredo13  
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Argentina
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Problemita con array de objetos

Hola,

Opino igual que Casuis, puede que tengas algún problema en la funcion getYserComments(), de todas formas o intentaría cambiar lo siguiente:

Código php:
Ver original
  1. public function addComment(UserComment $comment)
  2. {
  3.         array_push($this->getUserComments(), $comment);
  4. }

por
Código php:
Ver original
  1. public function addComment(UserComment $comment)
  2. {
  3.         array_push($this->_userComments, $comment);
  4. }

Estás trabajando en la misma clase a la cual pertenece la propiedad que quieres modificar, no hace falta usar la funcion getUserComments(), puedes acceder a ella mediante $this->_userComments.

Probablemente al razón por la cual no funcionara como lo planteaste la primera vez sea por al forma en la que hay que pasarle los parámetros a la función array_push(). Recomiendo que veas los ejemplos de la documentación oficial de PHP sobre esta función.

Saludos

Última edición por alfredo13; 04/11/2008 a las 09:13
  #5 (permalink)  
Antiguo 04/11/2008, 09:07
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: Problemita con array de objetos

Mmm como es que tienes definida la función getUserComments()?, es probable que estes regresando una copia del array por eso no te afecta al usar array_push.

Si lo quieres hacer así tienes que regresar la referencia al array (usando &), pero rompes un poco con que la variable sea privada y solo modificable desde dentro de la clase.

Saludos.
  #6 (permalink)  
Antiguo 04/11/2008, 09:12
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Problemita con array de objetos

Este es el getUserComments
Código PHP:
public function getUserComments() { return $this->_userComments; } 
Cita:
Estás trabajando en la misma clase a la cual pertenece la propiedad que quieres modificar, no hace falta usar la funcion getUserComments(), puedes acceder a ella mediante $this->_userComments.
Es un tema de costumbre y buenas prácticas. Si encapsulas un atributo, es mejor respetar ese encapsulamiento siempre.
__________________
Pasión por la Música
  #7 (permalink)  
Antiguo 04/11/2008, 10:06
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: Problemita con array de objetos

Si pero no siempre es el comportamiento adecuado, más con variables que quieres modificar, por ejemplo getUserComments te regresa los comentarios, pero no esperas que puedan cambiar esos comentarios, imaginate que alguien hiciera algo así:
Código php:
Ver original
  1. $comments = $service->getUserComments();
  2. $comments = array();

Y todos los comments se borrarian, el Getter debe de regresar una copia, y como te lo indico alfredo13, si estas dentro de la misma clase puedes y debes de usar la misma variable para modificar el valor directo.

Saludos.
  #8 (permalink)  
Antiguo 04/11/2008, 10:08
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Problemita con array de objetos

Es cierto aunque en el ámbito profesional nadie lo utiliza (solo ámbito de php).
Ya que es un lenguage interpretado y cada vez que insertes un comentario producirá una llamada a funcion que te puedes ahorrar.

Programar así es más elegante cierto, pero bajará muchisimo el rendimiento del site.

Un ejemplo imaginate que por un request de usuario tienes 40 accesos internos de llamada a métodos para establecer valor a un atributo.

Multiplica eso por cada usuario que pueda conectarse online.

En aplicativos compilados o servidores de aplicaciones no influye casi nada ya que la aplicación viene precompilada o compilada, pero muchisimo en los lenguages interpretados.
  #9 (permalink)  
Antiguo 04/11/2008, 10:13
Avatar de chitoso  
Fecha de Ingreso: mayo-2008
Ubicación: Montevideo, Uruguay
Mensajes: 205
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Problemita con array de objetos

Claro, debería devolver una copia. Eso es correcto.

Ahora, con respecto a la performance, supongo que es un costo mínimo que se puede ahorrar, por ahora prefiero seguir programando así.

Muchas gracias por la ayuda
__________________
Pasión por la Música
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 08:43.