検索
ホームページphp教程php手册php中的匿名函数和闭包(closure)

这个是我在博客园上写的一篇文章,我的博客园blog地址:http://www.cnblogs.com/starlion 一:匿名函数 ( 在php5.3.0 或以上才能使用 ) php中的匿名函数(Anonymous functions), 也叫闭包函数( closures ), 允许指定一个没有名称的函数。最常用的就是回调函

这个是我在博客园上写的一篇文章,我的博客园blog地址:http://www.cnblogs.com/starlion

一:匿名函数 (在php5.3.0 或以上才能使用)

     php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数。最常用的就是回调函数的参数值。(http://php.net/manual/zh/functions.anonymous.php)

     匿名函数的定义:

<span>$closureFunc</span> = <span>function</span><span>(){

    </span>....<span>

 };</span>

   eg: 把匿名函数赋值给变量,通过变量来调用

php中的匿名函数和闭包(closure)

 <span>$closureFunc</span> = <span>function</span>(<span>$str</span><span>){

   </span><span>echo</span> <span>$str</span><span>;

  };

  </span><span>$closureFunc</span>("hello world!");

php中的匿名函数和闭包(closure)

  输出: hello world!

 

二:闭包

 2.1  将匿名函数放在普通函数中,也可以将匿名函数返回,这就构成了一个简单的闭包 

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc1(){
    </span><span>$func</span> = <span>function</span><span>(){
        </span><span>echo</span> "hello"<span>;
    };
    </span><span>$func</span><span>();
}
closureFunc1();
</span><span>//</span><span>输出: hello</span>

php中的匿名函数和闭包(closure)

2.2  在匿名函数中引用局部变量

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc2(){
    </span><span>$num</span> = 1<span>;
    </span><span>$func</span> = <span>function</span><span>(){
        </span><span>echo</span> <span>$num</span><span>;
    };
    </span><span>$func</span><span>();
}
closureFunc2();
</span><span>//</span><span>Notice: Undefined variable: num</span>

php中的匿名函数和闭包(closure)

上面的函数运行后,会报Notice错误,说明我们不能在匿名函数中这样使用局部变量,这时候就要引用一个php的关键字 use, 代码如下

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc2(){
    </span><span>$num</span> = 1<span>;
    </span><span>$func</span> = <span>function</span>() <span>use</span>(<span>$num</span><span>){
        </span><span>echo</span> <span>$num</span><span>;
    };
    </span><span>$func</span><span>();
}
closureFunc2();
</span><span>//</span><span>输出: 1</span>

php中的匿名函数和闭包(closure)

 2.3  返回匿名函数

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc3(){
    </span><span>$num</span> = 1<span>;
    </span><span>$func</span> = <span>function</span>() <span>use</span>(<span>$num</span><span>){
        </span><span>echo</span> <span>$num</span><span>;
    };
    </span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc3(); //函数返回匿名函数
</span><span>$func</span><span>(); //然后我们在用$func() 调用
</span><span>//</span><span>输出: 1</span>

php中的匿名函数和闭包(closure)

2.4 当我们在返回匿名函数时候怎么给匿名函数传参呢? 其实跟普通函数传参数一样

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc4(){
    </span><span>$num</span> = 1<span>;
    </span><span>$func</span> = <span>function</span>(<span>$str</span>) <span>use</span>(<span>$num</span><span>){
        </span><span>echo</span> <span>$num</span><span>;
        </span><span>echo</span> "\n"<span>;
        </span><span>echo</span> <span>$str</span><span>;
    };
    </span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc4();
</span><span>$func</span>("hello, closure4"<span>);
</span><span>//</span><span>输出:
//1
//hello, closure4</span>

php中的匿名函数和闭包(closure)

2.5 怎么用闭包来改变上下文引用的变量值?

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc5(){
    </span><span>$num</span> = 1<span>;
    </span><span>$func</span> = <span>function</span>() <span>use</span>(<span>$num</span><span>) {
        </span><span>echo</span> "\n"<span>;
        </span><span>$num</span>++<span>;
        </span><span>echo</span> <span>$num</span><span>;
    };
    </span><span>echo</span> "\n"<span>;
    </span><span>echo</span> <span>$num</span><span>;
    </span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc5();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>//</span><span>输出:
// 1
// 2
// 2
// 2</span>

php中的匿名函数和闭包(closure)

看上面的输入结果,显然没有达到目的, 其实只要加一个 & 引用符号就可以了

php中的匿名函数和闭包(closure)

<span>function</span><span> closureFunc5(){
    </span><span>$num</span> = 2<span>;
    </span><span>$func</span> = <span>function</span>() <span>use</span>(&<span>$num</span><span>) {
        </span><span>echo</span> "\n"<span>;
        </span><span>$num</span>++<span>;
        </span><span>echo</span> <span>$num</span><span>;
    };
    </span><span>echo</span> "\n"<span>;
    </span><span>echo</span> <span>$num</span><span>;
    </span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc5();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>//</span><span>输出:
// 2
// 3
// 4
// 5</span>

php中的匿名函数和闭包(closure)

2.6 把匿名函数当作参数传递

php中的匿名函数和闭包(closure)

<span>function</span> callFunc(<span>$func</span><span>){
    </span><span>$func</span>("argv"<span>);
}

callFunc(</span><span>function</span>(<span>$str</span><span>){
    </span><span>echo</span> <span>$str</span><span>;
})
</span><span>//</span><span>输出:
// argv</span>

php中的匿名函数和闭包(closure)

 

参考:

http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html 为什么要引入闭包

http://blog.csdn.net/lgg201/article/details/6127564  php 5.3.0 的function() use() {}

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、