2009-10-16 15 views
16

Jak napisać funkcję, która może akceptować nieograniczoną liczbę parametrów?Funkcja PHP z nieograniczoną liczbą parametrów

Co staram się zrobić, to utworzyć funkcję w klasie, która owija następujące:

$stmt->bind_param('sssd', $code, $language, $official, $percent); 
+0

nie można zrobić bez uciążliwego wysiłków. Proponuję albo zbudować zapytanie w zwykły sposób, albo przejść do PDO, jeśli chcesz natywnie przygotowane instrukcje za wszelką cenę. Mają bindValue, mind you –

+0

Dzięki za informacje. Niestety, PDO wydaje się być przesadą, z jeszcze większym wysiłkiem i podstawą, w porównaniu do pisania tylko moich prostych rzeczy. –

+0

Dla prostych rzeczy możesz użyć biblioteki z mojego userinfo.To naprawdę proste. –

Odpowiedz

4

Powyższe sugeruje, wszystkie są dobre, ale nie sądzę, będą one odpowiednie dla danej sytuacji.

$stmt->bind_param('sssd', $code, $language, $official, $percent); 

Jeśli chcesz zawinąć tę funkcję, trzeba będzie zdać referencje do pierwotnych zmiennych argument funkcji bind_param. Nie sądzę, że func_get_args() to daje, zamiast tego daje wartości. W związku z tym nie będzie można ich użyć do przejścia do funkcji nadrzędnej. Walczyłem z podobnym problemem, próbując rozszerzyć mysqli_stmt i nigdy nie znalazłem satysfakcjonującego rozwiązania.

To nie jest odpowiedź na twoje pytanie. Obawiam się, po prostu ostrzeżenie, że inne argumenty mogą nie działać w twoim konkretnym zastosowaniu arbitralnej liczby argumentów.

+1

Rzeczywiście. Ostatnim razem, gdy sprawdzałem (ponad rok temu), nie było sposobu na zawijanie/rozszerzanie 'bind_param()', ponieważ 'func_get_args()' nie zwraca referencji. –

23

Brałeś spojrzeć na func_get_args, func_get_arg i func_num_args

więc na przykład:

function foo(){ 
    if (func_num_args() > 0){ 
     var_dump(func_get_args()); 
    } 
} 

czyli

function bind_param(){ 
    if (func_num_args() <= 1){ 
     return false; //not enough args 
    } 
    $format = func_get_arg(0) 
    $args = array_slice(func_get_args(), 1) 

    //etc 
} 

EDIT
chodzi Ewan Todds komentarza:
nie mam żadnych wiedza API bazy tworzonej opakowanie dla, ale inną alternatywą może być coś zrobić z funkcji łańcuchowym więc swoim wyglądem interfejsu wynikających coś takiego:

$var->bind()->bindString($code) 
      ->bindString($language) 
      ->bindString($official) 
      ->bindDecimal($percent); 

które wolałbym nad wykorzystaniem func_get_args jak kod jest prawdopodobnie bardziej czytelne, a co ważniejsze mniej prawdopodobne, aby powodować błędów wynikających z braku zmiennej formatu.

+0

Od czasu do czasu używam func_get_args. Cierpi na tym, że trudno jest zobaczyć na pierwszy rzut oka, jakie są dane wejściowe metody. Dodatkowo wprowadza do twojego kodu blokadę brzydkiej składni. Poleciłbym to podejście tylko w ostateczności. Preferuj refaktoryzację obiektu parametrów. –

+0

Zgadzam się z tobą, że jest to zły sposób robienia zmiennych argumentów. Dodałem alternatywny pomysł do mojej odpowiedzi – Yacoby

+0

Podoba mi się propozycja "funkcji łączenia" lepiej niż func_get_args. Znam ten projekt jako interfejs FLUENT. Jest to realizowane przez bindString(), bindDecimal() itp. "Return $ this;" jako ostatnia linia. Interfejs FLUENT to doskonała opcja dla fabryk typu cetain. –

0

Istnieje funkcja o nazwie func_get_args(), która jest tablicą wszystkich argumentów przekazanych do funkcji.

przykład z PHP.net

function foo() 
{ 
    $numargs = func_num_args(); 
    echo "Number of arguments: $numargs<br />\n"; 
    if ($numargs >= 2) { 
     echo "Second argument is: " . func_get_arg(1) . "<br />\n"; 
    } 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 
    } 
} 

foo(1, 2, 3); 

Powyższy przykład Wydajność:

Ilość argumenty 3
Drugi argument 2
argumentu 0 to 1
argument 1 : 2
Argument 2 to: 3

5

Zastosowanie func_get_args():

function my_func() { 
    $args = func_get_args(); 
    foreach ($args as $arg) { 
    echo "Arg: $arg\n"; 
    } 
} 
+0

To nie działa, jeśli parametry nie są ustawione, a następnie są przekazywane przez odniesienie, do ustawienia w funkcji. func_get_args próbuje uzyskać dostęp do zmiennej unset, która zgłasza błąd. – Danack

0

Odpowiedzi z func_get_args() będą działać poprawnie dla parametrów innych niż referencyjne. Istnieje jednak pewna sztuczka, aby uzyskać parametry przekazywane przez odniesienie do działania. Ponadto, nie jest to z technicznego punktu widzenia funkcja, która akceptuje parametry nieograniczoną liczbę, ale po prostu dowolną dużą liczbę, powiedzmy sto.

To, co możesz zrobić, to zdefiniować funkcję, która pobiera dużą liczbę argumentów i ma domyślną wartość null. Następnie wewnątrz tej funkcji dołącz każde niezerowalne odwołanie do tablicy, która byłaby następnie używana do wywoływania * bind_param() * przy użyciu * call_user_func_array() *.

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...) 
{ 
    $vars = array($types); 
    $vars[] = $arg1; 

    if ($arg2 != null) 
     $vars[] = &$arg2; 
    if ($arg3 != null) 
     $vars[] = &$arg3; 
    ... 

    if (!call_user_func_array(array($stmt, "bind_param"), $vars)) 
    { 
     if ($stmt->errno == 0) 
      return array(-1, "Unknown error binding parameters."); 
     else 
      return array(-1, "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error); 
    } 

    return array(0, ""); 
} 

Prawdziwą sztuką jest to, że nie chcą, aby napisać tę rzecz ręcznie. Po prostu zrób kolejny skrypt, który wypisze treść tej funkcji (wszystko pomiędzy nawiasami) jako * my_bind_param_body.php *. Następnie, po prostu zdefiniuj nagłówek funkcji w pliku głównym i dołącz treść do definicji tej funkcji. tj

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...) 
{ 
    return include "my_bind_param_wrapper_body.php"; 
} 
8

Wcześniej trzeba było stosować func_get_args(), ale w php 5.6, można użyć ... operator.

Tak na przykład można napisać funkcję, która zwraca państwu sumę wszystkich liczb, przekazanych do funkcji:

function bind_param(...$params){ 
    var_dump($params); 
} 

Twój params jest faktycznie tablicę wszystkich elementów.

2

Jeśli używasz PHP w wersji 5.6 lub nowszej, Listy argumentów mogą obejmować ... wyraz oznaczający, że funkcja przyjmuje zmienną liczbę argumentów. Argumenty będą przekazywane do danej zmiennej jako tablica; Po prostu przy użyciu można uzyskać dostęp do nieograniczonej liczby zmiennych.

na przykład:

<?php 
function sum(...$numbers) { 
    $sum = 0; 
    foreach ($numbers as $n) { 
     $sum += $n; 
    } 
    return $sum ; 
} 

echo sum(1, 2, 3, 4, 5); 
?> 

Jeśli używasz Wersja PHP < = 5,5 następnie można uzyskać dostęp nieograniczony parameterusing z func_num_args(), func_get_arg(), a func_get_args() funkcje.

Na przykład:

<?php 
function foo() 
{ 
    $numargs = func_num_args(); 
    echo "Number of arguments: $numargs \n"; 
    if ($numargs >= 2) { 
     echo "Second argument is: " . func_get_arg(1) . "\n"; 
    } 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "\n"; 
    } 
} 

foo(1, 2, 3); 
?> 
Powiązane problemy