Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung von Schließungen in PHP (mit detaillierten Beispielen)

Ausführliche Erklärung von Schließungen in PHP (mit detaillierten Beispielen)

王林
王林nach vorne
2019-08-29 17:07:113098Durchsuche

Anonyme Funktion

Wenn es um Abschlüsse geht, müssen Sie an anonyme Funktionen denken, die auch Abschlussfunktionen (Abschlüsse) genannt werden. Es scheint, dass die PHP-Abschlussimplementierung hauptsächlich darauf basiert. Die Deklaration einer anonymen Funktion sieht folgendermaßen aus:

$func = function() {

 }; //带结束符

Da die anonyme Funktion keinen Namen hat, müssen Sie sie an eine Variable zurückgeben, wenn Sie sie verwenden möchten. Anonyme Funktionen können auch Parameter wie gewöhnliche Funktionen deklarieren, und die aufrufende Methode ist auch dieselbe:

$func = function( $param ) {
    echo $param;
};$func( 'some string' );
 //输出:
 //some string

Übrigens gab es vor der Einführung von Schließungen durch PHP auch eine Funktion, die anonyme Funktionen erstellen konnte: Funktion erstellen, aber Die Codelogik besteht nur aus Es kann als Zeichenfolge geschrieben werden, was unklar und schwer zu pflegen aussieht und daher nur von wenigen Menschen verwendet wird.

Abschlüsse implementieren

Anonyme Funktionen als Parameter in gewöhnlichen Funktionen übergeben und auch zurückgegeben werden können. Dies implementiert einen einfachen Verschluss.

//例一
//在函数里定义一个匿名函数,并且调用它
function printStr() {
    $func = function( $str ) {
        echo $str;
    };
    $func( 'some string' );
}printStr();
  
//例二
//在函数中把匿名函数返回,并且调用它
function getPrintStrFunc() {
    $func = function( $str ) {
        echo $str;
    };
    return $func;
}
$printStrFunc = getPrintStrFunc();
$printStrFunc( 'some string' );
  
 
//例三
//把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
    $func( 'some string' );
}
$printStrFunc = function( $str ) {
    echo $str;
};
callFunc( $printStrFunc );
//也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( function( $str ) {
    echo $str;
} );

Schlüsselwörter, die Abschlüsse und externe Variablen verbinden: USE

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}getMoney();
//输出:
//1
//报错,找不到dorllar变量

Abschlüsse können einige Variablen und Werte im Kontext des Codeblocks speichern, in dem sie sich befinden. Standardmäßig können anonyme Funktionen in PHP keine Kontextvariablen in dem Codeblock aufrufen, in dem sie sich befinden, sondern müssen das Schlüsselwort use verwenden. Schauen wir uns ein weiteres Beispiel an:

Wie Sie sehen, ist Dollar nicht im Schlüsselwort use deklariert und kann daher in dieser anonymen Funktion nicht abgerufen werden. Daher sollten Sie bei der Entwicklung auf dieses Problem achten.
Einige Leute fragen sich vielleicht, ob es möglich ist, Kontextvariablen in einer anonymen Funktion zu ändern, aber ich habe festgestellt, dass dies nicht möglich ist:

function getMoney() {
    $rmb = 1;
    $func = function() use ( $rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}getMoney();
//输出:
//1
//1

Ah, es stellt sich heraus, dass sich die Verwendung nur auf eine Kopie der bezieht variabel. Aber ich möchte einen vollständigen Verweis auf die Variable, keine Kopie. Um diesen Effekt zu erzielen, fügen Sie einfach ein &-Symbol vor der Variablen hinzu:

function getMoney() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}getMoney();
//输出:
//1
//2

Okay, damit die anonyme Funktion auf die Kontextvariable verweisen kann. Wenn die anonyme Funktion an die Außenwelt zurückgegeben wird, speichert die anonyme Funktion die durch die Verwendung referenzierten Variablen, die Außenwelt kann diese Variablen jedoch nicht abrufen. Auf diese Weise ist das Konzept des „Schließens“ möglicherweise klarer.

function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();
//输出:
//1
//2
//3

Zusammenfassung:

Die Eigenschaften von PHP-Verschlüssen sind nicht allzu überraschend. Tatsächlich können ähnliche oder sogar viel leistungsfähigere Funktionen durch die Verwendung von CLASS erreicht werden, geschweige denn mit js Im Vergleich zu Schließungen können wir uns in Zukunft nur auf Verbesserungen bei der Schließungsunterstützung von PHP freuen. Allerdings sind anonyme Funktionen immer noch sehr nützlich, wenn Sie beispielsweise Funktionen wie preg_replace_callback verwenden, müssen Sie keine Callback-Funktion extern deklarieren.

Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website: PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von Schließungen in PHP (mit detaillierten Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen