Contenido

Consigue sobrecarga para tu PHP5

2 ago

+ 10

Ya estamos inmersos en el movimiento de migración masivo hacia PHP 5, un gran paso para todos ya que esta versión del lenguaje de programación ofrece muchas mejoras que tanto desarrollador como usuario van a percibir.

Pese a que la implementación de objetos está mucho mejor conseguida que en la versión 4, aún flojea en ciertos puntos y tenemos que hacer nuestras peripécias para conseguir efectos similares.

Sobrecarga

La sobrecarga es un propiedad que indica que podemos definir funciones con el mismo nombre, pero con diferente número y/o tipo de parámetros, dependiendo de ellos se ejecutará una función u otra. Algo muy normal en Java sería algo así.

class Pruebas {
  public void Pruebas(){
    System.out.println("Hola Pruebas");
  }

  public void Pruebas(String name) {
    System.out.println("Hola " + name);
  }

  public void Pruebas(String firstName, String lastName){
    System.out.println("Hola " + firstName + " " + lastName);
  }
}


Como podemos ver tenemos declarados 3 constructores (funciones que inicializan el objeto Pruebas) que reciben diferente número de parámetros, de esta forma podremos llamarlos dependiendo del número de parámetros que pasemos a la función con el mismo nombre.

Pero esta propiedad no está disponible por defecto en la versión 5 de PHP, aúnque en el mismo manual nos muestra un ejemplo de como conseguir emularlo y poder disfrutar de la potencia de la sobrecarga.

<?php

class Pruebas {
  function __call($method_name, $arguments) {
    $accepted_methods = array("hello");
    if(!in_array($method_name, $accepted_methods)) {
      trigger_error("Method <strong>$method_name</strong> no existe", E_USER_ERROR);
    }

    if(count($arguments) == 0) {
      $this->Pruebas1();
    } elseif(count($arguments) == 1) {
      $this->Pruebas2($arguments[0]);
    } elseif(count($arguments) == 2) {
      $this->Pruebas3($arguments[0], $arguments[1]);
    } else {
      return false;
    }
  }

  function Pruebas() {
    echo "Hola Pruebas";
  }

  function Pruebas($name){
    echo "Hola $name";
  }

  function Pruebas($first_name, $last_name){
    echo "Hola $first_name, $last_name<br>";
  }
}

$ot = new Pruebas();
$ot->Pruebas();
$ot->Pruebas("John");
$ot->Pruebas("John", "Smith");
?>

Como podemos ver declaramos la función __call(), esta función es muy útil para controlar excepciones y reforzar el código.

La función __call 

Se trata de un método “mágico” que permite capturar la invocación de métodos no existentes. Esté método puede ser redefinido para cubrir las necesidades del proyecto o como en este caso, proporcionar sobrecarga a nuestros scripts. Aprovechando está funcionalidad podemos controlar la función a la que estamos llamando y redirigir a la función concreta a la que hacemos referencia.

mixed __call ( string $name, array $arguments )

La función _call() recibe dos parámetros:

$name -> El nombre del método
$arguments -> Los argumentos pasados a la función.
  • No es por ser tiquismiquis, pero el ejemplo que has puesto tiene poco de sobrecarga, porque estás llamando a 3 métodos diferentes.

    La primera parte del código que has puesto (la definición de la clase) tiene su sentido. Aunque para ser correcto del todo, se debería cambiar ‘hello’ por ‘pruebas’.

    De este modo, se podría llamar a $ot->pruebas(), con o sin argumentos, sin tener que llamar a Pruebas1, 2 o 3.

  • exacto jeje, yo también me había fijado en eso, comentar que hay otras maneras de hacerlo en PHP con la extension de overload (sobrecarga) http://es.php.net/manual/en/ref.overload.php ;-)

  • #1 … definitivamente soy tonto xDDD Corregido :D

  • algo como esto resulta, no es sobrecarga, pero funciona bien.

    $nombre(&$args));
    }

    function Pruebas0() {
    echo “Hola Pruebas”;
    }

    function Pruebas1($args){
    $name = $args[0];
    echo “Hola $name”;
    }

    function Pruebas2($args){
    $first_name = $args[0];
    $last_name = $args[1];
    echo “Hola $first_name, $last_name”;
    }
    }

    $ot = new Pruebas();
    $ot->Pruebas();
    $ot->Pruebas(“John”);
    $ot->Pruebas(“John”, “Smith”);
    ?>

  • buenas malag, creo que el código que has indicado no hace algo similar a la sobre carga, y creo que es por que te has olvidado de poner la primera parte del código,de todas maneras, lo de PHP no es una sobre carga real, ya que lo hace mediante un manejador de argumentos … y el método mágico __call pero bueno … es lo que tenemos de momento jeje.

    Pues eso malag, peganos bien el código, ya que lo que escribiste así solo no hace nada.

    Un saludo

  • Tal vez no sea el mejor metodo pero hace el trabajo y mucho mas facil:
    enviar como parametros a la funcion a sobrecargar como una cadena con los caracteres que irian como parametros (met(1,texto, 99) => met(“1,texto, 99″))
    y hacer que la funcion met haga un remove de ” ” y un split y analizar el arreglo para decidir que hacer. facil, rapido y comodo (mas o menos, por el hecho de tener que crear cadenas cuando son mas de dos variables las que se envian)

  • Realmente interesante de una forma prácticamente sencilla la explicación peor en la practica no me funciono tu ejemplo pero si el del link expuesto aca.

    realmente ahorra mucho trabajo esta sobrecarga GRACIAS por la información.

  • Hola Anieto, disculpa que te moleste pero el ejemplo esta mal.

    Esta mal porque en la declaración de los métodos los llama con el mismo nombre y que ahí se ha equivocado? que en realidad seria Pruebas1, y Pruebas2, tambien que el $accepted_methods = array(“hello”); en lugar de ese debería ser un $accepted_methods = array(“Prueba”);?

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.