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

Return multiples valores

Estas en el tema de Return multiples valores en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Ok recien empiezo con esto, este codigo me funciona pero mi duda es una metodologia correcta para imprimir los datos? Código PHP: <?php class  Ingrediente ...
  #1 (permalink)  
Antiguo 13/07/2009, 23:33
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Return multiples valores

Ok recien empiezo con esto, este codigo me funciona pero mi duda es una metodologia correcta para imprimir los datos?

Código PHP:
<?php

class Ingrediente
{
    var 
$nombre null;
    var 
$fuente null;
    var 
$energia null;
    var 
$proteina null;
    var 
$grasa_total null;
    var 
$colesterol null;
    var 
$hidratos_carbono null;
    var 
$sodio null;
    
    function 
introducirIngrediente($nombre$fuente$energia$proteina$grasa_total$colesterol$hidratos_carbono$sodio)
    {
        
$this->nombre $nombre;
        
$this->fuente $fuente;
        
$this->energia $energia;
        
$this->proteina $proteina;
        
$this->grasatotal $grasatotal;
        
$this->colesterol $colesterol;
        
$this->hidratoscarbono $hidratoscarbono;
        
$this->sodio $sodio;
        
    }
    
    function 
mostrarIngrediente()
    {
        
$retorno = array($this->nombre$this->fuente);
        return (
$retorno);
        
    } 
    
}

$ingrediente = new Ingrediente;
$ingrediente->introducirIngrediente('Azucar''USDA''1''2''3' ,'4''5''6');
list (
$zero$one) = $ingrediente->mostrarIngrediente();
echo 
$zero;
echo 
$one;


?>
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #2 (permalink)  
Antiguo 14/07/2009, 08:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Return multiples valores

Lo mejor es que crees un objeto y que tu clase te regrese ese objeto, dentro de ese objeto puedes tener métodos getters, o en su caso usar las funciones mágicas de PHP (__get) para obtener el valor e imprimirlo.

Saludos.
  #3 (permalink)  
Antiguo 14/07/2009, 11:05
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Gracias por la respuesta, tienes algun ejemplo de eso? no me queda claro ya que en el ejemplo tengo un metodo para retonar el valor(array), como seria eso de retornar un objeto?

Clase seria: Ingrediente
Objeto: $ingrediente
Metodo: mostrarIngrediente
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.

Última edición por Highlander; 14/07/2009 a las 11:24
  #4 (permalink)  
Antiguo 14/07/2009, 12:45
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Respuesta: Return multiples valores

Cita:
Iniciado por Highlander Ver Mensaje
[...] ya que en el ejemplo tengo un metodo para retonar el valor(array) [...]
¿y cuál es la razón para hacer eso?. Lo que se te dice es que, precisamente, accedas a cada propiedad del objeto por métodos getters, de tal manera que en lugar de hacer esto:

Código php:
Ver original
  1. list ($zero, $one) = $ingrediente->mostrarIngrediente();
  2. echo $zero;
  3. echo $one;

... hacer esto:
Código php:
Ver original
  1. echo $ingrediente->getNombre();
  2. echo $ingrediente->getFuente();

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #5 (permalink)  
Antiguo 14/07/2009, 17:41
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Return multiples valores

En vez de usar 'var' en los atributos, usa public, private, protected segun corresponda ('var' es de PHP4)

Ademas, aprovecha el contructor de la clase:

function __construct ($nombre, $fuente, $energia, $proteina, $grasa_total, $colesterol, $hidratos_carbono, $sodio){
$this->nombre = $nombre;
$this->fuente = $fuente;
$this->energia = $energia;
$this->proteina = $proteina;
$this->grasatotal = $grasatotal;
$this->colesterol = $colesterol;
$this->hidratoscarbono = $hidratoscarbono;
$this->sodio = $sodio;
}

Luego cuando haces el NEW, le pasas las parametros y te evitas llamar al metodo introducirIngrediente()
__________________
Salu2!
  #6 (permalink)  
Antiguo 15/07/2009, 20:51
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Ok mejore el codigo con los aportes que me hicieron y me funciona de la siguente manera. Lo que si aun me queda la duda sobre el metodo magico --get(); lei un poco sobre pero no entendi bien como aplicarlo en este caso.

Gracias nuevamente.

Código PHP:
<?php

class Ingrediente
{
    public 
$Nombre;
    public 
$Fuente;
    public 
$Energia;
    public 
$Proteina;
    public 
$Grasa_total;
    public 
$Colesterol;
    public 
$Hidratos_carbono;
    public 
$Sodio;
    
    function 
__construct ($Nombre$Fuente$Energia$Proteina$Grasa_total$Colesterol$Hidratos_carbono$Sodio)
    {
        
$this->Nombre $Nombre;
        
$this->Fuente $Fuente;
        
$this->Energia $Energia;
        
$this->Proteina $Proteina;
        
$this->Grasa_total $Grasa_total;
        
$this->Colesterol $Colesterol;
        
$this->Hidratos_carbono $Hidratos_carbono;
        
$this->Sodio $Sodio;
    }
    
    
}

$ingrediente = new Ingrediente('Azucar''USDA''1''2''3' ,'4''5''6');
      
echo 
$ingrediente->Nombre;
echo 
$ingrediente->Fuente;

?>
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #7 (permalink)  
Antiguo 15/07/2009, 21:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Return multiples valores

Ojo lee sobre encapsulamiento, no es recomendable usar atributos públicos en tus clases.

Sobre __get es fácil de usar, por ejemplo con un arreglo:
Código php:
Ver original
  1. class Foo {
  2.         private $_properties = array();
  3.  
  4.  
  5.         public function __construct($var1, $var2) {
  6.                 $this->_properties['var1'] = $var1;
  7.                 $this->_properties['var2'] = $var2;
  8.         }
  9.  
  10.         public function __get($var) {
  11.                 return $this->_properties[$var];
  12.         }
  13. }
  14.  
  15. $bar = new Foo('foo', 'bar');
  16. echo $bar->var1;

Saludos.
  #8 (permalink)  
Antiguo 15/07/2009, 21:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Return multiples valores

__get() y __set() son llamados cuando un atributo no existe como dice aca mismo.

Si no te interesa hacer nada en especial sobre los atributos podes usar el array asociativo que explican en ese blog en vez de esas variables que tenes.
__________________
Salu2!
  #9 (permalink)  
Antiguo 17/07/2009, 15:57
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Creo que ahora estoy mas confundido que antes, cambie las variables a private y ya no me funciona el codigo.

Como tendria que hacerlo si quisiera meter los datos que pase a mi funcion en un array asociativo y luego retornarlo e imprimirlo?

Lei el blog y la información que me recomendaron pero la verdad se me hace muy extraño esto como que aun no le agarro la ciencia.

Gracias.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #10 (permalink)  
Antiguo 17/07/2009, 17:58
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Return multiples valores

Cita:
Iniciado por Highlander Ver Mensaje
Creo que ahora estoy mas confundido que antes, cambie las variables a private y ya no me funciona el codigo.
Public function getNombre(){
return $this->nombre;
}

Public function geFuente(){
return $this->fuente;
}

... luego haces:

echo getNombre();
echo getFuente();

No debe haber variables publicas ya que si quieres acceder a un atributo lo haces a traves de los metodos (publicos) correspondientes. Asi ocultas la implementacion y la proteges.

Lee sobre encapsulamiento y data hidding
__________________
Salu2!
  #11 (permalink)  
Antiguo 17/07/2009, 22:02
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Cita:
Iniciado por Italico76 Ver Mensaje
Public function getNombre(){
return $this->nombre;
}

Public function geFuente(){
return $this->fuente;
}

... luego haces:

echo getNombre();
echo getFuente();

No debe haber variables publicas ya que si quieres acceder a un atributo lo haces a traves de los metodos (publicos) correspondientes. Asi ocultas la implementacion y la proteges.

Lee sobre encapsulamiento y data hidding
Gracias eso me funciono a la primera pero lo que no agrada es que tengo que hacer una metodo para darle salida a cada dato individualmente.

Implemente esto con el codigo que posteo GatorV:

Código PHP:
<?php

class Ingrediente {

    private 
$_datos = array();
    
    public function 
__construct ($nombre$fuente$energia$proteina$grasa_total$colesterol$hidratos_carbono$sodio) {
        
$this->_datos['nombre'] = $nombre;
        
$this->_datos['fuente'] = $fuente;
        
$this->_datos['energia'] = $energia;
        
$this->_datos['proteina'] = $proteina;
        
$this->_datos['grasa_total'] = $grasa_total;
        
$this->_datos['colesterol'] = $colesterol;
        
$this->_datos['hidratos_carbono'] = $hidratos_carbono;
        
$this->_datos['sodio'] = $sodio
        
    }
    
    public function 
__get($dato) {
        return 
$this->_datos[$dato];
    }
}


$ingrediente = new Ingrediente('Azucar''USDA''1''2''3' ,'4''5''6');

echo 
$ingrediente->sodio
?>
No logro encontrar algo que explique el guion abajo en private $_datos = array();
solo que es una forma valida de declarar una variable pero si le saco el guion bajo no funciona.

Gracias y saludos.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #12 (permalink)  
Antiguo 17/07/2009, 22:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Return multiples valores

El guión bajo es parte del estandar de Zend de como codificar correctamente.

Saludos.
  #13 (permalink)  
Antiguo 18/07/2009, 19:20
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Cita:
Iniciado por GatorV Ver Mensaje
El guión bajo es parte del estandar de Zend de como codificar correctamente.

Saludos.
Me queda la duda porque si remuevo el ese guion bajo, ej:

$_properties $properties

El codigo ya no funciona, no imprime la variable.

Gracias y saludos.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #14 (permalink)  
Antiguo 19/07/2009, 00:28
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Respuesta: Return multiples valores

Muestra cómo lo haces; no debería haber problema, es solo otra variable.

Vamos, preguntas "¿por qué?", se dijo que el guión es solo una forma de llamar a la variable, que no tiene nada que ver, entonces muestra el código que no te funciona, algo estarás haciendo mal.

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #15 (permalink)  
Antiguo 19/07/2009, 19:46
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Este codigo en el caso del array $datos no me entrega el valor al hacer el echo, si lo cambio a $_datos funciona.

Gracias por la ayuda.

Código PHP:
<?php


class Ingrediente {

    private 
$datos = array(); //$_datos
    
    
public function __construct ($nombre$fuente$energia$proteina$grasa_total$colesterol$hidratos_carbono$sodio) {
        
$this->_datos['nombre'] = $nombre;
        
$this->_datos['fuente'] = $fuente;
        
$this->_datos['energia'] = $energia;
        
$this->_datos['proteina'] = $proteina;
        
$this->_datos['grasa_total'] = $grasa_total;
        
$this->_datos['colesterol'] = $colesterol;
        
$this->_datos['hidratos_carbono'] = $hidratos_carbono;
        
$this->_datos['sodio'] = $sodio
        
    }
    
    public function 
__get($dato) {
        return 
$this->datos[$dato]; //  $_datos
    
}
    
}

class 
Azucar extends Ingrediente {
    
    }
$ingrediente = new Ingrediente('Azucar''USDA''1''2''3' ,'4''5''6');

echo 
$ingrediente->fuente;  


?>
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #16 (permalink)  
Antiguo 19/07/2009, 19:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Return multiples valores

Es porque estas llamandolo como $this->_datos, si vas a usar $datos, entonces lo llamas como $this->datos.

Saludos.
  #17 (permalink)  
Antiguo 19/07/2009, 20:07
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Respuesta: Return multiples valores

UNA variable, o la llama "_datos", o "datos" pero siempre igual. No hiciste todos los cambios, es obvio te va a regresar nada, estás utilizando dos cosas distintas.

¿Viste?
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #18 (permalink)  
Antiguo 20/07/2009, 11:46
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Dios mio me rio de mi mismo, no me fije en las variables del construct lol.

Gracias que n00b de mi parte.

Otra duda:

Si tengo las siguentes clases: Ingredientes, ConexionBD

Supongamos quisiera ingresar un valor a la base de datos (un ingrediente)

Deberia heredar la clase ConexionBD desde ingrediente (para acceder BD con sus metodos)?

Saludos.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #19 (permalink)  
Antiguo 20/07/2009, 11:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Return multiples valores

No, es incorrecto ese uso, lo mejor es que tengas una clase que se encargue de insertar a la base de datos, (patrón TableGateway) o en su caso que la clase Ingredientes tenga un método save() que se comunique con la base de datos.

Saludos.
  #20 (permalink)  
Antiguo 20/07/2009, 12:42
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Supongamos opto por el metodo save dentro de mi clase, dicho metodo tendria que incluir la conexion a la BD, el query, etc.

Que pasa ahi con mi clase ConexionDB no tiene utilidad?

Estoy tratando mas menos de entender el funcionamiento global de las clases y sus interacciones.

Gracias y saludos.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
  #21 (permalink)  
Antiguo 20/07/2009, 14:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Return multiples valores

Claro que tiene utilidad, pero la instancias dentro de save:
Código php:
Ver original
  1. class Ingrediente {
  2.       /* ----- */
  3.       public function save() {
  4.             $cnx = new ConexionDB();
  5.             // Aqui salvas con $cnx
  6.       }
  7. }

No te ofendas pero aprender a base de prueba y error no es lo mejor ya que te pierdes de mucho de la riqueza que te brinda la POO, es mejor si primero lees un libro de teoría de POO, para que entiendas como es la abstracción, encapsulamiento, herencia, etc. Todos los conceptos, los diagramas UML como es que un sistema tiene que manejarse y después de todo esto te metes de lleno a programar.

Saludos.
  #22 (permalink)  
Antiguo 20/07/2009, 15:49
Avatar de Highlander  
Fecha de Ingreso: junio-2006
Ubicación: Concepción, Chile
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 4
Respuesta: Return multiples valores

Gracias GatorV se agradece tu paciencia de verdad que si, entiendo tu sugerencia y ya habia leido lo relacionado a POO en libros de PHP pero me cuesta traspasar eso a la "realidad" como digo yo, aprendo mas practicamente que teoricamente.

Supongo que aun no estoy viendo la pelicula completa.

Me tiene muy interesado eso si lo de diagramas UML y clases, etc yo estoy familiarizado con modelos de entidad relacional pero nunca vi lo de clases y objetos.

Estudiare mas eso.

Saludos y gracias.
__________________
Ingeniero (E) en Computación e Informática
The last man alone with god.
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 10:00.