Suche…


Syntax

  • Funktion func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
  • Funktion func_name ($ optionalParameter = Standardwert) {code_to_run (); }
  • Funktion func_name (typname $ parameterName) {code_to_run (); }
  • Funktion & Returns_by_reference () {code_to_run (); }
  • Funktion func_name (& $ referenceParameter) {code_to_run (); }
  • Funktion func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
  • Funktion func_name (Typname & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
  • Funktion func_name (): return_type {code_To_run (); } // PHP 7.0+

Grundlegende Funktionsverwendung

Eine Basisfunktion wird wie folgt definiert und ausgeführt:

function hello($name)
{
    print "Hello $name";
}

hello("Alice");

Optionale Parameter

Funktionen können optionale Parameter enthalten, zum Beispiel:

function hello($name, $style = 'Formal')
{
    switch ($style) {
        case 'Formal':
            print "Good Day $name";
            break;
        case 'Informal':
            print "Hi $name";
            break;
        case 'Australian':
            print "G'day $name";
            break;
        default:
            print "Hello $name";
            break;
    }
}

hello('Alice');
    // Good Day Alice

hello('Alice', 'Australian');
    // G'day Alice

Argumente als Referenz übergeben

Funktionsargumente können "Nach Referenz" übergeben werden, sodass die Funktion die außerhalb der Funktion verwendete Variable ändern kann:

function pluralize(&$word)
{
    if (substr($word, -1) == 'y') {
        $word = substr($word, 0, -1) . 'ies';
    } else {
      $word .= 's';
    }
}

$word = 'Bannana';
pluralize($word);

print $word;
  // Bannanas

Objektargumente werden immer als Referenz übergeben:

function addOneDay($date)
{
    $date->modify('+1 day');
}

$date = new DateTime('2014-02-28');
addOneDay($date);

print $date->format('Y-m-d');
  // 2014-03-01

Um das implizite Übergeben eines Objekts als Referenz zu vermeiden, sollten Sie das Objekt clone .

Das Übergeben als Referenz kann auch als alternative Methode zur Rückgabe von Parametern verwendet werden. Zum Beispiel die Funktion socket_getpeername :

bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )

Diese Methode zielt tatsächlich darauf ab, die Adresse und den Port des Peers zurückzugeben. Da jedoch zwei Werte zurückzugeben sind, werden stattdessen Referenzparameter verwendet. Es kann so aufgerufen werden:

if(!socket_getpeername($socket, $address, $port)) {
    throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";

Die Variablen $address und $port müssen nicht zuvor definiert werden. Sie werden:

  1. zuerst als null definiert werden,
  2. dann mit dem vordefinierten null an die Funktion übergeben
  3. dann in der Funktion geändert
  4. am Ende als Adresse und Port im aufrufenden Kontext definiert.

Argumentlisten mit variabler Länge

5.6

In PHP 5.6 wurden Argumentlisten mit variabler Länge (aka varargs, variadic arguments) eingeführt. Das Token ... vor dem Argumentnamen wurde verwendet, um anzuzeigen, dass der Parameter variadisch ist, dh es handelt sich um ein Array, das alle von diesem Parameter an angegebenen Parameter enthält.

function variadic_func($nonVariadic, ...$variadic) {
    echo json_encode($variadic);
}

variadic_func(1, 2, 3, 4); // prints [2,3,4]

Typnamen können vor dem ... hinzugefügt werden:

function foo(Bar ...$bars) {}

Der Operator & reference kann vor dem ... hinzugefügt werden, jedoch nach dem Typnamen (falls vorhanden). Betrachten Sie dieses Beispiel:

class Foo{}
function a(Foo &...$foos){
    $i = 0;
    foreach($a as &$foo){ // note the &
        $foo = $i++;
    }
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);

Ausgabe:

int(0)
int(1)
int(1)

Auf der anderen Seite wird ein Array (oder Traversable ) des Arguments kann in Form einer Parameterliste an eine Funktion übergeben wird ausgepackt werden:

var_dump(...hash_algos());

Ausgabe:

string(3) "md2"
string(3) "md4"
string(3) "md5"
...

Vergleichen Sie mit diesem Ausschnitt ohne Verwendung von ... :

var_dump(hash_algos());

Ausgabe:

array(46) {
  [0]=>
  string(3) "md2"
  [1]=>
  string(3) "md4"
  ...
}

Daher können Weiterleitungsfunktionen für verschiedene Funktionen jetzt einfach erstellt werden, zum Beispiel:

public function formatQuery($query, ...$args){
    return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}

Neben Arrays können auch Traversable s wie Iterator (insbesondere viele seiner Unterklassen von SPL) verwendet werden. Zum Beispiel:

$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304

Wenn der Iterator unendlich oft wiederholt wird:

$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);

Verschiedene PHP-Versionen verhalten sich unterschiedlich:

  • Von PHP 7.0.0 bis PHP 7.1.0 (Beta 1):
    • Ein Segmentierungsfehler wird auftreten
    • Der PHP-Prozess wird mit Code 139 beendet
  • In PHP 5.6:
    • Ein schwerwiegender Fehler der Speicherbelegung ("zulässige Speichergröße von% d Byte erschöpft") wird angezeigt.
    • Der PHP-Prozess wird mit Code 255 beendet

Hinweis: HHVM (v3.10 - v3.12) unterstützt das Auspacken von Traversable s nicht. Bei diesem Versuch wird die Warnmeldung "Nur Container dürfen ausgepackt werden" angezeigt.

Funktionsumfang

Variablen innerhalb von Funktionen befinden sich in einem lokalen Bereich wie diesem

$number = 5
function foo(){
    $number = 10
    return $number
}

foo(); //Will print 10 because text defined inside function is a local variable


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow