匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。
創建閉包
Example #1 匿名函數變量賦值示例(http://laravelacademy.org/post/4341.html)
<?php $fun = function($name){ printf("Hello %s\r\n",$name); }; echo $fun('Tinywan'); echo $fun('Github');
打印結果:
Tinywan
Github
閉包和普通的PHP函數很像:常用的句法相同,也接受參數,而且能返回值。不過閉包沒有函數名。
注:我們之所以能調用$greet變量,是因為這個變量的值是一個閉包,而且閉包對象實現了__invoke()魔術方法,只要變量名后有(),PHP就會查找並調用__invoke方法。
我們通常把PHP閉包當做函數會方法的回調使用,事實上,很多PHP函數都會用到閉包,比如array_map和preg_replace_callback,這是使用PHP匿名函數的絕佳時機。記住,閉包和其他值一樣,可以作為參數傳入其他PHP函數:
$numberPlusOne = array_map(function ($number) { return $number +=1; }, [1, 2, 3]); print_r($numberPlusOne);
function demo1(){ function a(){ echo 'a Function'."\r\n"; } function b(){ echo 'b Function'; } }
//a() 這樣是不可以的,直接報錯 demo1(); //demo()1調用了,a()函數就可以調用了, a();
在函數內部定義一個匿名函數,同時使用匿名函數,(這可不是閉包哦!!)
function funDemo(){ $demo = function($str){ echo $str; }; //調用匿名函數,在這里調用是OK的! $demo('Tinywan'); } funDemo(); //OK! $demo('Github'); //嘗試調用匿名函數,發生錯誤!
錯誤信息:
Fatal error: Uncaught Error: Function name must be a string in E:\wamp64\www\php-net\function\Example#2.php on line 32 Error: Function name must be a string in E:\wamp64\www\php-net\function\Example#2.php on line 32
function funDemo(){ $str1 = 100; //外部函數變量 $str2 = 200; //閉包可以從父作用域中繼承變量。 任何此類變量都應該用 use 語言結構傳遞進去。 $demo = function() use ($str1,$st){ echo $str1."\r\n"; echo $str2; }; $demo("Tinywan"); } funDemo(); //OK!
打印結果:100 200