Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/03/2014, 02:51
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: APORTE: Emular polimorfismo y sobrecarga tipada de forma simple.

Buen aporte amigo, me gusta la idea.

Apuntes:

1. chk_polimorfismo debería devolver el resultado de la ejecución del método sobrecargado.

2. Uso de métodos mágicos de PHP, en concreto '__call', imaginate en un proyecto grande llamando a
Código PHP:
Ver original
  1. Customer->sobrecarga('getLastOrder', array('param1', 'param2', 'param3'), true, true);
3. Aprovecha la reflexión para solucionar este problema:

Código PHP:
Ver original
  1. <?php
  2.  
  3. abstract class Overridable extends \ReflectionObject {
  4.  
  5.     private function compare(array $params, array $args) {
  6.         if (count($params) != count($args))
  7.             return false;
  8.         foreach ($params as $param)
  9.             if ($param->getName() != gettype(each($args)[1]))
  10.                 return false;
  11.         return true;
  12.     }
  13.  
  14.     function __construct() {
  15.         parent::__construct($this);
  16.     }
  17.  
  18.     function __call($name, $args) {
  19.         foreach ($this->getMethods() as $method)
  20.             if (strpos($method->getShortName(), $name) === 0 && $this->compare($method->getParameters(), $args))
  21.                 return call_user_func_array([$this, $method->getName()], $args);
  22.         throw new \ReflectionException;
  23.     }
  24.  
  25. }
  26.  
  27. class Test extends Overridable {
  28.  
  29.     protected function method0($integer) {
  30.         var_dump(__METHOD__, "Hola, has ingresado: '$integer'");
  31.     }
  32.  
  33.     protected function method1($string) {
  34.         var_dump(__METHOD__, "Hola, has ingresado: '$string'");
  35.     }
  36.  
  37.     protected function method2($integer, $string) {
  38.         var_dump(__METHOD__, "Hola, has ingresado: '$integer' y '$string'");
  39.     }
  40.  
  41.     protected function method3($string, $integer) {
  42.         var_dump(__METHOD__, "Hola, has ingresado: '$string' y '$integer'");
  43.     }
  44.  
  45. }
  46.  
  47. $test = new Test;
  48.  
  49. $test->method(1);
  50. $test->method('hola');
  51. $test->method(99, 'hola');
  52. $test->method('hola', 1);

Esto es un aporte a tu aporte, no existe ni mejor ni peor solución, sólo diferentes y me parecía excesivo abrir un tema cuando justo estábamos desarrollando algo parecido cada uno para sus diferentes fines.