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

[SOLUCIONADO] Sobrecarga en PHP POO

Estas en el tema de Sobrecarga en PHP POO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Muy buenas, una vez pido ayuda en este foro que de tanto me ha servido anteriormente. Primeramente gracias por adelantado para todo aquel que lea ...
  #1 (permalink)  
Antiguo 04/03/2013, 15:54
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Sobrecarga en PHP POO

Muy buenas, una vez pido ayuda en este foro que de tanto me ha servido anteriormente.

Primeramente gracias por adelantado para todo aquel que lea esto, que tengo que reconocer que es un poco aburrido y largo.

Esta vez tengo que reconocer que voy más perdido que otras veces, estoy empezando a hacer mis pinitos en POO y no entiendo el concepto de sobrecarga, sé que PHP no soporta la sobrecarga pero puede simularse, entiendo, o eso creo, el concepto de polimorfismo pero la sobrecarga me da problemas.

Quiero generar un método que dependiendo del número de parámetros que le pase me ejecuta uno u otro codigo, y quiero hacer 5 casos, si acepta dos parámetros, me da la suma, si acepta tres el producto, si acepta cuatro la suma 2 a 2 y la división...etc.

pero no entiendo varias cosas:
1) según mi codigo, en realidad estoy haciendo 5 métodos distintos con 5 nombres distinos, cuando lo que quiero es que se llamen igual.

2)se supone que cuando isntancie al método, en ese momento es cuando tengo que pasarle los parámetros, y dependiendo de cuántos sean me hará una u otra cosa.

3) pongo mi codigo, y me salta el siguiente error:
Fatal error: Call to undefined method miclase::metodo() in C:\xampp\htdocs\loader.php on line 47, no sé porque me lo llama comosi fuera estático.

os adjunto el codigo:
Código PHP:
Ver original
  1. <?php
  2. class miclase{
  3. $metodos = array();
  4. public function _call($method_name,$parametros){
  5.  
  6. if(in_array($method_name,$this->metodos)){
  7. if(func_num_args($parametros)==0){
  8. $this-> metodo0;
  9. }
  10. if(func_num_args($parametros)==1){
  11. $this-> metodo1;
  12. }
  13. if(func_num_args($parametros)==2){
  14. $this-> metodo2;
  15. }
  16. if(func_num_args($parametros)==3){
  17. $this-> metodo3;
  18. }
  19. if(func_num_args($parametros)==4){
  20. $this-> metodo4;
  21. }
  22. if(func_num_args($parametros)==5){
  23. $this-> metodo5;
  24. }
  25. }
  26.  
  27. else
  28. {
  29. echo "error, no existe el método";}
  30. }
  31. public function metodo1(){
  32. return "hola";}
  33.  
  34. public function metodo2($num1){
  35. return $num1;}
  36.  
  37. public function metodo3($num1,$num2){
  38. return $num1 + $num2;}
  39. public function metodo4($num1,$num2,$num3){
  40. return $num1 * $num2 * $num3;}
  41.  
  42. public function metodo5($num1,$num2,$num3,$num4){
  43. return ($num1 + $num2 )/($num3 + $num4);
  44. }
  45. }
  46. $objeto = new miclase(3,5,6);
  47. $objeto -> metodo();
  48. ?>
  #2 (permalink)  
Antiguo 04/03/2013, 16:14
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Cita:
Iniciado por jcd Ver Mensaje
sé que PHP no soporta la sobrecarga pero puede simularse, entiendo, o eso creo, el concepto de polimorfismo pero la sobrecarga me da problemas.

Quiero generar un método que dependiendo del número de parámetros que le pase me ejecuta uno u otro codigo, y quiero hacer 5 casos, si acepta dos parámetros, me da la suma, si acepta tres el producto, si acepta cuatro la suma 2 a 2 y la división...etc.
Eso no es polimorfismo, y, por lo tanto, tampoco sobrecarga.Son distintos métodos que lo único que tienen que ver los unos con los otros, es que quieres que se llamen igual.
Sobrecarga es cuando quieres realizar la *misma* acción sobre diferentes tipos de datos, especialmente, cuando dichos tipos tienen una clase base común.Pero lo importante es que la acción sea semánticamente la misma.La suma, la división, la multiplicación, no son lo mismo.


Cita:
Iniciado por jcd Ver Mensaje
1) según mi codigo, en realidad estoy haciendo 5 métodos distintos con 5 nombres distinos, cuando lo que quiero es que se llamen igual.
Según tu código, ya están en un método que se "llaman igual".. _call.

Cita:
Iniciado por jcd Ver Mensaje
2)se supone que cuando isntancie al método, en ese momento es cuando tengo que pasarle los parámetros, y dependiendo de cuántos sean me hará una u otra cosa.
Y ese método..se llama "_call"

Cita:
Iniciado por jcd Ver Mensaje
3) pongo mi codigo, y me salta el siguiente error:
Fatal error: Call to undefined method miclase::metodo() in C:\xampp\htdocs\loader.php on line 47, no sé porque me lo llama comosi fuera estático.
Porque en tu clase no está definido ese método.Te lo "llama como si fuera estático", porque en PHP no existen métodos de instancia, sólo métodos de clase.Así que, por convención, te lo escribe así.


Cita:
Iniciado por jcd Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2. ...
  3. $this-> metodo0;
  4. ...
  5. $this-> metodo1;
  6. ...
  7. $this-> metodo2;
  8. ...
  9. $this-> metodo3;
  10. ...
  11. $this-> metodo4;
  12. ...
  13. $this-> metodo5;
Esas líneas no creo que estén haciendo nada (digo creo, porque es posible que estén creando variables miembro..quién sabe)
  #3 (permalink)  
Antiguo 04/03/2013, 16:36
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Sobrecarga en PHP POO

ok, gracias, ahora empiezo a entenderlo, a ver si creo un mejor ejemplo para acabarlo de entender.
  #4 (permalink)  
Antiguo 04/03/2013, 16:38
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Sobrecarga en PHP POO

osea, polimorfismo es cuando un método ejecuta codigos distintos dependiendo de si los parámetros que se le pasan son distintos en número y/o en tipo.

y sobrecarga es cuando quiero que a un objeto se le aplique distintos métodos.
  #5 (permalink)  
Antiguo 04/03/2013, 16:53
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Sobrecarga es un tipo especial de polimorfismo, aplicado a operadores.PHP no soporta polimorfismo (ni sobrecarga) ya que es un lenguaje no tipado.
Supón que tienes un método Pagar() en una clase, y quieres poder pagar con monedas, con tarjeta, o con un cheque.Éste sería un caso válido para hacer versiones polimórficas de Pagar(Monedas monedas){} .. Pagar(Cheque cheque).. etc.
En PHP, este comportamiento lo construyes definiendo un solo método Pagar($medio), y haciendo is_a , get_class(), etc, para determinar el tipo del objeto que han pasado como parámetro, y derivar al método (privado) correspondiente (Pagar_cheque, Pagar_tarjeta, etc)

Por otro lado, hay que, aunque PHP no permite al programador sobrecargar operadores, el operador '+' funciona con diferentes tipos de datos (números, arrays), en algo muy parecido a lo que sería una sobrecarga de operador típica.
  #6 (permalink)  
Antiguo 04/03/2013, 17:31
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

PHP a partir de la versión 5 si soporta Polimorfismo, y se puede realizar sobrecarga pero no de una manera tan pura como otros lenguajes orientados a objetos.

Sobrecarga de Metodos


Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #7 (permalink)  
Antiguo 04/03/2013, 17:50
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Cita:
Iniciado por portalmana Ver Mensaje
PHP a partir de la versión 5 si soporta Polimorfismo, y se puede realizar sobrecarga pero no de una manera tan pura como otros lenguajes orientados a objetos.

Sobrecarga de Metodos

Saludos
Donde dice , en ese link, que PHP 5 soporta polimorfismo!?! Y, por supuesto, mucho menos, sobrecarga de operadores.

Decir que el uso de los métodos mágicos de PHP significa que el lenguaje en sí soporta alguna característica...
Para esta "implementación no tan pura", no hacen falta métodos mágicos.
Código PHP:
Ver original
  1. function llamaALoQueYoQuiera($methodName,$args)
  2. {
  3.       if(method_exists(.....)
  4. }
Con pasarle en $args los parámetros como un array...Puestos a no ser "puros"..

Cita:
La interpretacion de PHP para la sobrecarga de métodos, es diferente a la mayoria de los lenguajes orientados a objetos
Y tan diferente.Es *ninguna*.No existe tal cosa como "la interpretacion de PHP para la sobrecarga de métodos".
Cita:
Esté método puede ser redefinido para cubrir las necesidades del proyecto o como en este caso, proporcionar sobrecarga a nuestros scripts
Con lo que ya no es la "interpretacion de PHP", sino la "interpretación del proyecto"..Por dios, vaya blog...
_call puedes usarlo para hacer "sobrecarga"..
o "getters" y "setters"..
o funcionalidades de ORM..
o mil cosas..
Y no es ninguna de ellas.
  #8 (permalink)  
Antiguo 04/03/2013, 17:53
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

Manual de PHP eso para sobrecarga y creo que tienes mal el concepto de Polimorfismo si no te darías cuenta que php si soporta Polimorfismo.

Fijate que el enlace dice Sobrecarga de Métodos y no polimorfismo.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #9 (permalink)  
Antiguo 04/03/2013, 18:08
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Cita:
Se invoca a los métodos de sobrecarga cuando se interactúa con propiedades o métodos que no se han declarado o que no son visibles en el ámbito activo.
Ahora ve a ***cualquier*** manual de orientación a objetos, y me dices qué tiene que ver la sobrecarga, con la visibilidad dentro de un ámbito.

Wikipedia:
Cita:
In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface.
Vaya, seguro que esto se parece mucho más a lo que vas a encontrar en cualquier manual de Java o C++.Pero , vaya, ni mención a la visibilidad.Es más, esta definición no tiene *NADA* que ver con lo mencionado en el manual.

Wikipedia, Function overload
Cita:
Function overloading or method overloading is a feature found in various programming languages such as Ada, C++, C#, D, and Java, that allows creating several methods with the same name which differ from each other in the type of the input and the output of the function. It is simply defined as the ability of one function to perform different tasks.
Vaya, insisten en que lo que define la sobrecarga/polimorfismo, son 2 características:
1- Mismo nombre de método
2- Tipos de las variables de entrada
Sigue sin mencionar nada ni de que el método no exista, ni de la visibilidad de las variables..

Que puede, el **programador** hacer una implementación de "__call" que sirva para algo parecido a la sobrecarga? Si..y a mil cosas más...
Significa eso que el **lenguaje** tenga "soporte" de esas mil cosas...No..Significa que lo ha hecho el programador

Si yo hago una implementación de __call, para soportar getters y setters automáticos, esos getters y setters son "funciones sobrecargadas"?
  #10 (permalink)  
Antiguo 04/03/2013, 18:15
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

Haber si nos entendemos, si digo que php soporta de una manera no pura overloading significa que no es la manera ortodoxa que se conoce para un lenguaje orientado a objetos.

En el Manual lo aclara:
La interpretación de PHP de "overloading" es distinta de la mayoría de los lenguajes orientados a objetos. La sobrecarga tradicionalmente ofrece la capacidad de tener múltiples métodos con el mismo nombre, pero con un tipo o un número distinto de parámetros.

Polimorfismo no hay duda que si lo soporta.

saludos

P.D.: No se que te preocupo tanto que le contestara que si soporta Polimorfismo.
PHP a partir de la versión 5 si soporta Polimorfismo, y se puede realizar sobrecarga pero no de una manera tan pura como otros lenguajes orientados a objetos.

PHP es no tipado, pero para datos no nativos si se puede hacer que sea tipado.
Código PHP:
Ver original
  1. public function tipado(Usuario $user) ...
  2. o incluso public function (array $usuarios) ....
  3. No asi para integer, strings, booleanos y otros nativos..
En definitiva el hilo es la solución de la sobrecarga para quien pregunta y es como la resuelve el manual.
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 04/03/2013 a las 18:21
  #11 (permalink)  
Antiguo 04/03/2013, 18:29
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Cita:
Iniciado por portalmana Ver Mensaje
Haber si nos entendemos, si digo que php soporta de una manera no pura overloading significa que no es la manera ortodoxa que se conoce para un lenguaje orientado a objetos.
Juas...Yo tengo un pato, pero le llamo "elefante no ortodoxo".

Cita:
La interpretación de PHP de "overloading" es distinta de la mayoría de los lenguajes orientados a objetos.
PHP tiene toooda la libertad del mundo , de llamar "overloading" a lo que quiera, y decir que es "distinto su concepto".El pequeño problema es que OOP está inventado desde mucho antes que PHP, así como la idea de la sobrecarga.Si PHP quiere hacer "métodos que se llaman cuando no existe una función con un nombre", y le quiere llamar "overloading", pues eso, "elefante no ortodoxo".
Es más, PHP va más allá, y crea el "member overloading".Puedes hacer sobrecarga de variables miembro, sea lo que sea que eso signifique.Para eso, tiene los métodos mágicos __get y __set, también aplicados a cuando no existe una variable pública con ese nombre.

PFFFF.....

Cita:
Iniciado por portalmana Ver Mensaje
Polimorfismo no hay duda que si lo soporta.
Ponme 1 ejemplo.
  #12 (permalink)  
Antiguo 04/03/2013, 18:40
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

Código PHP:
Ver original
  1. <?php
  2. // Ejemplo Clasico de Polimorfismo en cualquier lenguaje
  3.  
  4.  
  5. abstract class Figura
  6. {
  7.     abstract public function area();
  8.     abstract public function perimetro();
  9. }
  10.  
  11. class Cuadrado extends Figura
  12. {
  13.     public function area()
  14.     {
  15.         echo 'Area de un Cuadrado<br>';
  16.     }
  17.    
  18.     public function perimetro()
  19.     {
  20.         echo 'Perimetro de un Cuadrado<br>' ;
  21.     }
  22. }
  23.  
  24. class Circulo extends Figura
  25. {
  26.     public function area()
  27.     {
  28.         echo 'Area de un Circulo<br>';
  29.     }
  30.    
  31.     public function perimetro()
  32.     {
  33.         echo 'Perimetro de un Circulo<br>' ;
  34.     }      
  35. }
  36.  
  37.  
  38. class Geometria
  39. {
  40.    
  41.     private $_figura;
  42.    
  43.     public function __construct(Figura $figura)
  44.     {
  45.         $this->_figura = $figura;
  46.     }
  47.    
  48.     public function calcular()
  49.     {
  50.         $this->_figura->area();
  51.         $this->_figura->perimetro();
  52.     }
  53. }
  54.  
  55. $calc = new Geometria(new Circulo());
  56. $calc->calcular();
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #13 (permalink)  
Antiguo 04/03/2013, 18:51
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Cita:
Iniciado por portalmana Ver Mensaje
[HIGHLIGHT="PHP"]
<?php
// Ejemplo Clasico de Polimorfismo en cualquier lenguaje
"Ejemplo Clasico de Polimorfismooooo???""" Re - juas.Será que PHP tiene un "concepto poco ortodoxo del polimorfismo"...Pero...lo de "en cualquier lenguaje"....
Ahora resulta que derivacion == Polimorfismo..
(Amos...acceder a la clase derivada, a través de la signature de la clase base, y eso, si a PHP le importara un pimiento que
le pongas un type-hinting que para lo que vale es para los editores de texto...porque lo que es a él...)
Si es que no puede ser...
  #14 (permalink)  
Antiguo 04/03/2013, 18:56
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

http://msdn.microsoft.com/es-es/libr...=vs.90%29.aspx
http://materias.fi.uba.ar/7507/conte...limorfismo.pdf
http://cursos.aiu.edu/Lenguajes%20de.../Tema%204b.pdf
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 04/03/2013 a las 19:12
  #15 (permalink)  
Antiguo 04/03/2013, 19:16
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Ese tipo de polimorfismo, está relacionado con el tipado .. cosa que PHP ignora..Pero hay muchos otros tipos de polimorfismo que sí son soportados por lenguajes orientados a objetos:
http://en.wikipedia.org/wiki/Polymor...puter_science)

Desengañate..Lo único que soporta php es Duck typing
  #16 (permalink)  
Antiguo 04/03/2013, 19:27
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

PHP soporta por lo menos polimorfismo por herencia y por interfaces entonces tu no puedes decir que no lo soporta. Al dar una respuesta al que inicia el hilo debes de dar la forma de solucionar el problema.
Ese ejemplo es de los mas clásicos de polimorfismos y te lo enseñan en cualquier lenguaje poo.

Aparte te digo que te falta un poco de educación para contestar para ser colaborador, no se contesta ni con sarcasmos ni risitas ni nada de eso. Y no es dificil admitir que php si soporta polimorfismo por definicion.

En programación orientada a objetos el polimorfismo se refiere a la posibilidad de enviar un mensaje a un grupo de objetos cuya naturaleza puede ser heterogénea. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía.
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 04/03/2013 a las 19:43
  #17 (permalink)  
Antiguo 05/03/2013, 05:17
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Sobrecarga en PHP POO

no llego a enterarme.

podeis ponerme un ejemplo de sobrecarga y otro de polimorfismo, el ejemplo de las áeras del circulo y cuadrado me parece un polimorfismo.

otro podía ser:

Código PHP:
Ver original
  1. <? php
  2. class numeros{
  3. public function polimorfica($num1,$num2){
  4. if (is_string($num1,$num2)){ return $snum1 + $num2;}
  5. elseif (is_string($num1,$num2)){return num1num2;}
  6. else {return "error"}
  7. ?>
osea, un mismo método sobre los mismos objetos hace una u otra cosa según sea el tipo.

realmente habría que poner con and porque is_string se aplica a una variable no hay más de una pero por ahorrar escritura.

¿cierto?
  #18 (permalink)  
Antiguo 05/03/2013, 11:06
 
Fecha de Ingreso: mayo-2012
Mensajes: 61
Antigüedad: 11 años, 11 meses
Puntos: 23
Respuesta: Sobrecarga en PHP POO

Estoy viendo que muchos de los que comentan no tienen claro conceptos básicos de polimorfismo. Les recomiendo que antes de asegurar cosas que puedan confundir al compañero que realizó una pregunta investiguen a cerca de los conceptos.

http://es.wikipedia.org/wiki/Polimor...orm%C3%A1tica)
  #19 (permalink)  
Antiguo 05/03/2013, 15:10
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

Este es un ejemplo de sobrecarga del Manual de PHP
Código PHP:
Ver original
  1. <?php
  2. class SobreCarga
  3. {
  4.     public function __call($metodo, $parametros)
  5.     {   if (method_exists($this, $metodo.sizeof($parametros))) return call_user_func_array(array($this, $metodo.sizeof($parametros)), $parametros);
  6.                 // Si la Funcion no Existe
  7.                 throw new Exception('Metodo Desconocido: '.get_class($this).'::'.$metodo);
  8.         }
  9.  
  10.         function Param2($a, $b) {
  11.                 echo "<br />Param2($a,$b)\n";
  12.         }
  13.  
  14.         function Param3($a, $b, $c) {
  15.                 echo "<br />Param3($a,$b,$c)\n";
  16.         }
  17. }
  18.  
  19. $o = new SobreCarga();
  20. $o->Param(4,5);
  21. $o->Param(4,5,6);
  22. $o->ParamX(4,5,6,7);
  23. ?>
  24. // La salida de este script seria:
  25. Param2(4,5)
  26. Param3(4,5,6)
  27. Fatal error: Uncaught exception 'Exception' with message 'Metodo Desconocido: SobreCarga::ParamX' in C:\xampp\htdocs\buscadorFullText\buscadorFullText\SobreCarga.php:7 Stack trace: #0 C:\xampp\htdocs\buscadorFullText\buscadorFullText\SobreCarga.php(22): SobreCarga->__call('ParamX', Array) #1 C:\xampp\htdocs\buscadorFullText\buscadorFullText\SobreCarga.php(22): SobreCarga->ParamX(4, 5, 6, 7) #2 {main} thrown in C:\xampp\htdocs\buscadorFullText\buscadorFullText\SobreCarga.php on line 7

Si ves desde fuera de la clase, esta sobrecarga simula bastante la tradicional, es decir utilizas el mismo método con distintos parámetros y se ejecutan distintos métodos aunque si ves la implementación aquí es donde se ve que no es una implementación normal de sobrecarga. A esto es a lo que supongo que dice el manual de php que no es normal.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #20 (permalink)  
Antiguo 11/03/2013, 10:59
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Sobrecarga en PHP POO

Después de unos días he entendido los conceptos de Polimorfismo y Sobrecarga en PHP, y me estoy dando cuenta de que las respuestas que me disteis no eran muy buenas, puede que fuera porque quien respondía no sabía exactamente la verdad.

Polimorfismo:

......... Método que ejecuta rutinas diferentes según los atributos sobre los que actúa, es decir, un ,método (POO) o función a la que se le pueden pasar distintos grupos de parámetros tanto en número como en tipo , y según sean estos, hace una cosa u otra.

Sobrecarga:
......N métodos llamados igual (por ejemplo _call) que . actuando sobre el mismo grupo de atributos o parámetros ejecuta rutinas diferentes.

Ejemplo de Polimorfismo:
Código PHP:
Ver original
  1. <?php
  2. class poli{
  3. public function ppp()
  4. {
  5. if (func_num_args()==0){
  6. echo "mete algún parámetro macho, de lo contrario no hay nada con lo que trabajar";
  7. }
  8. if (func_num_args()==1){
  9.      
  10.       echo func_get_arg(0)."<br>";
  11.                                     }
  12.      
  13. if( func_num_args()==2){
  14.  
  15.        {
  16.          echo "las entradas son cadenas de texto"."    ".func_get_arg(0)."    "."y"."    ".func_get_arg(1)."<br>";
  17.           }
  18.        {
  19.          echo "las entradas son números, cuya suma es:";
  20.          echo func_get_arg(0) + func_get_arg(1) ."<br>";
  21.        }
  22.  
  23.    else
  24.        {
  25.           echo "ERROR, las variables ni son números ni cadenas";
  26.         }
  27.  
  28.  
  29.        }//termina el primer BUCLE
  30. if (func_num_args()==3){
  31.        {
  32.          echo "las entradas son cadenas de texto"."    ".func_get_arg(0)."    "."y"."    ".func_get_arg(1)."    "."y".func_get_arg(2)."<br>";
  33.           }
  34.        {
  35.          echo "las entradas son números, cuya suma es:";
  36.          echo func_get_arg(0) + func_get_arg(1) - func_get_arg(2) ."<br>";
  37.        }
  38.  
  39.    else
  40.        {
  41.           echo "ERROR, las variables ni son números ni cadenas"."<br>";
  42.         }
  43.     }//termina el segundo bucle.
  44.     if(func_num_args()>3){
  45.     echo "CUIDADO RADIOACTIVOMAN El número de parámetros debe ser uno, dos o tres";
  46.     echo "<br>";
  47.     }//termina el último bucle.
  48.  
  49. }//termina la función
  50.  
  51. }//termina la clase
  52.  
  53.  
  54. ?>
se ejecuta :
Código PHP:
Ver original
  1. <html>
  2. <head>
  3. <title>polimorfismo</title>
  4. </head>
  5. <body>
  6. <?php
  7. require_once('polimorfismo1.php');
  8. $ob=new poli();
  9. $ob->ppp("Hola me llamo Anita");
  10. $ob->ppp(2.4);
  11. $ob->ppp(3,2);
  12. $ob->ppp("4","6");
  13. $ob->ppp(4.4,6.7);
  14. $ob->ppp(4,3,7);
  15. $ob->ppp(4,5,6,7);
  16. $ob->ppp(true,false);
  17. $obect->ppp("2","hola");
  18. ?>
  19. </body>
  20. </html>

dependiendo del número de de parámetros hace una u otra cosa, y si el número de parámetros es igual pero de distinto tipo, también ejecutra rutinas diferentes.

Ejemplo de Sobrecarga conmétodo _call, (ejemplo sacado de Internet, enhorabuena a Carlos Gil Luna por su excelente ejemplo).

Código PHP:
Ver original
  1. <?php
  2. class cochecito{
  3. private $marca ;
  4. private $color ;
  5. private $pais ;
  6. private $potencia;
  7. private $vmax;
  8. private $precio;
  9.  
  10. function __call($method, $arguments) {
  11. $prefix = strtolower(substr($method, 0, 3));
  12. $property = strtolower(substr($method, 3));
  13. if (empty($prefix) || empty($property)) {
  14. return;
  15. }
  16. if ($prefix == "get" && isset($this->$property)) {
  17. return $this->$property;
  18. }
  19. if ($prefix == "set") {
  20. $this->$property = $arguments[0];
  21. }
  22. }//fin del método
  23.  
  24.  
  25.  } //fin de la clase.
  26. ?>
y lo ejecutamos:

Código PHP:
Ver original
  1. <?php
  2. require_once('onewhocalls.php');
  3. ?>
  4. <html>
  5. <head>
  6. <title>probandometodomagicocall</title>
  7. </head>
  8. <body>
  9. <?php
  10. $one=new cochecito();
  11. $one->setmarca("Ferrari");
  12. $one->setmarca("Porche");
  13. $one->setcolor("rojo");
  14. $one->setprecio("160000/$");
  15. echo "la marca del coche es:"."    ".$one->getmarca()."<br>";
  16. echo "el color del coche es:"."     ".$one->getcolor()."<br>";
  17. echo "el precio del capricho es:"."    ".$one->getprecio()."<br>";
  18. ?>
  19. </body>
  20. </html>

no existen los métodos set ni get pero, PHP en vez de dar error, al tener un _call declarado, va allí para ver qué pasa, y lo que pasa es que _Call le impide dar error obligandole a ejecutar una serie de rutinas que, basicamente son que si los tres primeras carácteres del método instanciado (que no existe) empiezan por set me haga un seteo, si empiezan por get y resulta que coincide con alguno de los atributos declarados, me imprima ese atributo, como vemos, N métodos distintos todos llamados _call que actuando sobre los mismos atributos me ejecutan codigos distintos.
  #21 (permalink)  
Antiguo 11/03/2013, 14:14
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Sobrecarga en PHP POO

Revisa las definiciones que pusiste de Polimorfismo y sobrecarga.

Saludos

Esto es de la wiki:
Diferencias entre polimorfismo y sobrecarga

El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante ventajoso aplicado desde las interfaces, ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes (imaginemos que deseamos añadir una clase Multiplicar), basta con recompilar todo el código que incluye los nuevos tipos añadidos. Si se hubiera recurrido a la sobrecarga durante el diseño exigiría retocar la clase anteriormente creada al añadir la nueva operación Multiplicar, lo que además podría suponer revisar todo el código donde se instancia a la clase.

La sobrecarga se da siempre dentro de una sola clase, mientras que el polimorfismo se da entre clases distintas.

Un método está sobrecargado si dentro de una clase existen dos o más declaraciones de dicho método con el mismo nombre pero con parámetros distintos, por lo que no hay que confundirlo con polimorfismo.

En definitiva: La sobrecarga se resuelve en tiempo de compilación utilizando los nombres de los métodos y los tipos de sus parámetros; el polimorfismo se resuelve en tiempo de ejecución del programa, esto es, mientras se ejecuta, en función de la clase a la que pertenece el objeto.
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 11/03/2013 a las 14:21
  #22 (permalink)  
Antiguo 12/03/2013, 05:42
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Sobrecarga en PHP POO

polimorfismo se puede dar sólo en una clase, aquí es cada web tiene una definción distinta, yo creo que es como decía yo,pero tampoco soy un maestro así que....
  #23 (permalink)  
Antiguo 12/03/2013, 05:43
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Sobrecarga en PHP POO

ah no, que me estoy liando, confundí polimorfismo con sobrecarga, más o menos es como yo decía pero cambiando las definiciones
  #24 (permalink)  
Antiguo 12/03/2013, 15:52
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Sobrecarga en PHP POO

Cita:
Iniciado por portalmana Ver Mensaje
PHP soporta por lo menos polimorfismo por herencia y por interfaces entonces tu no puedes decir que no lo soporta. Al dar una respuesta al que inicia el hilo debes de dar la forma de solucionar el problema.
Ese ejemplo es de los mas clásicos de polimorfismos y te lo enseñan en cualquier lenguaje poo.

Aparte te digo que te falta un poco de educación para contestar para ser colaborador, no se contesta ni con sarcasmos ni risitas ni nada de eso. Y no es dificil admitir que php si soporta polimorfismo por definicion.
Me parece bien..en esas acepciones de polimorfismo..Te las acepto..Aunque yo a eso siempre le he llamado sobreescritura de métodos (method overriding), que es, además, el keyword que utilizan varios lenguajes de programación para indicarlo.
Sobre las risitas y el sarcasmo...lo siento, cuando alguien sostiene que PHP soporta sobrecarga, porque tiene el método _call, se le demuestra varias veces con distintos argumentos que eso no es así, y aún así se insiste...Sale de natural.

Ves? Yo no tengo problema en admitir que php soporta polimorfismo (aunque no sea mi terminología, entiendo que para mucha gente sí lo es)...

Aparte, la solución al problema la dí en el segundo post del thread.

Etiquetas: php, poo, sobrecarga
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:01.