Ver Mensaje Individual
  #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.