匿名函數,也叫閉包函數(closures) ,容許臨時建立一個沒有制定名稱的函數。最經常使用做回調函數(callback)參數的值。php
閉包函數也能夠做爲變量的值來使用。PHP將會自動把此種表達式轉換成內置類 Closure 的對象實例。把一個 Closure 對象賦值給一個變量的方式與普通變量賦值的語法同樣,最後也要加上分號。閉包
匿名函數變量賦值實例:
<?php
$printString = function($arg){
echo $arg;
};函數
$printString('hello world');
//輸出 hello world對象
閉包函數繼承父做用域中的變量。任何此類變量都應該用 use 語言結構傳遞進去。繼承
從父做用域繼承變量:
<?php
//定義變量
$message = 'hello world';
//匿名函數變量賦值
$example = function(){
var_dump($message);
};
//執行後輸出 Notice: Undefined variable
$example();作用域
在未使用關鍵字use 時,PHP不能在匿名函數中調用所在代碼上下文變量。
<?php
//定義變量
$message = 'hello';
//匿名函數繼承父做用域的變量($message)
$example = function() use ($message){
var_dump($message);
};
//輸出 string 'hello' (length=5)
echo $example();
//一樣輸出 string 'hello' (length=5)
$message = 'world';
echo $example();回調函數
使用關鍵字use時,PHP能夠在調用匿名函數中調用所在代碼上下文的變量,但爲何第二次調用沒有發生變化哪?
是由於匿名函數能夠保存所在代碼塊上下文的一些變量和值(即:閉包函數將會保存第一次繼承的父做用域的變量和值),值傳遞只是傳遞繼承父做用域中變量和值的一個副本。string
要想改變父做用域的值並體如今匿名函數調用中,該怎麼辦哪?
咱們要用引用傳遞(即:在變量前面添加&),以下所示:
<?php
//定義變量
$message = 'hello';
//匿名函數繼承父做用域的變量($message)
$example = function() use (&$message){
var_dump($message);
};
//輸出 string 'hello' (length=5)
echo $example();
//輸出 string 'world' (length=5)
$message = 'world';
echo $example();io
一樣閉包函數也能夠接受常規參數的傳遞,以下所示:function
<?php//定義變量$message = 'hello';$message2 = 'hello2';//匿名函數繼承父做用域的變量($message)$example = function($arg) use (&$message2, $message){ var_dump($message2 . ' ' . $message . ' ' . $arg);};echo $example('world');$message2 = 'world';//輸出 string 'hello world' (length=11)echo $example('world');