Diferencia entre revisiones de «Plantilla:PHP/Sobrecarga»

De WikiEducator
Saltar a: navegación, buscar
Línea 35: Línea 35:
  
  
*A pesar de que tiene tres parámetros, la invacamos sin parámetros
+
*A pesar de que tiene tres parámetros, la invocamos 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
+
*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):
 
[[Imagen:funcionSinParametrosReales.png]]
 
[[Imagen:funcionSinParametrosReales.png]]
 
}}
 
}}
Línea 54: Línea 54:
  
  
{{MRM_Ejemplo|Title=Invocar con 3 parámetros reales|
+
{{MRM_Ejemplo|Title=Invocar con 2 parámetros reales|
 
<source lang=php>
 
<source lang=php>
 
   ...  
 
   ...  
Línea 66: Línea 66:
 
[[Imagen:funcion2ParametrosReal.png]]
 
[[Imagen:funcion2ParametrosReal.png]]
 
}}
 
}}
{{MRM_Ejemplo|Title=Invocar con 3 parámetro reales uno de ellos un array|
+
 
 +
{{MRM_Ejemplo|Title=Invocar con 3 parámetro reales|
 +
<source lang=php>
 +
  ...
 +
echo "Invocando a <strong>verTipoParametros ('pedro',5,9)</strong><hr />";
 +
verTipoParametros ('pedro',5,9);
 +
  ...
 +
</source>
 +
*Ahora  pasamos tres parámetros, como vemos el primero de tipo string y los otros dos enteros
 +
*Podemos ver el resultado
 +
[[Imagen:funcion3ParametrosReal.png]]
 +
}}
 +
 
 +
 
 +
{{MRM_Ejemplo|Title=Invocar con 3 parámetro reales uno de ellos un '''array'''|
 
<source lang=php>
 
<source lang=php>
 
   ...  
 
   ...  
echo "Invocando a <strong>verTipoParametros ([1,4,'maria'],true,'sonia')</strong><hr />";
+
echo "Invocando a <strong>verTipoParametros ([1,4,'maría'],true,'sonia')</strong><hr />";
verTipoParametros ([1,4,'maria'],true,'sonia');
+
verTipoParametros ([1,4,'maría'],true,'sonia');
 
   ...
 
   ...
 
</source>
 
</source>
*Ahora igualemnte pasamos tres parámetros, pero uno de ellos es un array
+
*Ahora igualemente pasamos tres parámetros, pero uno de ellos es un array
 
*Podemos ver el resultado
 
*Podemos ver el resultado
 
[[Imagen:funcionParametroRealArray.png]]
 
[[Imagen:funcionParametroRealArray.png]]
Línea 80: Línea 94:
  
 
=======================================
 
=======================================
*Supongamos que en el ejemplo anterior quisiérmos poder instanciar de la siguiente manera los racionales
+
*Supongamos que en el ejemplo anterior quisiéramos poder instanciar de la siguiente manera los racionales
 
<source lang=php>
 
<source lang=php>
 
$a = new racional ("8/5");/*  8/5  */
 
$a = new racional ("8/5");/*  8/5  */
Línea 93: Línea 107:
 
*Una  manera  sencilla 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}}
 
{{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 parámetros
 
*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
 
<source lang=php>
 
<source lang=php>

Revisión de 01:26 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


Icon define.gif
polimorfismo
  • Podemos tener varios métodos con el mimos nombre, pero diferente número de parámetros o con parámetros de difernte tipo
  • El tiempo de ejecución se ejecutará uno u otro en función de los parámetros reales que pasemos en la invocación del método


  • 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.
  • Para simular la sobrecarga en php, jugamos con el concepto de que una variable que no tenga valor se considera de tipo null.
  • Lo vemos con 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 invocamos 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




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





Icon casestudy.gif
Invocar con 2 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




Icon casestudy.gif
Invocar con 3 parámetro reales
  ... 
echo "Invocando a <strong>verTipoParametros ('pedro',5,9)</strong><hr />";
verTipoParametros ('pedro',5,9);
  ...
  • Ahora pasamos tres parámetros, como vemos el primero de tipo string y los otros dos enteros
  • Podemos ver el resultado

Funcion3ParametrosReal.png





Icon casestudy.gif
Invocar con 3 parámetro reales uno de ellos un array
  ... 
echo "Invocando a <strong>verTipoParametros ([1,4,'maría'],true,'sonia')</strong><hr />";
verTipoParametros ([1,4,'maría'],true,'sonia');
  ...
  • Ahora igualemente pasamos tres parámetros, pero uno de ellos es un array
  • Podemos ver el resultado

FuncionParametroRealArray.png



===========================
  • Supongamos que en el ejemplo anterior quisiéramos 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 parámetros
  • 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



::