Plantilla:PHP/Sobrecarga
De WikiEducator
Revisión a fecha de 01:35 2 dic 2016; ManuelRomero (Discusión | contribuciones)
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
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
|
- 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:
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:
Invocar sin parámetros reales
| |
echo "Invocando a <strong>verTipoParametros ()</strong><hr / />"; verTipoParametros (); }
|
Invocar con 1 parámetro real
| |
... echo "Invocando a <strong>verTipoParametros (5)</strong><hr />"; verTipoParametros (5); ...
|
Invocar con 2 parámetros reales
| |
... echo "Invocando a <strong>verTipoParametros (5,7)</strong><hr />"; verTipoParametros (5,7); ...
|
Invocar con 3 parámetro reales
| |
... echo "Invocando a <strong>verTipoParametros ('pedro',5,9)</strong><hr />"; verTipoParametros ('pedro',5,9); ...
|
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'); ...
|
Sobrecargando el constructor
- Usando esta forma de trabajar vamos a sobre cargar el constructor de una clase
- Tomamos una clase de tipo Racional. Un número Racional es un objeto que tendrá numerador y denominador
===========================
- 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:
- sobrecargar en el constructor
- sobrecargar con métodos mágicos
- Sobrecargar en el constructor
- 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 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) { .... }
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
- $nombreFuncion es el nombre del método que se invoca
- $argumentos es un array con los argumentos de la función