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

元の投稿アドレスの転載: 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></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 までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。