Sobrecarga de funciones PHP

Resuelto Vamsi Krishna B asked hace 54 años • 9 respuestas

Procedente de C++;)
¿Cómo puedo sobrecargar las funciones de PHP?

¿Una definición de función si hay argumentos y otra si no hay argumentos? ¿Es posible en PHP? ¿O debería usar if else para verificar si hay algún parámetro pasado desde $_GET y POST? y relacionarlos?

Vamsi Krishna B avatar Jan 01 '70 08:01 Vamsi Krishna B
Aceptado

No puedes sobrecargar funciones PHP. Las firmas de funciones se basan únicamente en sus nombres y no incluyen listas de argumentos, por lo que no puede tener dos funciones con el mismo nombre. La sobrecarga de métodos de clase es diferente en PHP que en muchos otros lenguajes. PHP usa la misma palabra pero describe un patrón diferente.

Sin embargo, puede declarar una función variada que admita un número variable de argumentos. Usaría func_num_args()y func_get_arg()para aprobar los argumentos y usarlos normalmente.

Por ejemplo:

function myFunc() {
    for ($i = 0; $i < func_num_args(); $i++) {
        printf("Argument %d: %s\n", $i, func_get_arg($i));
    }
}

/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc('a', 2, 3.5);
BoltClock avatar Jan 15 '2011 03:01 BoltClock

PHP no admite la sobrecarga de métodos tradicionales; sin embargo, una forma de lograr lo que desea sería utilizar el __callmétodo mágico:

class MyClass {
    public function __call($name, $args) {

        switch ($name) {
            case 'funcOne':
                switch (count($args)) {
                    case 1:
                        return call_user_func_array(array($this, 'funcOneWithOneArg'), $args);
                    case 3:
                        return call_user_func_array(array($this, 'funcOneWithThreeArgs'), $args);
                 }
            case 'anotherFunc':
                switch (count($args)) {
                    case 0:
                        return $this->anotherFuncWithNoArgs();
                    case 5:
                        return call_user_func_array(array($this, 'anotherFuncWithMoreArgs'), $args);
                }
        }
    }

    protected function funcOneWithOneArg($a) {

    }

    protected function funcOneWithThreeArgs($a, $b, $c) {

    }

    protected function anotherFuncWithNoArgs() {

    }

    protected function anotherFuncWithMoreArgs($a, $b, $c, $d, $e) {

    }

}
Stephen avatar Jan 15 '2011 03:01 Stephen

Para sobrecargar una función simplemente pase el parámetro como nulo de forma predeterminada,

class ParentClass
{
   function mymethod($arg1 = null, $arg2 = null, $arg3 = null)  
     {  
        if( $arg1 == null && $arg2 == null && $arg3 == null ){ 
           return 'function has got zero parameters <br />';
        }
        else
        {
           $str = '';
           if( $arg1 != null ) 
              $str .= "arg1 = ".$arg1." <br />";

           if( $arg2 != null ) 
              $str .= "arg2 = ".$arg2." <br />";

           if( $arg3 != null ) 
              $str .= "arg3 = ".$arg3." <br />";

           return $str;
         }
     }
}

// and call it in order given below ...

 $obj = new ParentClass;

 echo '<br />$obj->mymethod()<br />';
 echo $obj->mymethod();

 echo '<br />$obj->mymethod(null,"test") <br />';
 echo $obj->mymethod(null,'test');

 echo '<br /> $obj->mymethod("test","test","test")<br />';
 echo $obj->mymethod('test','test','test');
Adil Abbasi avatar Jun 11 '2013 10:06 Adil Abbasi