entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

PHP: Crear un método con los primeros parámetros no obligatorios

Buenas, mi duda es la siguiente.

El caso es que me surgió la duda de como se puede realizar un método con parámetros no obligatorios al principio (no al final) en PHP.

class Array {
function add($index = null, $value) {
      // Por ejemplo añade algo a un array en la posicion $index si este no es null
}
}
// El funcionamiento que busco es este
$array = new Array();
$array->add("Hola");
$array->add(1, "Mundo");
$array->add("Hola", "Mundo");
// $array[0 => "Hola", 1 => "Mundo", "Hola" => "Mundo"]

En Java se que existe la sobrecarga pero en PHP no, y no se como podría realizar esto

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola Rubén,

no se puede hacer esto en PHP. La sintaxis del lenguaqje permite que se omitan parámetros asignándoles un valor por default, pero esto implica la restricción de que los parámetros opcionales tengan que usarse de izquierda a derecha (y no al revés).

Sin embargo, la sobrecarga es algo que ningún lenguaje de Objetos puro implementa, porque no hace falta (es un invento de la implementación de C++ que se hizo para ser usado por gente que hace programación estructurada). Tu situación tiene una simple solución de diseño:

class Array {
public $index = null;
function add($value) {
   // Por ejemplo añade algo a un array en la posicion $index si este no es null
   ...
   $this->index=null;
}
}
// El funcionamiento sería
$array = new Array();
$array->add("Hola");
$array->index = 1;
$array->add("Mundo");
$array->add("Hola", "Mundo");

Tal vez te suene un poco raro si usaste siempre lenguajes híbridos, pero es perfectamente usable y la semántica es más de Objetos, ya que tu semántica era más bien encapsular una función adentro de una clase. Fijate que ejemplo además pone a null el atributo al final, con lo que el método simpre tendrá el comportamiento por default a cada nueva llamada.

Queda mejor todavía definiendo $index privada y accediéndola por unos setters y getters, con lo que podrías validar en el setter que siempre sea un valor entero, etc.

Saludos cordiales!

0voto

rubengc comentado

Gracias Leonardo por la ayuda

He conseguido resolverlo usando func_num_args() y func_get_arg(int $arg) del siguiente modo:

public function add($index = null, $object) {
    if(func_num_args() == 2)
        $this->array[func_get_arg(0)] = func_get_arg(1);
    else
        $this->array[] = func_get_arg(0);

    return $this;
}

Ahora el problema que me aparece es que siempre me muestra un warning por no enviar el segundo parametro del metodo, ¿hay alguna forma de suprimir los warnings desde un metodo(sin usar el @ o cambiando el nivel de errores de php)?

0voto

Leonardo-Tadei comentado

Hola Rubén,

no hagas eso... desde el punto de vista de la POO no tiene ningún sentido. Declará una función y usala: es mucho más correcto para tu planteo del código.

Por otra parte, la idea de Programación Estructurada de usar func_num_args() es que declares la función de esta manera:

function add(){
...
}

y luego, contando los parámetros (y validándolos para que tengan sentido) ejecutar el algoritmo.

Saludos cordiales!

1voto

dairon Puntos17120

Yo en tu lugar usaría un arreglo a pasar por parámetro $in = array{$index,$objeto} y dentro de la función pongo una condicional si count($in) = 1 entonces return $this->$array_alive[] = $in[0]; else return $this->$array_alive[$in[0]] = $in[1]; y ya esta sin tanto enredo creo yo. apenas llevo unos meses con php. Saludos Dairon

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta