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

duda básica de POO PHP..

Estas en el tema de duda básica de POO PHP.. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, perdon por el titulo pero no se me ocurrió otra. Supongo que puedo hacer un hilo para preguntar algunas cosas de las cuales tengo ...
  #1 (permalink)  
Antiguo 07/03/2011, 22:23
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
duda básica de POO PHP..

Hola, perdon por el titulo pero no se me ocurrió otra.
Supongo que puedo hacer un hilo para preguntar algunas cosas de las cuales tengo duda en mi aprendizaje POO en PHP.

Bien estoy trabajando con herencia y tengo estas clases.

class.customer.php
Código PHP:
Ver original
  1. <?php
  2.      class Customer {
  3.        public $id;
  4.        public $customerNumber;
  5.        public $name;
  6.        public function __construct($customerID) {
  7.        
  8.          $data = array();
  9.          $data['customerNumber'] = 1000000;
  10.          $data['name'] = 'Jane Johnson';
  11.        
  12.          $this->id = $customerID;
  13.          $this->name = $data['name'];
  14.          $this->customerNumber = $data['customerNumber'];
  15.        }
  16.      }
  17.    ?>

class.SweepstakesCustomer.php
Código PHP:
Ver original
  1. <?php
  2.      require_once('class.Customers.php');
  3.      class SweepstakesCustomer extends Customer {      
  4.      
  5.        public function __construct($customerID) {
  6.            parent::__construct($customerID);          
  7.            if($this->customerNumber == 1000000) {
  8.              print "Congratulations $this->name! You're our
  9.                   millionth customer! <br>" .
  10.                    "You win a year's supply of frozen fish sticks! ";
  11.            }
  12.        }
  13.      }
  14.    ?>
y tengo el test.
Código PHP:
Ver original
  1. <?php
  2.      require_once('class.SweepstakesCustomer.php');
  3.      
  4.      function greetCustomer(Customer $objCust) {
  5.        print "Welcome back to the store $objCust->name! <br>";
  6.      }
  7.      
  8.      $promotionCurrentlyRunning = true;
  9.      if ($promotionCurrentlyRunning) {
  10.        $objCust = new SweepstakesCustomer(12345);
  11.      } else {
  12.        $objCust = new Customer(12345);
  13.      }
  14.      greetCustomer($objCust);
  15.    ?>

Estas clases las saque de un libro. Bien entiendo prácticamente todo a excepción de esta función en el archivo de test.
Código PHP:
     function greetCustomer(Customer $objCust) {
       print 
"Welcome back to the store $objCust->name! <br>";
     } 
Mi explicación es que se esta pasando el objeto($objCust) a la función(¿sera un método?) greetCustomer, pero en la definicion de esta funcion esta:
Customer $objCust, supongo que Customer hace referencia a la clase Base Customer?, intente colocando en vez de Customer, SweepstakesCustomer para ver si el test corre con normalidad y así es. Supongo que es por la herencia. Pero si coloco cualquier otro nombre en ves de Customer o SweepstakesCustomer el test no corre.

No se como se llama esto y no entiendo bien el funcionamiento, osea cual es la ventaja. Un saludo y espero me haya dejado entender.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #2 (permalink)  
Antiguo 07/03/2011, 22:32
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años
Puntos: 60
Respuesta: duda básica de POO PHP..

Ese es un ejemplo de "Polimorfismo" ya que te esta demostrando que a un objeto HEREDADO lo puedes tratar siempre como si fuese IGUAL que el de la clase base de la que hereda.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #3 (permalink)  
Antiguo 08/03/2011, 09:07
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: duda básica de POO PHP..

Si te refieres al nombre de Customer antes de $objCust, eso se conoce como Type Hinting y es para indicar que tipo de parámetro acepta la función, la puedes aplicar tanto a métodos, como a funciones, y puedes pasar el nombre de una clase, o una interfaz.

Saludos.
  #4 (permalink)  
Antiguo 09/03/2011, 17:46
 
Fecha de Ingreso: junio-2008
Mensajes: 131
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: duda básica de POO PHP..

Como dice GatorV, poner un nombre de una clase en la definicion de los parametros de un metodo o funcion se llama Type Hinting. Lo que estas indicando es que el parametro $objCust debe ser un objeto de la clase Customer.

El objeto $objCust que estas mandando es del tipo Customer, que a su vez hereda de SweepstakesCustomer, por lo tanto el Type Hinting para ambas clases se cumple.

http://php.net/manual/es/language.oop5.typehinting.php
  #5 (permalink)  
Antiguo 10/03/2011, 16:04
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: duda básica de POO PHP..

muchas gracias, estuve leyendo la documentación, muy bueno. Aclararon mi duda.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #6 (permalink)  
Antiguo 10/03/2011, 17:51
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: duda básica de POO PHP..

hola nuevamente, tengo un problema ahora que creo que mas que duda es un error que no logro identificar.
Intento aplicar una interfaz.
class.Door.php
Código PHP:
Ver original
  1. <?php
  2. require_once('interface.Opener.php');
  3.  
  4. class Door implements Openable{
  5.     private $_locked = false;
  6.  
  7.     public function open(){
  8.         if($this->_locked){
  9.             print "No se puede abrir la puerta. Esta bloqueado";
  10.         }else{
  11.             print "Sonido de Abrir";
  12.         }
  13.     }
  14.  
  15.     public function close(){
  16.         print "Sonido de Cerrar<br>";
  17.     }
  18.  
  19.     public function lockDoor(){
  20.         $this->_locked = true;
  21.     }
  22.  
  23.     public function unlockDoor(){
  24.         $this->_locked = false;
  25.     }
  26. }

class.Jar.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. require_once('interface.Opener.php');
  4.  
  5. class Jar implements Openable{
  6.  
  7.     private $contents;
  8.  
  9.     public function __construct($contents){
  10.         $this->contents = $contents;
  11.     }
  12.  
  13.     public function open(){        
  14.         print "El Frasco esta abierto ahora";
  15.     }
  16.  
  17.     public function close(){
  18.         print "El Frasco esta ahora cerrado";
  19.     }
  20. }

interface.Openable.php
Código PHP:
Ver original
  1. <?php
  2. interface Openable{
  3. abstract  function open();
  4. abstract function close();
  5. }
  6. ?>
y cuando ejecuto el test, no muestra lo que creo que mostraria(mensajes del método open).
archivo test.Openable.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. require_once('class.Door.php');
  4. require_once('class.Jar.php');
  5.  
  6. function openSomething(Openable $obj){
  7.     $obj->open();
  8. }
  9.  
  10.  
  11. $objDoor = new Door();
  12. $objJar = new Jar('Hola');
  13. $openSomething($objDoor);
  14. $openSomething($objJar);
  15.  
  16. ?>

Todos los archivos están en el mismo directorio.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #7 (permalink)  
Antiguo 10/03/2011, 18:16
 
Fecha de Ingreso: junio-2008
Mensajes: 131
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: duda básica de POO PHP..

Del ultimo archivo en las lineas 13 y 14 quita el signo $ al llamar a openSomething();

PD: Te recomiento que en tu php.ini pongas la directiva error_reporting asi:

error_reporting = E_ALL | E_STRICT

Porque ese codigo que pusiste deberia mostrarte un error de variable no definida y luego otro, que supongo no te los esta mostrando (o si pero no nos lo dijiste??)
  #8 (permalink)  
Antiguo 10/03/2011, 19:53
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: duda básica de POO PHP..

vaya, no se como puese esa llamada a la funcion en el post.
En fin, me habia olvidado mostrar los errores con php.

El error dice lo siguiente:
Cita:
Fatal error: Access type for interface method Openable::open() must be omitted in interface.Opener.php on line 3
Umm probe poniendo public abstract function y nada.
Edito:
Cuando en la interfaz reemplazo abstract por public si funciona, solo funciona con public.

Acaso los métodos de las interfaces no pueden ser abstractos?
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com

Última edición por Copia; 10/03/2011 a las 20:07
  #9 (permalink)  
Antiguo 10/03/2011, 20:34
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: duda básica de POO PHP..

Hola,

Una interface siempre es pública, no tiene sentido otra definición. Cuando defines una interface, estas diciendo que debe implementar ciertas características para ser usadas externamente por otro componente y asegurarte que el método existe, pero no sirve de nada si son privadas o abstractas.

Es decir, si defino una interface Openable, con método privados,

Código PHP:
interface Openable{
  private function 
open();
}

class 
Door implements Openable{
  private function 
open() {}

¿Acaso sirve de algo la interface en ese caso? Si no puedo llamar al método Door->open() sino es desde la misma clase, y la misma clase sabe que implementa y que no implementa.

Igual sucede con cualquier otra definición que no sea pública.

Saludos,
  #10 (permalink)  
Antiguo 10/03/2011, 20:43
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: duda básica de POO PHP..

oh! vaya entonces es un error muy grueso del libro que estoy leyendo.
Entonces para resumir en una interfaz, los métodos no deben ser de tipo abstract, private o protected, ya que solo se acepta public.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #11 (permalink)  
Antiguo 10/03/2011, 21:10
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: duda básica de POO PHP..

Hola,

Cita:
Iniciado por Copia Ver Mensaje
oh! vaya entonces es un error muy grueso del libro que estoy leyendo.
Entonces para resumir en una interfaz, los métodos no deben ser de tipo abstract, private o protected, ya que solo se acepta public.
Exactamente, como el ejemplo que te mostré, claramente se puede observar que no tiene sentido, ni siquiera dentro de la misma clase, el método solamente se puede usar internamente, cual sería el motivo de hacer público a todas las demas clases con una interface ... que tengo un método que no pueden llamar, ni la misma clase.

Código PHP:
Ver original
  1. interface Openable{
  2.   private function open();
  3. }
  4.  
  5. class Door implements Openable{
  6.   private function open() {}
  7.   public function ProbarOpen(Openable $otro) {
  8.      $otro->open(); // No se puede llamar porque es privado.
  9.   }
  10. }

En los métodos abstractos sucede algo muy parecido, no puedo llamarlos porque son abstractos, y no estoy seguro si la clase los implementa concretamente o no, si logro llamar a un método abstracto (que es virtual y no existe su implementación concreta) ... seguramente voy a obtener un error muy feo a un nivel demasiado bajo en la capa de aplicación.

Saludos,
  #12 (permalink)  
Antiguo 11/03/2011, 02:43
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: duda básica de POO PHP..

Que tal Copia,

no deberias confiar mucho en ese libro , y te sugiero que te des una vuelta por el manual, suele ahorrarte este tipo de problemas,
http://php.net/manual/es/language.oop5.interfaces.php
http://php.net/manual/es/language.oop5.abstract.php

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #13 (permalink)  
Antiguo 11/03/2011, 09:34
 
Fecha de Ingreso: junio-2008
Mensajes: 131
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: duda básica de POO PHP..

Yo el que he estado leyendo es "PHP Objects Patterns and Practice Third Edition" y me ha resultado muy bueno.
  #14 (permalink)  
Antiguo 11/03/2011, 20:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: duda básica de POO PHP..

Hola,

Cita:
Iniciado por masterpuppet Ver Mensaje
... y te sugiero que te des una vuelta por el manual, suele ahorrarte este tipo de problemas, ...
La cita específica del manual:

Cita:
Todos los métodos declarados en una interfaz deben ser public, ya que ésta es la naturaleza de una interfaz.
Pero ... ¿porqué?. Es muy importante conocer la diferencia, cuando se crean interfaces tienes que pensar en una 'comunicación' entre componentes, y no como pensaba Copia, una segunda 'definición' de clases. El manual es muy bueno para sacarte de dudas rápido, como las páginas 'man' de linux, una simple introducción al comando para cuando se te olvida algo. Pero la pregunta es puramente de programación orientada a objetos, igual se aplica en Java, C# o cualquier otro lenguaje orientado a objetos, y en ningún manual te explica por qué, esto solamente lo obtienes en foros del web o un tutorial avanzado de programación orientada a objetos. :D

En resúmen .. usa public, porque sino no corre.

Saludos,
  #15 (permalink)  
Antiguo 12/03/2011, 17:04
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: duda básica de POO PHP..

Gracias por sus respuestas :D.
Bueno el libro que leo es "Professional PHP5" por - Ed Lecky-Thompson, Heow Eide-Goodman, Steven D. Nowicki and Alec Cove.

Tengo entendido que el manual es bueno pero muchas veces son referencias a temas específicos y no enseñan a hacer las cosas por eso me decante por un libro y mas si tiene diagramas UML como ese.

Es muy complicado seguirlo porque no domino ingles :)
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com

Etiquetas: php, poo
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 13:02.