PHP-funksjonen med ubegrenset antall parametre

stemmer
17

Hvordan skriver jeg en funksjon som kan ta imot ubegrenset antall parametre?

Hva jeg prøver å gjøre er å lage en funksjon i en klasse som brytes følgende:

$stmt->bind_param('sssd', $code, $language, $official, $percent);
Publisert på 16/10/2009 klokken 10:47
kilden bruker
På andre språk...                            


8 svar

stemmer
23

Har du tatt en titt på func_get_args , func_get_arg og func_num_args

Så for eksempel:

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

eller:

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
Angå Ewan Todds kommentar:
Jeg har ikke noen kunnskapsbasert av basen API du oppretter wrapper for, men et alternativ kan være å gjøre noe med kjeding funksjoner slik at resulterende grensesnittet ser omtrent slik ut:

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

Som jeg foretrekker over bruken av func_get_args som koden er trolig mer lesbar og enda viktigere mindre sannsynlighet for å forårsake feil på grunn av mangel på et format variabel.

Svarte 16/10/2009 kl. 10:49
kilden bruker

stemmer
0

Det er en funksjon som kalles func_get_args () , som er en oppstilling av alle argumenter som sendes til funksjonen.

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

Den ovennevnte eksempel vil produksjonen:

Antall argumenter: 3
Second argument er: 2
Argumentet er 0 er: 1
Argumentet er 1: 2
argument 2 er: 3

Svarte 16/10/2009 kl. 10:50
kilden bruker

stemmer
5

Bruk func_get_args():

function my_func() {
  $args = func_get_args();
  foreach ($args as $arg) {
    echo "Arg: $arg\n";
  }
}
Svarte 16/10/2009 kl. 10:50
kilden bruker

stemmer
4

Ovennevnte tilsier er alt bra, men jeg tror ikke de vil være egnet for din situasjon.

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

Hvis du ønsker å bryte denne funksjonen, må du passere referanser til de opprinnelige argumentet variabler til bind_param funksjonen. Jeg tror ikke func_get_args () gir deg dette, det gir deg verdier i stedet. Dermed vil det ikke være mulig å bruke disse til å passere til den overordnede funksjon. Jeg kjempet med et lignende problem når du prøver å forlenge mysqli_stmt og aldri kom til tilfredsstillende løsning.

Dette er egentlig ikke et svar på spørsmålet ditt er jeg redd, bare en advarsel om at andre argumenter ikke kan fungere i din applikasjon av vilkårlig antall argumenter.

Svarte 16/10/2009 kl. 11:04
kilden bruker

stemmer
2

På 5 parametere, er dette designet som begynner å vise de AntiPattern " for mange parametere ". Dette antyder den reproduksjon som kalles Parameter objekt , en gjenstand eller konstruksjon med datamedlemmer som representerer de argumenter som skal sendes i. Imidlertid unngå å gjøre det en magi Container .

Se også Introduser Parameter Object refactoring på refactoring.com.

Svarte 16/10/2009 kl. 11:25
kilden bruker

stemmer
0

Svarene med func_get_args () vil fungere bra for ikke-referanseparametre. Men det er et triks for å få bestått-by-referansen parametere for å fungere. Dessuten er det ikke teknisk sett en funksjon som aksepterer ubegrenset parametere, men bare noen vilkårlig stort antall, sier hundre.

Hva du kan gjøre, er å definere en funksjon som tar et stort antall argumenter, og få dem standard til null. Deretter innsiden som funksjon, føyer hver ikke-null referanse til en matrise, som da ville bli brukt til å ringe * bind_param () * ved hjelp av * 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, "");
}

Den virkelige kunsten er at du ikke ønsker å skrive denne tingen for hånd. Bare sørg for en annen script som vil produksjonen i kroppen av denne funksjonen (alt mellom Squiggle parentes) som * my_bind_param_body.php *. Deretter bare definere overskriften av funksjonen i hovedfilen, og inkluderer kroppen til den funksjonen definisjon. dvs

function my_bind_param(&$stmt, $types, &$arg1, &$arg2 = null, &$arg3 = null, ...)
{
    return include "my_bind_param_wrapper_body.php";
}
Svarte 01/02/2013 kl. 20:39
kilden bruker

stemmer
11

Tidligere bør du har brukt func_get_args(), men i php 5.6 , kan du bruke ... operatør .

Så for eksempel kan du skrive funksjonen som returnerer du en sum av alle tallene, som sendes til funksjonen:

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

Din paramser faktisk en rekke av alle elementer.

Svarte 18/04/2014 kl. 23:31
kilden bruker

stemmer
3

Hvis du bruker PHP 5.6 eller nyere versjon, kan argumentlister omfatte ...token å betegne at funksjonen godtar et variabelt antall argumenter. Argumentene vil bli ført inn i en gitt variabel som en matrise; Bare hjelp ...du kan få tilgang til ubegrenset variable argumenter.

for eksempel:

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

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

Hvis du bruker PHP versjon <= 5,5 så kan du få tilgang til ubegrenset parameterusing de func_num_args () , func_get_arg () , og func_get_args () funksjoner.

For eksempel:

<?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);
?>
Svarte 13/05/2017 kl. 13:52
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more