4 Stimmen

By-ref-Argumentlisten variabler Länge in Funktionen

In PHP können Sie dies tun:

function something() {
  foreach (func_get_args() as $arg)
    echo $arg;
}
something(1, 3); //echoes "13"

Dies funktioniert gut für Argumente, die als Wert übergeben werden, aber was, wenn ich möchte, dass sie als Referenz übergeben werden? wie diese:

function something_else() {
  foreach (func_get_args() as $arg)
    $arg *= 2;
}
$a = 1;
$b = 3;
something_else($a, $b);
echo $a . $b; //should echo "26", but returns "13" when I try it

Ist dies in PHP möglich?

2voto

salathe Punkte 49834

Die Frage scheint schrecklich zu sein, aber wir machen uns über Sie lustig. Unten ist eine Schrecklicher Hacker Sie können aber auch ein einziges Argument senden, das die Elemente enthält, mit denen Sie arbeiten wollen.

function something_else($args) {
    foreach ($args as &$arg) {
        $arg *= 2;
    }
}
$a = 1;
$b = 3;
something_else(array(&$a, &$b));
echo $a . $b; // 26

1voto

Martin Dimitrov Punkte 4668

Nein, das können Sie nicht. Die Deklaration eines Prameters, der per ref übergeben wird, ist explizit als function something(&$arg1, &$arg2) . Wenn Sie die Anzahl der Parameter zum Zeitpunkt der Kompilierung nicht kennen, können Sie wie folgt vorgehen:

function something_else($args) {
      foreach ($args as $arg)
        $GLOBALS[$arg] *= 2;
}
$a = 1;
$b = 3;
something_else(array('a', 'b'));
echo $a . $b; //returns "26"

Im Grunde übergibt der Code der Funktion die Namen der Parameter, die die Funktion ändern soll. $GLOBALS enthält Verweise auf alle definierten Variablen im globalen Bereich des Skripts. Das bedeutet, dass der Aufruf aus einer anderen Funktion heraus nicht funktioniert:

function something_else($args) {
      foreach ($args as $arg)
        $GLOBALS[$arg] *= 2;
}

function other_function(){
    $a = 1;
    $b = 3;
    something_else(array('a', 'b'));
    echo $a . $b; //returns "13"
}
other_function();

Auslöser bemerkt undefinierte Indizes a y b . Ein anderer Ansatz besteht darin, ein Array mit Verweisen auf die Variablen zu erstellen, die von der Funktion geändert werden sollen:

function something_else($args) {
      foreach ($args as &$arg)
        $arg *= 2;
}

function other_fucntion(){
    $a = 1;
    $b = 3;
    something_else(array(&$a, &$b));
    echo $a . $b; //returns "26"
}
other_fucntion();

Beachten Sie die & en el foreach Linie. Sie wird benötigt, um nicht eine neue Variable zu erzeugen, die über das Array iteriert. PHP > 5 wird für diese Funktion benötigt.

1voto

newacct Punkte 114757

Sie können es auf diese Weise tun, aber es verwendet Call-Time Pass by Reference, die in PHP 5.3 veraltet ist:

function something_else() {
    $backtrace = debug_backtrace();
    foreach($backtrace[0]['args'] as &$arg)
    $arg *= 2;
}
$a = 1;
$b = 3;
something_else(&$a, &$b);
echo $a . $b;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X