La sobrecarga es una implementacion del polimorfismo, asi como el ejemplo que tu propones es otra forma de implementarlo. El polimorfismo es un concepto abstracto no ligado a una forma de implementarlo.
Bueno, me has sorprendido con la clase abstracta, no me lo esperaba.
Fucione tu codigo y el mio (junto con un par de agregados) y mira lo que salio ¡Se puede usar el polimorfismo como en java! (o casi igual)
Código PHP:
Ver original<?php
abstract class OverridableType extends \ReflectionObject
{
public static function handleTypehint($errno, $errstr, $errfile, $errline)
{
if ($errno == E_RECOVERABLE_ERROR)
{
if (preg_match('/^Argument (\d)+ passed to (?:(\w+)::)?(\w+)\(\) must be an instance of (\w+)(.*)/', $errstr, $errmatches)) return true;
}
return false;
}
function __construct
() { parent
::__construct
($this); set_error_handler('OverridableType::handleTypehint'); }
function __call($name, $args)
{
$cant_args = count($args);
if($cant_args)
{
foreach ($this->getMethods() as $method)
{
$parameters = $method->getParameters();
if(count($parameters) == $cant_args) // Misma cantidad de parametros. {
preg_match("/^$name([0-9]+)/", $method->getShortName(), $coincidencias); if($coincidencias)
{
// Tienen el mismo numero de argumentos, y el nombre del metodo coincide.
preg_match_all('|Parameter #[0-9]+ \[ (<required>*) (.*) \$(.*) \]|U', $method->getParameters()[0]->getDeclaringFunction(), $params);
$coincidencia = true;
foreach($params[2] as $nro => $param)
{
// Verificar que sean del mismo tipo.
if(!($type == $param) and !($type == 'object' && ($args[$nro] instanceof $param)))
{
$coincidencia = false;
break;
}
}
if($coincidencia)
}
}
}
} else {
// No vienen parametros. Caso particular.
}
}
}
Código PHP:
Ver original<?php
// Y asi es como se implementa.
interface Vehicle {
function run();
}
class Train implements Vehicle {
function run() {
echo 'chu-chu, chu-chu, chu-chu, ...<br />';
}
}
class Car implements Vehicle {
function run() {
echo 'run, run, run, run, ...<br />';
}
}
class Moto implements Vehicle {
function run() {
echo 'rrrrrrrrrrrrrrrrrrrr ...<br />';
}
}
class Foto {
function sepia() {
echo 'me volvi sepia...<br />';
}
}
class Test extends OverridableType
{
protected function method()
{
echo("<br>Hola, no has ingresado nada<br>");
}
protected function method1(integer $unNumero)
{
echo("<br>Hola, has ingresado: $unNumero<br>");
}
protected function method2(string $miString)
{
echo("<br>Hola, has ingresado: '$miString'<br>");
}
protected function method3(Train $unTren)
{
echo("<br>Hola, gracias por el tren<br>");
$unTren->run();
}
protected function method4(Car $unAuto)
{
echo("<br>Hola, gracias por el auto<br>");
$unAuto->run();
}
protected function method5(Vehicle $unVehiculo)
{
echo("<br>Hola, gracias por el vehiculo<br>");
$unVehiculo->run();
}
protected function method6(object $unObjeto)
{
echo("<br>Hola, me diste un objeto: ".get_class($unObjeto).", muchas gracias.<br>"); }
}
$test = new Test;
$test->method();
$test->method(1);
$test->method('hola');
$test->method(99, 'hola');
$test->method('hola', 1);
$test->method(new Car);
$test->method(new Train);
$test->method(new Moto);
$test->method(new Foto);