2010-10-21 26 views
5

¿Hay alguna forma de detectar el número de argumentos que tiene una función en una clase?Obtener el número de argumentos para una función de clase

Lo que quiero hacer es lo siguiente.

$class = 'foo'; 
$path = 'path/to/file'; 
if (! file_exists($path)) { 
    die(); 
} 

require($path); 

if (! class_exists($class)) { 
    die(); 
} 

$c = new class; 

if (num_function_args($class, $function) == count($url_segments)) { 
    $c->$function($one, $two, $three); 
} 

¿Esto es posible?

+0

seguro. Sin embargo, puede, en la definición de su clase, usar algo como func_get_arg() [http://php.net/manual/en/function.func-get-arg.php] y según los argumentos recibidos, hacer cosas diferentes ... – acm

+1

Deberías considerar un diseño alternativo. ¿Podría proporcionar más contexto a su problema? – erisco

+1

Por favor, aclare si desea saber la cantidad de argumentos pasados ​​a una función en tiempo de ejecución, p. 'fn (1,1,1)' (3 argumentos) o la cantidad de argumentos dados en la firma, p. 'function fn ($ a, $ b $ c = 0, $ d = 0)' (4 argumentos, 2 obligatorios, 2 opcionales) – Gordon

Respuesta

5

Usando la reflexión, pero esto es realmente una sobrecarga en su código; y un método puede tener cualquier cantidad de argumentos sin que se definan explícitamente en la definición del método.

$classMethod = new ReflectionMethod($class,$method); 
$argumentCount = count($classMethod->getParameters()); 
+0

No creo que lo use, pero gracias por la respuesta. – JasonS

+0

Mientras que los métodos de reflexión en la mayoría de los lenguajes tienden a costar una mayor cantidad de ciclos de CPU, estoy usando este método exacto y no veo ninguna diferencia en el tiempo de ejecución con o sin. – Cypher

+0

@Cypher Después de 2 1/2 años de mejora en PHP desde que se publicó esta respuesta, Reflection ha mejorado significativamente –

3

Uso call_user_func_array lugar, si pasa demasiados parámetros, que serán ignorados.

demostración

class Foo { 
    public function bar($arg1, $arg2) { 
     echo $arg1 . ', ' . $arg2; 
    } 
} 


$foo = new Foo(); 

call_user_func_array(array($foo, 'bar'), array(1, 2, 3, 4, 5)); 

salida se

1, 2 

Para argumentos dinámicos, utilice func_get_args así:

class Foo { 
    public function bar() { 
     $args = func_get_args(); 
     echo implode(', ', $args); 
    } 
} 


$foo = new Foo(); 

call_user_func_array(array($foo, 'bar'), array(1, 2, 3, 4, 5)); 

salida se

1, 2, 3, 4, 5 
+0

También se lanza una advertencia, y pasar demasiados argumentos usando 'call_user_func_array' a ciertas funciones (como is_numeric) realmente cambiará la comportamiento de esa función. –

+0

@BrianHogg, por supuesto. Como los argumentos pasados ​​a las funciones se envían a la pila, si la pila está llena, obtendrás comportamientos extraños. Si esto alguna vez se convierte en su caso, su problema no son los comportamientos de la función :) Por ejemplo, use una única matriz arg en ese caso. –

+0

hubo un problema reciente con un CMS popular donde una función de validación/filtro llamaba 'is_numeric' con 3 parámetros (el valor más detalles de la solicitud), pero en lugar de' is_numeric' mirando el primer argumento e ignorando otros, regresa NULL y la validación no se cumple. No piense que es un problema de desbordamiento de pila (ja, ja) sino más bien los otros parámetros que afectan la salida de la función en lugar de simplemente ser ignorado. –

5

Para obtener el número de argumentos de una función o un método de firma, puede utilizar

Ejemplo

$rf = new ReflectionMethod('DateTime', 'diff'); 
echo $rf->getNumberOfParameters();   // 2 
echo $rf->getNumberOfRequiredParameters(); // 1 

Para obtener la cantidad de argumentos pasados ​​a una función a t tiempo de ejecución, puede utilizar

  • func_num_args - Devuelve el número de argumentos pasados ​​a la función

Ejemplo

function fn() { 
    return func_num_args(); 
} 
echo fn(1,2,3,4,5,6,7); // 7 
no
Cuestiones relacionadas