Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in PHP-Verschlüsse (Closure)

Einführung in PHP-Verschlüsse (Closure)

不言
不言Original
2018-07-04 17:10:352086Durchsuche

Dieser Artikel stellt hauptsächlich die Einführung des PHP-Abschlusses (Closure) vor, der einen gewissen Referenzwert hat. Jetzt kann ich ihn mit allen teilen, die ihn brauchen.

Anonyme Funktion

Wenn es um Abschlüsse geht, müssen wir an anonyme Funktionen denken, die auch Abschlussfunktionen (Abschlüsse) genannt werden. Es scheint, dass die PHP-Abschlussimplementierung hauptsächlich darauf beruht. 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.

Im Folgenden finden Sie drei Beispiele

//例一
//在函数里定义一个匿名函数,并且调用它
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

Abschlüsse können einige Variablen und Werte im Kontext des Codes speichern Block, in dem sie sich befinden. Standardmäßig können anonyme Funktionen in PHP nicht die Kontextvariablen des Codeblocks aufrufen, in dem sie sich befinden, sondern müssen das Schlüsselwort use verwenden.

Sehen wir uns ein weiteres Beispiel an:

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}
getMoney();

//输出:
//1
//报错,找不到dorllar变量

Wie Sie sehen, ist Dollar nicht im Schlüsselwort use deklariert und kann in dieser anonymen Funktion nicht abgerufen werden, daher sollten Sie darauf achten während der Entwicklung.

Einige Leute fragen sich vielleicht, ob es möglich ist, die 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 auf Variablen bezieht Nur eine Kopie. 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.

Ändern Sie das obige Beispiel gemäß der Beschreibung:

function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}

$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();

//输出:
//1
//2
//3

Zusammenfassung

Es gibt keine große Überraschung über die Eigenschaften von PHP-Verschlüssen. Tatsächlich können Sie CLASS verwenden, um dies zu erreichen Ähnliche oder sogar leistungsfähigere Ergebnisse können nicht mit der Schließung von js verglichen werden. Wir können uns nur auf die Verbesserung der Schließungsunterstützung in Zukunft 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.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Einführung in die asynchrone Ausführung von PHP-Skripten

Grundlagen der PHP-Implementierung von AOP

Das obige ist der detaillierte Inhalt vonEinführung in PHP-Verschlüsse (Closure). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn