Diferencia entre revisiones de «Plantilla:PHP/Sobrecarga»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «===Sobrecarga=== Un concepto muy importante y básico en la programación orientada a objetos. La sobrecarga es una concreción del principio de '''polimorfismo''' {{MMF_...»)
 
Línea 1: Línea 1:
 +
{{TEP}}
 
===Sobrecarga===
 
===Sobrecarga===
 
Un concepto muy importante  y básico en la programación orientada a objetos.
 
Un concepto muy importante  y básico en la programación orientada a objetos.
Línea 91: Línea 92:
 
[[Imagen:funcion3ParametrosReal.png]]
 
[[Imagen:funcion3ParametrosReal.png]]
 
}}
 
}}
 
 
 
 
 
 
  
 
*Supongamos que en el ejemplo anterior quisiérmos poder instanciar de la siguiente manera los racionales
 
*Supongamos que en el ejemplo anterior quisiérmos poder instanciar de la siguiente manera los racionales
Línea 109: Línea 104:
 
#sobrecargar con '''''métodos mágicos'''''
 
#sobrecargar con '''''métodos mágicos'''''
 
;Sobrecargar en el constructor
 
;Sobrecargar en el constructor
*Una sencila es ir viendo de qué tipo son los parámetros
+
*Una manera  sencilla es ir viendo '''''de qué tipo'''' son los parámetros
 +
{{Tip|Recordar que null también es un tipo}}
 
*Vemos que podemos tener 0, 1 o 2 paŕametros
 
*Vemos que podemos tener 0, 1 o 2 paŕametros
 
*Por lo tanto la función constructora tendrá que tener 3 parámetros inicializados por si no le pasamos valores
 
*Por lo tanto la función constructora tendrá que tener 3 parámetros inicializados por si no le pasamos valores

Revisión de 00:08 2 dic 2016

Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg


Sobrecarga

Un concepto muy importante y básico en la programación orientada a objetos.

La sobrecarga es una concreción del principio de polimorfismo Plantilla:MMF Definicion

  • Sin embargo este aspecto en php no es del todo intuitivo. No existe la sobrecarga como la entendemos en otros lenguajes.
  • No obstante tenemos técnicas para poder simular la sobrecarga.
  • Muchas veces es fundamental. Especialmente importante a la hora de sobrecargar el constructor de la clase.
  • Vamos a ver como podemos implementar la sobrecarga en php
  • Para simular la sobrecarga jugamos con el concepto de que una variable que no tenga valor se considera de tipo null
  • A coninuación una serie de ejemplos para dejar claro este concepto
  • Tomamos como ejemplo una función


Icon casestudy.gif
Ejemplo
function verTipoParametros($a,$b,$c){
    echo "Primer parámetro ";
    var_dump($a);
    echo "Segundo parámetro ";
    var_dump($b);
    echo "Tercer parámetro ";
    var_dump($c);
}



  • Ahora la invocamos de diferente manera y vemos el resultado


Icon casestudy.gif

Invocar sin parámetros reales

echo "Invocando a <strong>verTipoParametros ()</strong><hr / />";
verTipoParametros ();
}
  • A pesar de que tiene tres parámetros, la invacamos sin parámetros
  • El resultado será que cada parámetro al ejecutar la función será de tipo null con valor null (es un tipo válido en php
FuncionSinParametrosReales.png
{{{1}}}



Icon casestudy.gif

Invocar con 1 parámetro real

  ... 
  echo "Invocando a <strong>verTipoParametros (5)</strong><hr />";
  verTipoParametros (5);
  ...
  • En esta caso invocamos con un solo parámetro de tipo entero
  • Podemos ver el resultado
Funcion1ParametrosReal.png
{{{1}}}




Icon casestudy.gif

Invocar con 3 parámetros reales

  ... 
echo "Invocando a <strong>verTipoParametros (5,7)</strong><hr />";
verTipoParametros (5,7);
  ...
  • En esta caso invocamos con dos parámetros de tipo entero
  • Al igual que en caso anterior los parámetros en la función serían 3, dos de ellos con valor de tipo entero, y el tercero con valor y tipo null
  • Podemos ver el resultado
Funcion2ParametrosReal.png
{{{1}}}



Icon casestudy.gif

Invocar con 3 parámetro reales uno de ellos un array

  ... 
echo "Invocando a <strong>verTipoParametros ([1,4,'maria'],true,'sonia')</strong><hr />";
verTipoParametros ([1,4,'maria'],true,'sonia');
  ...
  • Ahora igualemnte pasamos tres parámetros, pero uno de ellos es un array
  • Podemos ver el resultado
FuncionParametroRealArray.png
{{{1}}}




Icon casestudy.gif

Invocar con 2 parámetro real

  ... 
echo "Invocando a <strong>verTipoParametros ('pedro',5,9)</strong><hr />";
verTipoParametros ('pedro',5,9);
  ...
  • En esta caso invocamos con tres parámetros de diferente tipo

Plantilla:Tipo

  • Ahora ya tenemos tres valores diferentes a null en los parámetros reales
  • Podemos ver el resultado
Funcion3ParametrosReal.png
{{{1}}}


  • Supongamos que en el ejemplo anterior quisiérmos poder instanciar de la siguiente manera los racionales
$a = new racional ("8/5");/*   8/5  */
$b = new racional (5,4);  /*   5/6  */
$c = new racional (5);    /*   5/1  */
$d = new racional ();     /*   1/1   */
  • Para esta situación tenemos diferentes estrategias. En este tema vamos a analizar 2:
  1. sobrecargar en el constructor
  2. sobrecargar con métodos mágicos
Sobrecargar en el constructor
  • Una manera sencilla es ir viendo de qué tipo' son los parámetros
Icon present.gif
Tip: Recordar que null también es un tipo


  • Vemos que podemos tener 0, 1 o 2 paŕametros
  • Por lo tanto la función constructora tendrá que tener 3 parámetros inicializados por si no le pasamos valores
 public function __construct($cadenaOrNum=null, $den = null) {
 ....
}


Icon activity.jpg
Sobrecargar el constructor de un racional

Siguiendo el ejemplo establecido anteriormente realiza un constructor que permita instanciar un objeto de la clase racional de la siguiente manera

$a = new racional ("8/5");/*   8/5  */
$b = new racional (5,4);  /*   5/6  */
$c = new racional (5);    /*   5/1  */
$d = new racional ();     /*   1/1   */



métodos mágicos y la sobrecarga
  • Hemos visto __construct y __destruct
  • Vamos a analizar un método mágico para implementar la sobrecarga y exponer su funcionamiento
  • Ël método __call($nombreFuncion, $argumentos)' es un método mágico que se invoca cuando intentamos acceder a un método de la clase y este método no existe
  • Volvamos a nuestro racional
  • Supongamos que los métodos de sobrecarga que queremos son los usados en el constructor __construct
// caso $a = racional(8,7);
racionalNumDen($cadenaOrNum, $den );
// caso $a = racional(8);
racionalNum($cadenaOrNum );
// caso $a = racional("8/7");
racionalCadena($cadenaOrNum);
// caso $a = racional(); y se inicia con 1/1
racionalVacio();
  • Pero imagenimos que nos gustaría que todos tuvieran el mismo nombre, por ejemplo crea().
  • Vamos a usar el método __call para ello
  • Este método recibe dos argumentos
  1. $nombreFuncion es el nombre del método que se invoca
  2. $argumentos es un array con los argumentos de la función


Icon activity.jpg
Actividad
vamos a sobrecargar el método asigna() de la clase racional de modo que accepte sobrecarga



::