martes, 5 de agosto de 2008

Sobrecarga de metodos PHP

Hace poco estuve buscando como hacer sobrecarga de metodos en PHP, tristemente descubri que no existe una forma de hacerlo natural, sino que tenemos que recurrir a artilugios como la llamada a funcion __call(), sin embargo me encontre con este post en el blog de aboyon, el dice que por esta razon PHP pierde la batalla frente a otros lenguajes como Java yo creo que eso de poner a competir lenguajes de programacion no esta bien.

Digo cada lenguaje tiene sus caracteristicas, ventajas y desventajas, siempre es bueno conocer uno o dos, algunos como RoR no los conozco (aunque como siempre siento inquietud, algun dia, algun dia :) ), y cada uno se amolda a las necesidades del desarrollador, por mi parte me gusta PHP, porque es rapido tanto en desarrollo como en configuracion, aun usando algun framework como CakePHP.

En fin no es mi intencion hacer polemica, pero bien puedo lidiar con poner nombres distintos a mis metodos, aunque en teoria hagan lo mismo, quien sabe?? tal vez mas adelante se pueda.

10 comentarios:

  1. hOla.. jej no entiendo nada pero creoO que tienes razoOn! suerte bye

    ResponderEliminar
  2. php no tiene sobrecarga de metodos, a cambio de eso puedes pasarle al constructor __construct() el numero de argumentos que quieras, no importa. Dentro del constructor puedes obtener los argumentos con la funcion func_get_args() y dependiendo del numero de argumentos haces la implementacion que convenga. Estas funciones sirven igualmente no solo para el contructor sino para cualquier metodo.

    ResponderEliminar
  3. asi es Cesar php no tiene sobrecarga de metodos, a lo que me referia es que tampoco me satisface mucho complicar mi codigo con la finalidad de seguir usando el mismo nombre para mis metodos.

    Por cierto tengo un error en mi post Ruby tampoco tiene sobrecarga de metodos.

    Saludos.

    ResponderEliminar
  4. Hacer métodos sobrecargados no es complicar el código, es una forma muy elegante de reaprovechar un montón de código y de no volver a escribir varias veces lo mismo. De hecho, no sobrecargar métodos es una forma poco eficiente y la aplicación resultante es poco extensible y poco escalable. Recuerda que los informáticos siempre buscamos lo más óptimo, no veo por qué escribir muchas funciones parecidas hace que un código sea menos complicado.

    ResponderEliminar
  5. Asi es mi estimado Daniel, pero lamentablemente PHP al menos hasta el momento no tiene esa posibilidad, es decir no permite sobrecargar metodos :( al contrario de Java que si lo permite, y la unica posibilidad es utilizando a trucos para emular la sobrecarga de metodos, lo cual a mi modo de ver si complica el codigo porque para mi lo mas facil entonces es simplemente poner diferentes nombres a mis metodos.

    ResponderEliminar
  6. Leyendo ésto: http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods
    Extraemos la conclusión que:
    class myClass
    {
    function myClass($txt1)
    {

    }
    function __call($method, $args)
    {
    if ($method == "methodOne")
    {
    if (count($args) == 1)
    {
    $this->methodOne1($args[0]);
    } else if (count($args) == 2)
    {
    $this->methodOne2($args[0], $args[1]);
    }
    }
    }

    function methodOne1($text_one)
    {
    print $text_one;
    }
    private function methodOne2($text_one, $text_two)
    {
    print $text_one." ".$text_two;
    }
    }

    Y asi se demuestra que la sobrecarga de métodos es efectiva y funcional en php.

    ResponderEliminar
  7. Yo no se casi nada de php, he estado currando cn .net y c# y estoy empezando a hacer mi proyecto fin de carrera y este ejemplo me acaba de venir de lujo para hacer sobrecargas de metodos xD Gracias!! Visitare el blog a menudo xDD

    ResponderEliminar
  8. Daniel, en efecto es funcional e incluso efectiva, pero no es natural:

    function __call($method, $args)
    {
    if ($method == "methodOne")
    {
    if (count($args) == 1)
    {
    $this->methodOne1($args[0]);
    } else if (count($args) == 2)
    {
    $this->methodOne2($args[0], $args[1]);
    }
    }
    }

    Segun este pedazo de codigo por cada metodo con mismo nombre que llamamos tendriamos que contar sus argumentos, eso esta bien si hablamos de uno o dos metodos, pero si son 4 o 5 entonces tendriamos que codificar mas y mas, se que esto que propongo no es algo que suceda a menudo pero sigue siendo a mi modo de ver una desventaja, y el argumento principal de mi post es que no es natural y comparandolo con otros lenguajes como Java (Y ustedes disculparan mi preferencia por Java pero me pasa como la primera vez que te enamoras despues de eso ya nada es igual... jaja) donde si se permite sobrecarga pues las cosas son mas complicadas, quizas no para personas que ya conocemos algo de PHP y menos personas que ya lo dominan pero si para quienes apenas empiezan, y mas como en mi caso para quien pasa de un lenguaje como Java donde tienes cosas que parecen magicas, a otro como PHP, que ojo!!! tambien tiene su magia yo no digo que no!!! XD

    ResponderEliminar
  9. Sin menospreciar PHP que utilizo muy seguido, en realidad la sobrecarga que implementa no es natura, como comenta Daniel en su código se basa en el numero de argumentos, y la sobrecarga utilizada en Java no necesariamente esta basada en el numero de argumentos, si no en los tipos del argumento.

    Es decir, si tengo un método que recibe un solo argumento, Java puede diferenciar la sobrecarga por el tipo de dato que recibe y no por el numero de argumentos.

    Esto es atendible ya que PHP es un lenguaje débilmente tipificado, pero tiene muchas magias como generar un método que reciba un Array y basarnos en las keys para su ejecución. Un ejemplo


    function miSobrecargaFreak($array){

    if(isArray($array){
    $tipos = array_keys($array);

    if(in_array("String",$tipos)){
    //una ejecucion
    }else if(in_array("Integer",$tipos)){
    //algo distinto a lo anterior
    }
    }
    //ejecución cuando es otro dato
    }

    Obviamente se puede mejorar para numero de tipos etc.
    Solo una idea mas a este mar de ideas.

    Saludos

    ResponderEliminar
  10. cual seria una desventaja de sobrecarga de métodos?

    ResponderEliminar