2010-08-12 26 views
10

Supongamos que tengo un método/función con la siguiente firma:¿Cómo saber si el parámetro opcional en el método/función PHP fue establecido o no?

foo($bar = 0) 

Dentro foo, ¿cómo puedo saber si $ bar se establece o no? isset va todos los días devolver un VERDADERO desde $ bar se asigna en caso nada se pasa a foo.

La comprobación de 0 no es una opción. Necesito saber la diferencia entre el parámetro de forma explícita que se establece en 0 o por defecto a 0.

+1

Esa es una manera realmente tonta para que se comporte una función. 'f (0)' debería producir el mismo resultado, independientemente de la "fuente" del argumento '0'. –

+0

No si está creando un método polimórfico que hace una cosa si el parámetro está establecido y otra cosa si el parámetro no está establecido. – StackOverflowNewbie

+0

Frank, algunas funciones integradas hacen esto, en mi caso necesitaba envolver substr, y cuando pasé el argumento predeterminado de wrappers $ length de null a substr, no obtuve nada, ya que substr interpreta eso como 0 length. Sí, es terriblemente tonto, he llegado a esperar nada mejor de PHP. –

Respuesta

13

Sólo tiene que utilizar func_num_args() para comprobar específicamente para cuántos argumentos se ha pasado.

<?php 
function foo($bar = 0) 
{ 
    echo "\nNumber of arguments: " . func_num_args(); 
} 

    // Outputs "Number of arguments: 1" 
foo(0); 

    // Outputs "Number of arguments: 0" 
foo(); 
?>  

Live example

9

Usted puede usar func_get_args. Ejemplo:

function foo($optional=null) { 
    if (count(func_get_args()) > 0) 
     echo "optional given\n"; 
    else 
     echo "optional not given\n"; 
} 

foo(); //optional not given 
foo(null); //optional given 

Tenga en cuenta que la convención utilizada para funciones de PHP internos es siempre dar argumentos opcionales un valor predeterminado y para hacer que tienen el mismo comportamiento cuando ambos argumento no se da y se da explícitamente su valor por defecto. Si alguna vez encuentra lo contrario, presente un informe de error. usted hace cosas de este let así sin if s:

function strpos_wrap($haystack, $needle, $offset = 0) { 
    return strpos($haystack, $needle, $offset); 
} 

Esta convención se aplica más es espacio de usuario, como la dificultad que condujo a esta pregunta se ha mostrado. Si la convención no se ajusta a sus necesidades, al menos reconsidere su enfoque. El propósito de func_num_args/func_get_args es principalmente permitir funciones de argumento variables.

Cuestiones relacionadas