¿Es posible tener llamadas de función como parámetros predeterminados en php?

En php, esto se puede hacer:

function foo( $var = "bar" ){
    echo $var;
}

foo();         // output : bar

foo("cheese"); // output : cheese

Intenté usar una función en su lugar así:

function foo( $var = get_defined_vars() ){}

Lo que devolvió un error de análisis:

Parse error: syntax error, unexpected '(', expecting ')'

la respuesta obvia es pasar la variable así

function foo( $var ){
    // do stuff
}

foo( get_defined_vars() );

sin embargo, la función es sobrecargable y puede manejar muchos parámetros.

Usualmente uso la función como:

foo( $var1, $var2, $var3 ... etc );

Sin embargo, NECESITO los vars definidos del alcance por encima del foo función, lo que significa CADA VEZ que uso el foo función que tengo que pasar get_defined_vars().

Me resulta bastante molesto cómo cada vez que quiero usar esta función tengo que llamar get_defined_vars(); Al igual que:

foo( get_defined_vars(), $var1, $var2, $var3 ... etc );

Entonces, POR FAVOR, ¿alguien puede pensar en una manera de superar esto?

Intenté esto, también en vano:

function foo(){
    $args = func_get_args();
    array_unshift( get_defined_vars() );
    call_user_func_array( "bar", $args );
}

function bar(){
    // do stuff
}

preguntado el 04 de julio de 12 a las 10:07

Para mí, suena como si estuvieras tratando de hacer algo desagradable. Estoy seguro de que hay una solución mejor disponible... -

Si la función necesita todas las variables definidas del ámbito principal, la única forma es pasarlas como argumento. No hay forma de obtener variables del "ámbito superior a este" a menos que "el ámbito superior a este" sea el ámbito global. Sin embargo, debo decir que tener una función que se basa en variables definidas en el alcance principal (o, de hecho, cualquier alcance que no sea el actual) por nombre me parece un mal diseño. ¿Considera construir y pasar un objeto rígidamente definido en su lugar? -

La razón es para depurar variables con nombres de variables, ¡probablemente debería haber mencionado eso en alguna parte! -

El tipo de funcionalidad proporcionada por func_get_args(), get_defined_vars() etc., donde mágicamente pueden ver datos específicos del ámbito desde el que fueron llamados no implementables como una función definida por el usuario. Lo cual es bueno; si lo fuera, verías algunos horrible código por ahí, incluso peor de lo que ves en este momento. Pero si está depurando cosas, esperaría necesitar aprobar el tema, por ejemplo print_r() no sabe mágicamente lo que quieres que muestre, tienes que pasarle un valor. -

@AlexMorley-Finch ¿Alguna vez escuchó algo sobre XDebug? De verdad: Míralo. -

2 Respuestas

No, no puedes. Al igual que para las propiedades, solo se permiten valores estáticos y matrices. Incluso si, no lo recomendaría, porque hace que la llamada a una función sea impredecible.

El valor predeterminado debe ser una expresión constante, no (por ejemplo) una variable, un miembro de clase o una llamada a función.

http://php.net/functions.arguments#example-152

Respondido 15 Oct 12, 10:10

Intente algo en estas líneas:

function foo( $var1, $var2, $varForDefinedVars=null ){
  if (is_null($varForDefinedVars)){
     $varForDefinedVars = get_defined_vars();
  }
}

Respondido 04 Jul 12, 11:07

Eso solo recuperará las variables en el alcance de la función local, que no parece ser lo que el OP quiere lograr. - lesa majestad

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.