Sobrecarga de funciones PHP
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?
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);
PHP no admite la sobrecarga de métodos tradicionales; sin embargo, una forma de lograr lo que desea sería utilizar el __call
mé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) {
}
}
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');