ホームページ バックエンド開発 PHPチュートリアル PHP 53 の新しいクロージャー構文では、関数 use {} jquery 関数、目的関数、尤度関数が導入されています。

PHP 53 の新しいクロージャー構文では、関数 use {} jquery 関数、目的関数、尤度関数が導入されています。

Jul 29, 2016 am 08:53 AM
function

元の投稿アドレスの転載: http://blog.csdn.net/lgg201/article/details/6127564

<code><span><span><span><?php</span><span><span>function</span><span>callback</span><span>(<span>$callback</span>)</span> {</span><span>$callback</span>();
}
<span>//输出: This is a anonymous function.<br />/n</span><span>//这里是直接定义一个匿名函数进行传递, 在以往的版本中, 这是不可用的.</span><span>//现在, 这种语法非常舒服, 和<a href='http://lib.csdn.net/base/18' title='JavaScript知识库' target='_blank'>javascript</a>语法基本一致, 之所以说基本呢, 需要继续向下看</span><span>//结论: 一个舒服的语法必然会受欢迎的.</span>
callback(<span><span>function</span><span>()</span> {</span><span>print</span><span>"This is a anonymous function.<br />/n"</span>;
});
<span>//输出: This is a closure use string value, msg is: Hello, everyone.<br />/n</span><span>//这里首先定义了一个闭包, 这次户口本上有名字了...</span><span>//use, 一个新鲜的家伙...</span><span>//众所周知, 闭包: 内部函数使用了外部函数中定义的变量.</span><span>//在PHP新开放的闭包语法中, 我们就是用use来使用闭包外部定义的变量的.</span><span>//这里我们使用了外部变量$msg, 定义完之后, 又对其值进行了改变, 闭包被执行后输出的是原始值</span><span>//结论: 以传值方式传递的基础类型参数, 闭包use的值在闭包创建是就确定了.</span><span>$msg</span> = <span>"Hello, everyone"</span>;
<span>$callback</span> = <span><span>function</span><span>()</span><span>use</span><span>(<span>$msg</span>)</span> {</span><span>print</span><span>"This is a closure use string value, msg is: $msg. <br />/n"</span>;
};
<span>$msg</span> = <span>"Hello, everybody"</span>;
callback(<span>$callback</span>);
<span>//输出: This is a closure use string value lazy bind, msg is: Hello, everybody.<br />/n</span><span>//换一种引用方式, 我们使用引用的方式来use</span><span>//可以发现这次输出是闭包定义后的值...</span><span>//这个其实不难理解, 我们以引用方式use, 那闭包use的是$msg这个变量的地址</span><span>//当后面对$msg这个地址上的值进行了改变之后, 闭包内再输出这个地址的值时, 自然改变了.</span><span>$msg</span> = <span>"Hello, everyone"</span>;
<span>$callback</span> = <span><span>function</span><span>()</span><span>use</span><span>(&<span>$msg</span>)</span> {</span><span>print</span><span>"This is a closure use string value lazy bind, msg is: $msg. <br />/n"</span>;
};
<span>$msg</span> = <span>"Hello, everybody"</span>;
callback(<span>$callback</span>);
<span>//输出: This is a closure use object, msg is: Hello, everyone.<br />/n</span><span>//闭包中输出的是之前被拷贝的值为Hello, everyone的对象, 后面是对$obj这个名字的一个重新赋值.</span><span>//可以这样考虑</span><span>//1. obj是对象Hello, everyone的名字</span><span>//2. 对象Hello, everyone被闭包use, 闭包产生了一个对Hello, everyone对象的引用</span><span>//3. obj被修改为Hello, everybody这个对象的名字</span><span>//4. 注意, 是名字obj代表的实体变了, 而不是Hello, everyone对象, 那自然闭包的输出还是前面的Hello, everyone</span><span>$obj</span> = (object) <span>"Hello, everyone"</span>;
<span>$callback</span> = <span><span>function</span><span>()</span><span>use</span><span>(<span>$obj</span>)</span> {</span><span>print</span><span>"This is a closure use object, msg is: {$obj->scalar}. <br />/n"</span>;
};
<span>$obj</span> = (object) <span>"Hello, everybody"</span>;
callback(<span>$callback</span>);
<span>//输出: This is a closure use object, msg is: Hello, everybody.<br />/n</span><span>//还是按照上面的步骤, 按部就班的来吧:</span><span>//1. obj名字指向Hello, everyone对象</span><span>//2. 闭包产生一个引用指向Hello, everyone对象</span><span>//3. 修改obj名字指向的对象(即Hello, everyone对象)的scalar值</span><span>//4. 执行闭包, 输出的自然是Hello, everybody, 因为其实只有一个真正的对象</span><span>$obj</span> = (object) <span>"Hello, everyone"</span>;
<span>$callback</span> = <span><span>function</span><span>()</span><span>use</span><span>(<span>$obj</span>)</span> {</span><span>print</span><span>"This is a closure use object, msg is: {$obj->scalar}. <br />/n"</span>;
};
<span>$obj</span>->scalar = <span>"Hello, everybody"</span>;
callback(<span>$callback</span>);
<span>//输出: This is a closure use object lazy bind, msg is: Hello, everybody.<br />/n</span><span>//闭包引用的是什么呢? &$obj, 闭包产生的引用指向$obj这个名字所指向的地址.</span><span>//因此, 无论obj怎么变化, 都是逃不脱的....</span><span>//所以, 输出的就是改变后的值</span><span>$obj</span> = (object) <span>"Hello, everyone"</span>;
<span>$callback</span> = <span><span>function</span><span>()</span><span>use</span><span>(&<span>$obj</span>)</span> {</span><span>print</span><span>"This is a closure use object lazy bind, msg is: {$obj->scalar}. <br />/n"</span>;
};
<span>$obj</span> = (object) <span>"Hello, everybody"</span>;
callback(<span>$callback</span>);
<span>/**
 * 一个利用闭包的计数器产生器
 * 这里其实借鉴的是<a href='http://lib.csdn.net/base/11' title='Python知识库' target='_blank'>python</a>中介绍闭包时的例子...
 * 我们可以这样考虑:
 *      1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1.
 *      2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用.
 *      3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用, 
 *          它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的
 *          变量.
 *      4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的.
 *      5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器.
 * 结论: 此函数可以用来生成相互独立的计数器.
 */</span><span><span>function</span><span>counter</span><span>()</span> {</span><span>$counter</span> = <span>1</span>;
    <span>return</span><span><span>function</span><span>()</span><span>use</span><span>(&<span>$counter</span>)</span> {</span><span>return</span><span>$counter</span> ++;};
}
<span>$counter1</span> = counter();
<span>$counter2</span> = counter();
<span>echo</span><span>"counter1: "</span> . <span>$counter1</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter1: "</span> . <span>$counter1</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter1: "</span> . <span>$counter1</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter1: "</span> . <span>$counter1</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter2: "</span> . <span>$counter2</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter2: "</span> . <span>$counter2</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter2: "</span> . <span>$counter2</span>() . <span>"<br />/n"</span>;
<span>echo</span><span>"counter2: "</span> . <span>$counter2</span>() . <span>"<br />/n"</span>;
<span>?></span></span></span></code>
ログイン後にコピー
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

上記は、PHP 53 の新しいクロージャ構文関数 use {} を関数の内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

機能とはどういう意味ですか? 機能とはどういう意味ですか? Aug 04, 2023 am 10:33 AM

ファンクションとは、関数を意味します。これは、特定の関数を備えた再利用可能なコード ブロックです。プログラムの基本コンポーネントの 1 つです。入力パラメータを受け取り、特定の操作を実行し、結果を返すことができます。その目的は、再利用可能なコード ブロックをカプセル化することです。コードの再利用性と保守性を向上させるコード。

Python の「enumerate()」関数の目的は何ですか? Python の「enumerate()」関数の目的は何ですか? Sep 01, 2023 am 11:29 AM

この記事では、Python の enumerate() 関数と「enumerate()」関数の目的について学びます。 enumerate() 関数とは何ですか? Python の enumerate() 関数は、データ コレクションをパラメータとして受け取り、列挙オブジェクトを返します。列挙オブジェクトはキーと値のペアとして返されます。キーは各項目に対応するインデックス、値は項目です。構文 enumerate(iterable,start) パラメータ iterable - 渡されたデータ コレクションは、iterablestart と呼ばれる列挙オブジェクトとして返すことができます。 - 名前が示すように、列挙オブジェクトの開始インデックスは start によって定義されます。無視したら

MySQL.procテーブルの役割と機能の詳しい説明 MySQL.procテーブルの役割と機能の詳しい説明 Mar 16, 2024 am 09:03 AM

MySQL.proc テーブルの役割と機能の詳細な説明。MySQL は人気のあるリレーショナル データベース管理システムです。開発者が MySQL を使用する場合、多くの場合、ストアド プロシージャ (StoredProcedure) の作成と管理が必要になります。 MySQL.proc テーブルは非常に重要なシステム テーブルであり、ストアド プロシージャの名前、定義、パラメータなど、データベース内のすべてのストアド プロシージャに関連する情報が保存されます。この記事では、MySQL.proc テーブルの役割と機能について詳しく説明します。

Vue.use関数の使い方と機能 Vue.use関数の使い方と機能 Jul 24, 2023 pm 06:09 PM

Vue の使い方と機能.use Function Vue は、多くの便利な機能を提供する人気のフロントエンド フレームワークです。その 1 つは Vue.use 関数で、これを使用すると Vue アプリケーションでプラグインを使用できるようになります。この記事では、Vue.use 関数の使い方と機能を紹介し、いくつかのコード例を示します。 Vue.use 関数の基本的な使用法は非常に簡単です。Vue がインスタンス化される前に関数を呼び出し、使用するプラグインをパラメータとして渡すだけです。簡単な例を次に示します。 // プラグインの導入と使用

PHPのclearstatcache()関数 PHPのclearstatcache()関数 Sep 07, 2023 am 09:33 AM

clearstatcache() 関数は、ファイル ステータス キャッシュをクリアするために使用されます。 PHP は、次の関数によって返された情報をキャッシュします。 -stat()lstat()file_exists()is_writable()is_readable()is_executable()is_file()is_dir()filegroup()fileowner()filesize()filetype()fileperms()より良いパフォーマンスを提供するため。構文 voidclearstatecache() パラメータ NA 戻り値 clearstatcache(

PHP の file_exists() 関数 PHP の file_exists() 関数 Sep 14, 2023 am 08:29 AM

file_exists メソッドは、ファイルまたはディレクトリが存在するかどうかを確認します。チェックするファイルまたはディレクトリのパスを引数として受け取ります。これは、ファイルを処理する前に存在するかどうかを知る必要がある場合に役立ちます。これにより、新しいファイルを作成するときに、この関数を使用してファイルがすでに存在するかどうかを確認できます。構文 file_exists($file_path) パラメータ file_path - 存在をチェックするファイルまたはディレクトリのパスを設定します。必須。 return file_exists() メソッドが戻ります。ファイルまたはディレクトリが存在する場合は TrueFalse を返し、ファイルまたはディレクトリが存在しない場合は TrueFalse を返します。 例として、「candidate.txt」ファイルのチェックを見てみましょう。

js関数の使い方は何ですか js関数の使い方は何ですか Oct 07, 2023 am 11:25 AM

js関数関数の使い方は、1. 関数の宣言、2. 関数の呼び出し、3. 関数のパラメータ、4. 関数の戻り値、5. 無名関数、6. パラメータとしての関数、7. 関数のスコープ、8. 再帰関数です。

PHP で SOA 関数を使用する方法 PHP で SOA 関数を使用する方法 May 18, 2023 pm 01:10 PM

インターネットの発展に伴い、SOA (サービス指向アーキテクチャ) は、今日のエンタープライズ レベルのシステムにおける重要な技術アーキテクチャになりました。 SOA アーキテクチャのサービスは再利用、再編成、拡張が可能であると同時に、システム開発とメンテナンスのプロセスも簡素化されます。広く使用されている Web プログラミング言語として、PHP は SOA を実装するための関数ライブラリもいくつか提供しています。次に、PHP で SOA 関数を使用する方法を詳しく説明します。 1. SOA の基本概念 SOA は分散システム開発の考え方とアーキテクチャです。

See all articles