検索
ホームページバックエンド開発PHPチュートリアルClosure を使用して PHP で匿名関数を作成する方法の概要

Closure を使用して PHP で匿名関数を作成する方法の概要

クロージャ クラス

匿名関数を表すために使用されるクラス。

匿名関数 (PHP 5.3 で導入) は、このタイプのオブジェクトを生成します。以前は、このクラスは実装の詳細とみなされていましたが、現在はこのクラスに依存して何かを行うことができます。 PHP 5.4 以降、このクラスには、作成後の匿名関数をより詳細に制御できるメソッドが付属しています。

このクラスはインスタンス化できません。このクラスには 2 つの主要なメソッドがあり、どちらもクロージャをコピーするために使用されます。1 つは静的メソッド、もう 1 つは動的メソッドです。これらの 2 つの理解しにくいメソッドについて詳しく説明します。下に。

Closure::bind

public static Closure Closure::bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] )

参数说明:
closure
需要绑定的匿名函数。

newthis
需要绑定到匿名函数的对象,或者 NULL 创建未绑定的闭包。

newscope
想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 
私有、保护方法 的可见性。 The class scope to which associate the closure is to be associated, or 'static' to keep the 
current one. If an object is given, the type of the object will be used instead. This determines the visibility of 
protected and private methods of the bound object.

パラメータの説明:

  • クロージャは匿名でバインドする必要があります関数。

  • newこれには、匿名関数にバインドされたオブジェクト、または非バインド クロージャを作成するには NULL が必要です。

  • newscope はクロージャのクラス スコープにバインドされる必要があります。または、「静的」は変更がないことを意味します。オブジェクトが渡された場合は、オブジェクトの型名が使用されます。クラス スコープは、クロージャ内の $this オブジェクトのプライベートな保護されたメソッドの可視性を決定するために使用されます。

クロージャを関連付けるクラス スコープ、または

現在のものを保持する 'static' オブジェクトが指定された場合、代わりにオブジェクトのタイプが使用されます。これにより、バインドされたオブジェクトの

protected メソッドとプライベート メソッドの可視性が決定されます。

上記はメソッドの定義です。

最初のパラメータはクロージャ関数なので分かりやすいですが、

2 番目のパラメータは分かりにくいです。コピーするクロージャに $this が含まれている場合、thisオブジェクトは、この $this を表します。クロージャ関数でのこのオブジェクトへの変更は、属性の変更など、呼び出し完了後も一貫性が保たれます。

3 番目のパラメータはそれほど簡単ではありませんデフォルトのパラメータでは、object $newthis の属性関数にアクセスするために $this-> を呼び出すと、制限があります。 public 属性を持つ関数にのみアクセスできます。protected/private 属性にアクセスしたい場合は、クラス内と同様に、対応するクラス名/クラス インスタンスに設定する必要があります。 、そのクラスの protected/private 属性関数にアクセスします。

<?php
class T {
    private function show()
    {
        echo "我是T里面的私有函数:show\n";
    }

    protected  function who()
    {
        echo "我是T里面的保护函数:who\n";
    }

    public function name()
    {
        echo "我是T里面的公共函数:name\n";
    }
}

$test = new T();

$func = Closure::bind(function(){
    $this->who();
    $this->name();
    $this->show();
}, $test);

$func();

上記のコードはエラーを報告します致命的エラー: キャッチされないエラー: コンテキスト 'Closure から保護されたメソッド T::who() を呼び出します###。 bind の 3 番目のパラメータを t::class または new T() に追加すると、それぞれの結果が正常に出力されます。

我是T里面的保护函数:who
我是T里面的公共函数:name
我是T里面的私有函数:show

もちろん、クロージャはパラメータを渡すこともできます

$test = new StdClass();
var_dump($test);

$func = Closure::bind(function($obj){
    $obj->name = "燕睿涛";
}, null);

$func($test);
var_dump($test);

上記のプログラムは匿名関数と同じであり、どのオブジェクトにも依存しません。上記のプログラムは出力します:

object(stdClass)#1 (0) {
}
object(stdClass)#1 (1) {
  ["name"]=>
  string(9) "燕睿涛"
}

説明が必要な特別な例もあります

<?php
class T {
    private function show()
    {
        echo "我是T里面的私有函数:show\n";
    }

    protected  function who()
    {
        echo "我是T里面的保护函数:who\n";
    }

    public function name()
    {
        echo "我是T里面的公共函数:name\n";
    }
}

$func = Closure::bind(function ($obj) {
    $obj->show();
}, null);

$test = new T();

$func($test);

上記の状況では何が出力されますか? はい、プライベート属性にアクセスできないことを示すエラーが報告されます

show . このとき、3 番目のパラメータを追加します パラメータは 1 つだけで十分です。3 番目のパラメータが $this のスコープに影響を与えるだけでなく、 がパラメータのスコープにも影響を与える可能性があることがわかります。

Closure::bindTo

bindTo には bind と同様の関数があります。ここでは単にもう 1 つ どちらの形式でも 現在のクロージャ オブジェクトをコピーし、指定された $this オブジェクトとクラス スコープをバインドします。 、最初のパラメータは bind より小さい、最後の 2 つは同じです。もちろん、
bindTo は静的メソッドではなく、存在するという別の違いがあります。プロパティメソッドのクロージャーのためだけです。

<?php
class T {
    private function show()
    {
        echo "我是T里面的私有函数:show\n";
    }

    protected  function who()
    {
        echo "我是T里面的保护函数:who\n";
    }

    public function name()
    {
        echo "我是T里面的公共函数:name\n";
    }
}

$func = function () {
    $this->show();
    $this->who();
    $this->name();
};

$funcNew = $func->bindTo(new T(), T::class);

$funcNew();

上記の関数の出力は、

bind

我是T里面的私有函数:show
我是T里面的保护函数:who
我是T里面的公共函数:name

a と似ています。トリック

この関数は、composer によって生成された自動読み込みソース コードを調べているときに見つかりました。これは、composer で特別な方法で使用されます。以下は、次のコードの一部のインターセプトです。 combos

// 文件autoload_real.php
call_user_func(\Composer\Autoload\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer($loader));

// 文件autoload_static.php
public static function getInitializer(ClassLoader $loader)
{
    return \Closure::bind(function () use ($loader) {
        $loader->prefixLengthsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixLengthsPsr4;
        $loader->prefixDirsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixDirsPsr4;
        $loader->prefixesPsr0 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixesPsr0;
        $loader->classMap = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$classMap;

    }, null, ClassLoader::class);
}

上記のコードはかなり奇妙です。

call_user_func では、間違ったパラメータが渡されているのが第一印象です。実際にはそうではありません。ここで関数が呼び出されます。この関数は Closure オブジェクトを返します。 これは匿名関数であり、渡される最後のパラメータは依然として
callable 型です。返されたクロージャをもう一度見てください。その中で use が使用されています。これはクロージャと外部変数を接続するブリッジです。 なぜここで通常のパラメータを渡すことができるかというと、php5ではオブジェクトの仮パラメータと実パラメータが同じオブジェクトを指しており、関数内でオブジェクトを変更するとオブジェクトの外にも反映されるからです。

つまり、上記のようにしても問題ありません。別の形式もあります。

call_user_func(\Composer\Autoload\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer(), $loader);

public static function getInitializer()
{
    return \Closure::bind(function ($loader) {
        $loader->prefixLengthsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixLengthsPsr4;
        $loader->prefixDirsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixDirsPsr4;
        $loader->prefixesPsr0 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixesPsr0;
        $loader->classMap = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$classMap;

    }, null, ClassLoader::class);
}

概要

私はまだやっていません。ブログを長く続けていると、イライラして落ち着かないこともあれば、書きたいことが見つからないこともあります。それでも落ち着いて、すべてをうまくやり、物事が起こっても動揺せず、広い心を保ち、すべてを冷静に処理する必要があります。

関連チュートリアルの推奨事項: 「PHP チュートリアル

以上がClosure を使用して PHP で匿名関数を作成する方法の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は博客园で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
セッション固定攻撃をどのように防ぐことができますか?セッション固定攻撃をどのように防ぐことができますか?Apr 28, 2025 am 12:25 AM

セッション固定攻撃を防ぐための効果的な方法には、次のものがあります。1。ユーザーがログインした後にセッションIDを再生します。 2。安全なセッションID生成アルゴリズムを使用します。 3。セッションタイムアウトメカニズムを実装します。 4。HTTPSを使用したセッションデータを暗号化します。これらの措置は、セッションの固定攻撃に直面するときにアプリケーションが破壊されないようにすることができます。

セッションレス認証をどのように実装しますか?セッションレス認証をどのように実装しますか?Apr 28, 2025 am 12:24 AM

セッションのない認証の実装は、サーバー側のセッションストレージなしですべての必要な情報がトークンに保存されるトークンベースの認証システムであるJSonWebtokens(JWT)を使用することで実現できます。 1)JWTを使用してトークンを生成および検証する、2)トークンが傍受されるのを防ぐためにHTTPSが使用されることを確認する、3)クライアント側にトークンを安全に保存する、4)改ざんを防ぐためにサーバー側のトークンを検証する、5)短期アクセスや長期的なリフレイを使用するなどのトークンの取り消しメカニズムを実装する。

PHPセッションに関連するいくつかの一般的なセキュリティリスクは何ですか?PHPセッションに関連するいくつかの一般的なセキュリティリスクは何ですか?Apr 28, 2025 am 12:24 AM

PHPセッションのセキュリティリスクには、主にセッションハイジャック、セッションの固定、セッション予測、およびセッション中毒が含まれます。 1。HTTPSを使用してCookieを保護することにより、セッションハイジャックを防ぐことができます。 2。ユーザーがログインする前にセッションIDを再生することにより、セッションの固定を回避できます。3。セッションの予測は、セッションIDのランダム性と予測不可能性を確保する必要があります。 4.セッションの中毒は、セッションデータを確認およびフィルタリングすることで防ぐことができます。

PHPセッションをどのように破壊しますか?PHPセッションをどのように破壊しますか?Apr 28, 2025 am 12:16 AM

PHPセッションを破壊するには、最初にセッションを開始してから、データをクリアしてセッションファイルを破壊する必要があります。 1。Session_start()を使用してセッションを開始します。 2。Session_unset()を使用して、セッションデータをクリアします。 3.最後に、session_destroy()を使用してセッションファイルを破壊して、データのセキュリティとリソースのリリースを確保します。

PHPのデフォルトセッションの保存パスをどのように変更できますか?PHPのデフォルトセッションの保存パスをどのように変更できますか?Apr 28, 2025 am 12:12 AM

PHPのデフォルトセッションの保存パスを変更する方法は?次の手順で達成できます。Session_save_path( '/var/www/sessions'); session_start(); PHPスクリプトで、セッション保存パスを設定します。 session.save_path = "/var/www/sessions"をphp.iniファイルに設定して、セッションの保存パスをグローバルに変更します。 memcachedまたはredisを使用して、ini_set( 'session.save_handler'、 'memcached')などのセッションデータを保存します。 ini_set(

PHPセッションに保存されているデータをどのように変更しますか?PHPセッションに保存されているデータをどのように変更しますか?Apr 27, 2025 am 12:23 AM

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

PHPセッションに配列を保存する例を示します。PHPセッションに配列を保存する例を示します。Apr 27, 2025 am 12:20 AM

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

Garbage CollectionはPHPセッションでどのように機能しますか?Garbage CollectionはPHPセッションでどのように機能しますか?Apr 27, 2025 am 12:19 AM

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。

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

ホットツール

mPDF

mPDF

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

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

メモ帳++7.3.1

メモ帳++7.3.1

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

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター