2010-10-21 18 views
5

Czy istnieje sposób na określenie liczby argumentów funkcji w klasie?Uzyskaj liczbę argumentów dla funkcji klasy

Co chcę zrobić, to co następuje.

$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); 
} 

Czy to możliwe?

+0

pewien. możesz jednak, przy definicji twojej klasy, użyć czegoś takiego jak func_get_arg() [http://php.net/manual/en/function.func-get-arg.php] i zgodnie z otrzymanymi argumentami, robić różne rzeczy .. – acm

+1

Powinieneś rozważyć alternatywny projekt. Czy możesz podać więcej kontekstu swojego problemu? – erisco

+1

Proszę wyjaśnić, czy chcesz poznać liczbę argumentów przekazanych do funkcji w środowisku wykonawczym, np. 'fn (1,1,1)' (3 argumenty) lub liczba argumentów podanych w podpisie, np. 'function fn ($ a, $ b $ c = 0, $ d = 0)' (4 argumenty, 2 wymagane, 2 opcjonalne) – Gordon

Odpowiedz

5

Korzystanie z odbicia, ale to naprawdę jest obciążenie w twoim kodzie; a metoda może mieć dowolną liczbę argumentów bez ich wyraźnego zdefiniowania w definicji metody.

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

Nie sądzę, że będę go używał, ale dziękuję za odpowiedź. – JasonS

+0

Podczas gdy metody odbijania w większości języków zwykle kosztują większą liczbę cykli procesora, używam tej właśnie metody i nie widzę żadnej różnicy w czasie wykonywania z lub bez. – Cypher

+0

@Cypher Po 2 i pół roku poprawy w PHP od momentu opublikowania tej odpowiedzi, Reflection znacznie się poprawił. –

3

Zastosowanie call_user_func_array zamiast, jeśli przejdą zbyt wiele parametrów, będą po prostu ignorowane.

Demo

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)); 

wyjście będzie

1, 2 

Dla dynamicznych argumentów użyć func_get_args takiego:

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)); 

wyjście będzie

1, 2, 3, 4, 5 
+0

Zostanie również wyświetlone ostrzeżenie, a przekazanie zbyt wielu argumentów za pomocą 'call_user_func_array' do niektórych funkcji (np. Is_numeric) spowoduje zmianę zachowanie tej funkcji. –

+0

@BrianHogg oczywiście. Ponieważ argumenty przekazywane do funkcji są przekazywane do stosu, jeśli stos jest pełny, dostaniesz dziwne zachowania. Jeśli kiedykolwiek stanie się to twoim problemem, problem nie dotyczy zachowania funkcji :) Użyj na przykład pojedynczej tablicy arg, na przykład. –

+0

pojawił się ostatnio problem z popularnym systemem CMS, w którym funkcja sprawdzania/filtrowania wywoływała 'is_numeric' z 3 parametrami (wartość plus szczegóły na żądanie), ale zamiast' is_numeric' sprawdzała pierwszy argument i ignorowała inne, zwracała NULL i sprawdzanie poprawności zostaje zakończone. Nie myśl, że to problem z przepełnieniem stosu (ha ha), ale raczej inne parametry wpływające na wynik działania, niż po prostu ignorowanie. –

5

Aby uzyskać liczbę argumentów funkcja lub metoda podpisu, można użyć

Przykład

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

Aby uzyskać liczbę argumentów przekazanych do funkcji a t czas pracy, można użyć

  • func_num_args - Zwraca liczbę argumentów przekazanych do funkcji

przykładu

function fn() { 
    return func_num_args(); 
} 
echo fn(1,2,3,4,5,6,7); // 7 
nie
Powiązane problemy