PHP-Funktion mit unbegrenzter Anzahl von Parametern

Lesezeit: 3 Minuten

PHP Funktion mit unbegrenzter Anzahl von Parametern
Alter ist

Wie schreibe ich eine Funktion, die eine unbegrenzte Anzahl von Parametern akzeptieren kann?

Was ich versuche zu tun, ist eine Funktion innerhalb einer Klasse zu erstellen, die Folgendes umschließt:

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

  • Sie können es nicht ohne mühsame Anstrengungen tun. Ich würde vorschlagen, entweder eine Abfrage auf übliche Weise zu erstellen oder zu PDO zu wechseln, wenn Sie um jeden Preis nativ vorbereitete Anweisungen wünschen. Sie haben bindValue, wohlgemerkt

    – Ihr gesunder Menschenverstand

    31. Januar 2013 um 17:00 Uhr

  • Danke für die Information. Leider scheint PDO übertrieben zu sein, mit noch mehr Aufwand und Boilerplate, verglichen mit dem Schreiben meiner eigenen einfachen Sachen.

    – ET

    31. Januar 2013 um 17:02 Uhr


  • Für die einfachen Dinge können Sie eine Bibliothek aus meiner Benutzerinfo verwenden. Es ist aber wirklich einfach.

    – Ihr gesunder Menschenverstand

    31. Januar 2013 um 17:11 Uhr

1645704247 994 PHP Funktion mit unbegrenzter Anzahl von Parametern
Yacoby

Hast du mal angeschaut func_get_args, func_get_arg und func_num_args

Also zum Beispiel:

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

oder:

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
}

BEARBEITEN

Zu Ewan Todds Kommentar:
Ich habe keine Kenntnis von der Basis-API, für die Sie den Wrapper erstellen, aber eine andere Alternative könnte darin bestehen, etwas mit Verkettungsfunktionen zu tun, damit Ihre resultierende Schnittstelle in etwa so aussieht:

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

Was ich der Verwendung von func_get_args vorziehen würde, da der Code wahrscheinlich besser lesbar ist und, was noch wichtiger ist, aufgrund des Fehlens einer Formatvariablen weniger wahrscheinlich Fehler verursacht.

  • Ich benutze func_get_args von Zeit zu Zeit. Es leidet darunter, dass es schwierig ist, auf einen Blick zu sehen, was die Eingaben der Methode sind. Außerdem fügt es einen Block mit hässlicher Syntax in Ihren Code ein. Ich würde diesen Ansatz nur als letzten Ausweg empfehlen. Bevorzugen Sie die Umgestaltung des Parameterobjekts.

    – Ewan Todd

    16. Oktober 2009 um 11:38 Uhr

  • Ich stimme Ihnen zu, dass es eine schlechte Art ist, variable Argumente zu verwenden. Ich habe meiner Antwort eine alternative Idee hinzugefügt

    – Yacoby

    16. Oktober 2009 um 11:56 Uhr

  • Ich mag den Vorschlag “Verkettungsfunktionen” besser als func_get_args. Ich kenne dieses Design als FLUENT-Schnittstelle. Dies wird erreicht, indem bindString(), bindDecimal() usw. “return $this;” ausführen. als ihre letzte Zeile. Die FLUENT-Schnittstelle ist eine großartige Option für bestimmte Arten von Fabriken.

    – Ewan Todd

    16. Oktober 2009 um 12:10 Uhr

PHP Funktion mit unbegrenzter Anzahl von Parametern
Salvador Dalí

Früher sollten Sie verwendet haben func_get_args()aber in der php5.6können Sie verwenden … Operator.

So können Sie zum Beispiel die Funktion schreiben, die Ihnen eine Summe aller Zahlen zurückgibt, die an die Funktion gesendet werden:

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

Dein params ist eigentlich ein Array aller Elemente.

Wenn Sie PHP 5.6 oder eine neuere Version verwenden, können Argumentlisten die enthalten ... Token, um anzugeben, dass die Funktion eine variable Anzahl von Argumenten akzeptiert. Die Argumente werden als Array an die angegebene Variable übergeben; Einfach nutzen ... Sie können auf unbegrenzte Variablenargumente zugreifen.

zum Beispiel:

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

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

Wenn Sie verwenden PHP-Version <= 5.5 dann können Sie mit dem auf unbegrenzte Parameter zugreifen func_num_args(), func_get_arg()und func_get_args() Funktionen.

Zum Beispiel:

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

Verwenden func_get_args():

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

Die oben genannten Vorschläge sind alle gut, aber ich glaube nicht, dass sie für Ihre Situation geeignet sind.

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

Wenn Sie diese Funktion umschließen möchten, müssen Sie sie übergeben Verweise zu den ursprünglichen Argumentvariablen zur Funktion bind_param. Ich glaube nicht, dass func_get_args() Ihnen das gibt, es gibt Ihnen stattdessen Werte. Daher ist es nicht möglich, diese zu verwenden, um an die übergeordnete Funktion zu übergeben. Ich hatte mit einem ähnlichen Problem zu kämpfen, als ich versuchte, mysqli_stmt zu erweitern, und kam nie zu einer zufriedenstellenden Lösung.

Dies ist leider nicht wirklich eine Antwort auf Ihre Frage, sondern nur eine Warnung, dass andere Argumente in Ihrer speziellen Anwendung einer beliebigen Anzahl von Argumenten möglicherweise nicht funktionieren.

  • In der Tat. Als ich das letzte Mal nachgesehen habe (vor mehr als einem Jahr), gab es keine Möglichkeit zum Wickeln/Verlängern bind_param() da func_get_args() gibt keine Referenzen zurück.

    – Josh Davis

    16. Oktober 2009 um 13:50 Uhr

1645704248 658 PHP Funktion mit unbegrenzter Anzahl von Parametern
Ewan Tod

Bei 5 Parametern beginnt dieses Design das AntiPattern “Zu viele Parameter“. Dies schlägt das sogenannte Refactoring vor Parameterobjektein Objekt oder eine Struktur mit Datenelementen, die die zu übergebenden Argumente darstellen. Vermeiden Sie es jedoch, es zu einem zu machen Magischer Behälter.

Siehe auch Parameterobjekt einführen Refactoring auf refactoring.com.

  • In der Tat. Als ich das letzte Mal nachgesehen habe (vor mehr als einem Jahr), gab es keine Möglichkeit zum Wickeln/Verlängern bind_param() da func_get_args() gibt keine Referenzen zurück.

    – Josh Davis

    16. Oktober 2009 um 13:50 Uhr

PHP Funktion mit unbegrenzter Anzahl von Parametern
Ólafur Waage

Es gibt eine Funktion namens func_get_args() Dies ist ein Array aller Argumente, die an die Funktion übergeben werden.

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

Das obige Beispiel wird ausgegeben:

Anzahl der Argumente: 3
Zweites Argument: 2
Argument 0 ist: 1
Argument 1 ist: 2
Argument 2 ist: 3

842930cookie-checkPHP-Funktion mit unbegrenzter Anzahl von Parametern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy