PHP的学习–PHP的闭包
php的闭包(Closure)也就是匿名函数,是PHP5.3引入的。
闭包的语法很简单,需要注意的关键字就只有use,use是连接闭包和外界变量。
<span style="color: #800080">$a</span> = <span style="color: #0000ff">function</span>() <span style="color: #0000ff">use</span>(<span style="color: #800080">$b</span>) {}
简单例子如下:
<span style="color: #0000ff">function</span> <span style="color: #0000ff">callback</span>(<span style="color: #800080">$fun</span><span style="color: #000000">) {</span><span style="color: #800080">$fun</span><span style="color: #000000">();}</span><span style="color: #800080">$msg</span> = "Hello, everyone"<span style="color: #000000">;</span><span style="color: #800080">$fun</span> = <span style="color: #0000ff">function</span> () <span style="color: #0000ff">use</span>(<span style="color: #800080">$msg</span><span style="color: #000000">) {</span><span style="color: #0000ff">print</span> "This is a closure use string value, msg is: <span style="color: #800080">$msg</span>. <br />/n"<span style="color: #000000">;};</span><span style="color: #800080">$msg</span> = "Hello, everybody"<span style="color: #000000">;</span><span style="color: #0000ff">callback</span>(<span style="color: #800080">$fun</span>);
结果是:This is a closure use string value, msg is: Hello, everyone.
/n
在PHP新开放的闭包语法中, 我们用use来使用闭包外部定义的变量的。这里我们使用了外部变量$msg,定义完之后,又对其本#文来源gaodai$ma#com搞$$代**码网$值进行了改变,闭包被执行后输出的是原始值。以传值方式传递的基础类型参数,闭包use的值在闭包创建是就确定了。
小应用如下:
<span style="color: #008000">/*</span><span style="color: #008000">* * 一个利用闭包的计数器产生器 * 这里其实借鉴的是python中介绍闭包时的例子... * 我们可以这样考虑: * 1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1. * 2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用. * 3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用, * 它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的 * 变量. * 4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的. * 5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器. * 结论: 此函数可以用来生成相互独立的计数器. </span><span style="color: #008000">*/</span> <span style="color: #0000ff">function</span><span style="color: #000000"> counter() { </span><span style="color: #800080">$counter</span> = 1<span style="color: #000000">; </span><span style="color: #0000ff">return</span> <span style="color: #0000ff">function</span>() <span style="color: #0000ff">use</span>(&<span style="color: #800080">$counter</span>) {<span style="color: #0000ff">return</span> <span style="color: #800080">$counter</span> ++<span style="color: #000000">;}; } </span><span style="color: #800080">$counter1</span> =<span style="color: #000000"> counter(); </span><span style="color: #800080">$counter2</span> =<span style="color: #000000"> counter(); </span><span style="color: #0000ff">echo</span> "counter1: " . <span style="color: #800080">$counter1</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter1: " . <span style="color: #800080">$counter1</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter1: " . <span style="color: #800080">$counter1</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter1: " . <span style="color: #800080">$counter1</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter2: " . <span style="color: #800080">$counter2</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter2: " . <span style="color: #800080">$counter2</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter2: " . <span style="color: #800080">$counter2</span>() . "<br />/n"<span style="color: #000000">; </span><span style="color: #0000ff">echo</span> "counter2: " . <span style="color: #800080">$counter2</span>() . "<br />/n"<span style="color: #000000">; </span>?>