Ver Mensaje Individual
  #15 (permalink)  
Antiguo 13/12/2012, 15:40
Dany_s
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: declaración de variables en PHP OOP

Vos entendés qué es y cuál es el alcance, te queda claro cuál es la direferencia entre una forma y otra según ejemplos que propenes, en algunos casos no sirve crear una propiedad, en otro puede dar lo mismo y en otros no, eso depende el caso.

Te propongo crear una persona, solamente con nombre y edad

Vamos a hacerlo sin atributos y obtenemos los datos desde los métodos

Código PHP:
Ver original
  1. <?php
  2.  
  3. class Persona
  4. {    
  5.     public function getNombre()
  6.     {
  7.         return "Pepito";
  8.     }
  9.    
  10.     public function getNacimiento(){
  11.         return "01-01-1994";
  12.     }
  13. }
  14.  
  15. $p = new Persona();
  16. echo $p->getNombre();
  17. echo $p->getNacimiento();

¿Si querés crear más persona?
Tendrías que crear tantas clases para la cantidad de personas que quieras.

Ahora con atributos pero asignándole valores en el constructor.
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Persona
  4. {    
  5.     private $nombre;
  6.     private $nacimiento;
  7.  
  8.  
  9.     function __construct() {
  10.         $this->nombre = "Pepito";
  11.         $this->nacimiento = $nacimiento = "01-01-1994";
  12.     }
  13.  
  14.    
  15.     public function getNombre()
  16.     {
  17.         return $this->nombre;
  18.     }
  19.    
  20.     public function getNacimiento(){
  21.         return $this->nacimiento;
  22.     }
  23. }
  24.  
  25. $p = new Persona();
  26. echo $p->getNombre();
  27. echo $p->getNacimiento();
  28.  
  29. $p = new Persona();
  30. echo $p->getNombre();
  31. echo $p->getNacimiento();

Tiene atributos pero en definitiva es lo mismo que la primera versión. El resultado es el mismo.

Ahora con atributos pero pasandole valores por parámetros en el constructor y asignándole a los atributos.
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Persona
  4. {    
  5.     private $nombre;
  6.     private $nacimiento;
  7.  
  8.  
  9.     function __construct($nombre, $nacimiento) {
  10.         $this->nombre = $nombre;
  11.         $this->nacimiento = $nacimiento;
  12.     }
  13.  
  14.     public function getNombre()
  15.     {
  16.         return $this->nombre;
  17.     }
  18.    
  19.     public function getNacimiento(){
  20.         return $this->nacimiento;
  21.     }
  22. }
  23.  
  24. $p = new Persona("Pepito", "01-01-1994");
  25. echo $p->getNombre();
  26. echo $p->getNacimiento();
  27.  
  28. $p = new Persona("Juancito", "01-01-1994");
  29. echo $p->getNombre();
  30. echo $p->getNacimiento();

Ahora podemos crear tantas personas que queremos con una sola clase. En este caso los atributos sirven de algo.

Ahora vamos a agregar un método para saber si es mayor de edad.
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Persona
  4. {    
  5.     private $nombre;
  6.     private $nacimiento;
  7.  
  8.  
  9.     function __construct($nombre, $nacimiento) {
  10.         $this->nombre = $nombre;
  11.         $this->nacimiento = $nacimiento;
  12.     }
  13.  
  14.     public function getNombre()
  15.     {
  16.         return $this->nombre;
  17.     }
  18.    
  19.     public function getNacimiento(){
  20.         return $this->nacimiento;
  21.     }
  22.    
  23.     public function esMayor(){
  24.         /*
  25.          * Supongamos que hago un calculo con la fecha de nacimiento para saber la edad
  26.          * Pero para evitar el cálculo coloquemos 18 :P
  27.          */
  28.         $edad = 18;
  29.        
  30.         if ($edad >= 18)
  31.             return true;
  32.        
  33.         return false;
  34.     }
  35.  
  36.    
  37. }
  38.  
  39. $p = new Persona("Pepito", "01-01-1994");
  40. echo $p->getNombre();
  41. echo $p->getNacimiento();
  42. if ($p->esMayor())
  43.    echo "Es mayor";

En ésta última existe una variable $edad en el método esMayor(). ¿Porqué no lo hago con una propiedad que sea edad? porque por ahora sólo quiero obtener la edad para saber si es mayor, entonces hago el cálculo y le asigno a la variable $edad. Para hacer el cálculo de edad con el nacimiento puedo usar la propiedad $nacimiento o el método getNacimiento(), me va a dar el mismo valor.

Ahora si quiero saber la edad. Creamos un método para obtener la edad.
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Persona
  4. {    
  5.     private $nombre;
  6.     private $nacimiento;
  7.  
  8.  
  9.     function __construct($nombre, $nacimiento) {
  10.         $this->nombre = $nombre;
  11.         $this->nacimiento = $nacimiento;
  12.     }
  13.  
  14.    
  15.     public function getNombre()
  16.     {
  17.         return $this->nombre;
  18.     }
  19.    
  20.     public function getNacimiento(){
  21.         return $this->nacimiento;
  22.     }
  23.    
  24.     public function esMayor(){        
  25.         return $this->getEdad() >= 18;
  26.     }
  27.    
  28.     public function getEdad()
  29.     {
  30.         //devuelvo 18 nomas :P
  31.         return 18;
  32.     }
  33. }
  34.  
  35. $p = new Persona("Pepito", "01-01-1994");
  36. echo $p->getNombre();
  37. echo $p->getNacimiento();
  38. if ($p->esMayor())
  39.    echo "Es mayor";
¿Porqué no creo un atributo edad? Porque no necesito manipular la edad, lo obtengo con la fecha de nacimiento. ¿Puedo colocar un atributo? si, de poder se puede pero no creo que sirva de algo.
Ojo, no digo que da lo mismo obtener un dato desde una propiedad o de un método, siempre según el caso. En este caso si, porque no modifico la fecha de nacimiento luego de haber creado el objeto, pero, fijate que puede pasar si lo manipulo teniendo un get y un set para la fecha de nacimiento, o una propiedad publica:

Código PHP:
Ver original
  1. $p = new Persona("Pepito", "01-01-1994");
  2. echo $p->getEdad(); //Me da 18
  3. echo $p->edad; //Me da 18
  4. //Modifico ahora el nacimiento
  5. echo $p->nacimiento = "13-12-2012";
  6. echo $p->edad; // Me va a devolver 18 pero es erroneo porque modifiqué la fecha de nacimeinto
  7. echo $p->getEdad(); //Me va a devolver 0 porque el método devuelve la edad calculando con la fecha de nacimiento

O sea, todo depende jeje
Las propiedades sirven y funcionan de una forma, las variables local funcionan de una forma, como las utilices depende del programador


Me podés decir que para qué creo un método getNombre, getNacimiento, getEdad si se puede asignar el mismo valor a una propiedad estableciendolas como públicas, porque yo quiero que una vez creado el objeto solo se pueda acceder al valor y no modificarlo fuera de la clase