コンテンツにスキップ

ntorelabo

Front End Developer

  • pickup
  • WordPress
  • PHP
    • PHP技術者認定試験
  • Docker
  • Next.js
  • AWS
  • Laravel
  • site map
  • search

ntorelabo

Front End Developer

  • search
  • pickup
  • WordPress
  • PHP
    • PHP技術者認定試験
  • Docker
  • Next.js
  • AWS
  • Laravel
  • site map

モダンなPHPコードで使用!無名関数の使い方

  • ホームページ
  • モダンなPHPコードで使用!無名関数の使い方
  • 3月, 土, 2025
  • PHP
モダンなPHPコードで使用!無名関数の使い方

Contents [hide]

  • 1 無名関数とは
  • 2 useキーワードを使用し外部の変数を関数内で使用可能
    • 2.1 なぜ無名関数だけがuseキーワードを使えるのか
    • 2.2 技術的な理由
    • 2.3 他の言語との比較
  • 3 無名関数はコールバック関数としてよく使用されます

無名関数とは

名前の通り名前を持たない関数です

一般的には下記の通り変数に代入する方法で定義します

PHPの無名関数の基本 $greet = function($name) { return “こんにちは、{$name}さん!”; }; $greet function($name) { return “…”; } 無名関数を変数に格納して後で使用できます

useキーワードを使用し外部の変数を関数内で使用可能

無名関数は「クロージャ(閉じる)」とも呼ばれ、関数外部の変数を関数内に持ち運ぶ(閉じ込める)ことができます

【useキーワード】を使用して外部変数を取り込み

PHPのクロージャとuseキーワード 外部スコープ $message = “こんにちは” クロージャのスコープ $closure = function() use ($message) { echo $message; }; useで取り込み クロージャは外部スコープの変数を 「use」キーワードで取り込んで使用できます

PHPで無名関数だけがuseキーワードを使えるのには、言語設計上の理由があります。

なぜ無名関数だけがuseキーワードを使えるのか

  1. 言語設計の選択 基本的には「そういう設計になっている」というのが第一の理由です。PHPの設計者たちがこのような文法を選んだということになります。しかし、その背景には技術的な理由もあります。
  2. スコープとクロージャの概念 通常の名前付き関数は、定義された時点でグローバルスコープや現在の名前空間に属します。これらの関数は実行時にはそのスコープから独立して動作するよう設計されています。 一方、無名関数(クロージャ)は「関数が定義された環境の状態を取り込む」というクロージャの概念に基づいて設計されています。useキーワードはこの「状態の取り込み」のための構文です。
  3. 実行環境の違い 名前付き関数は定義された時点でコンパイルされ、実行環境から独立します。無名関数は変数に代入され、実行時に評価されるため、実行時の環境(変数など)を取り込むことができます。

技術的な理由

PHPエンジン内部での実装上の理由もあります:

  1. 静的解析と実行時解析 名前付き関数は通常、コードがパースされる際に静的に解析されます。この時点では、関数が実際に呼び出される文脈はまだわかりません。 useキーワードはしかし、特定の実行時の変数をキャプチャするものなので、静的に解析される名前付き関数では使用できないように設計されています。
  2. 変数スコープの明確化 PHPでは、名前付き関数内からは自動的にグローバル変数へアクセスできないようになっています($GLOBALSやglobalキーワード経由を除く)。これは意図しない副作用を防ぐための設計です。 useキーワードは、クロージャがアクセスできる外部変数を明示的に宣言するための仕組みであり、この変数スコープの明確化というPHPの設計哲学に沿っています。

他の言語との比較

他のプログラミング言語では異なるアプローチを取っているものもあります:

  • JavaScriptでは関数内から自動的に外部スコープの変数にアクセスできます(明示的なキーワードなし)
  • Pythonでも関数内から外部スコープの変数を参照できますが、書き換えは特別な宣言(nonlocal)が必要です
  • Rubyではブロックがレキシカルスコープのどこからでも変数にアクセスできます

PHPは明示的なスコープを好む設計哲学を持っており、useキーワードはその一環として無名関数に限定されています。

基本的には言語設計の選択ですが、それにはPHPの変数スコープに関する設計哲学が反映されているのです。

無名関数はコールバック関数としてよく使用されます

そもそもコールバック関数とは、別の関数によって「呼び戻される」という意味で、直接呼び出すのではなく、間接的な呼び出しをされます。

コールバック関数で無名関数を使用すると、コードを書く場所と近い位置に定義できるため、関連するコードがまとまり読みやすくなります

※名前付き関数の場合、関数定義がファイルの先頭箇所や、別ファイルの場合もありますからね、、🤷‍♀️

PHPの無名関数をコールバックとして使用 $numbers = [1, 2, 3, 4, 5]; $doubled = array_map(function($n) { return $n * 2; }, $numbers); // $doubled は [2, 4, 6, 8, 10] になります [1, 2, 3, 4, 5] function($n) { return $n * 2; } [2, 4, 6, 8, 10]
php8上級/準上級試験
最近の投稿
  • WordPressサイトのサブディレクトリ→サブドメイン移行手順 2025年7月6日
  • Laravelでリッチテキストエディタで使いやすい画像アップロード機能を実装(TinyMCE) 2025年6月22日
  • 【PHP】出力バッファリング制御 2025年5月22日
  • basic認証のパスワードを忘れた場合 2025年5月14日
  • PHP 8.0〜から実装で便利な機能(名前付き引数、match) 2025年5月11日
  • さくらインターネットからWHOIS登録メールアドレスの利用廃止のメールが来た 2025年5月9日
  • スムーズにスクロールする処理をjQueryで実装 2025年5月5日
  • Gemini for Google Workspace 活用術 2025年4月24日
  • Google Cloud の始め方 2025年4月20日
  • 【PHP】switch分の書き方、PHP 7.3 から PHP7.4の変更点 2025年4月19日
  • 【PHP】新しい方の指定方法「nullable」 2025年3月25日
  • 「PHPでJSONを扱う」json_encodeとjson_decode完全ガイド 2025年3月23日
  • 【WordPress自作テーマ開発】固定ページを自動作成する方法(下層ページ実装) 2025年3月18日
  • 【PHP】プロトコル / ラッパーについて(file:// php:// http:// https://) 2025年3月17日
  • 【PHP】stdClass を使用して(object) でキャスト 2025年3月16日
  • モダンなPHPコードで使用!無名関数の使い方 2025年3月15日
  • Cursor 便利な機能まとめ、Project Rules 2025年3月15日
  • PHP セッション名の変更方法と php.ini の記述方法まとめ 2025年3月12日
  • 【PHP】関数内でグローバル変数を使用するためには global キーワード 2025年3月10日
  • 【php8上級/準上級試験】模擬問題解説 問題30 strtotime() 2025年3月4日
About Us

Ready To Start Work With Us?

Felis consequat magnis est fames sagittis ultrices placerat sodales porttitor quisque.

Get a Quote
recent posts
  • WordPressサイトのサブディレクトリ→サブドメイン移行手順
  • Laravelでリッチテキストエディタで使いやすい画像アップロード機能を実装(TinyMCE)
  • 【PHP】出力バッファリング制御
  • basic認証のパスワードを忘れた場合
  • PHP 8.0〜から実装で便利な機能(名前付き引数、match)
  • さくらインターネットからWHOIS登録メールアドレスの利用廃止のメールが来た
  • スムーズにスクロールする処理をjQueryで実装
  • Gemini for Google Workspace 活用術
Opening Hours
Week Days 10:00 - 17:00
Saturday 10:00 - 15:00
Sunday Day Off
Contact us
popular posts
  • WordPressで画像を拡大表示するなら「Firelight Lightbox」(旧名:Easy Fancybox) 1.1k件のビュー
  • 【WordPress】カスタムフィールド作成の仕方「ACF」Advanced Custom Fieldsの使用法 741件のビュー
  • 【チートシート】Linuc Lv1-102 実務での使用例も解説 600件のビュー
  • My-Snow-Monkey使用例、子テーマによるカスタマイズ 512件のビュー
  • 【WordPressエラー】「Warning: Undefined variable $post in …」「Warning: Attempt to read property “ID” on null in …」 458件のビュー
  • Twitter、Facebookのタイムラインを埋め込む 415件のビュー
  • 【Next.js】ライブラリ使わないでカルーセルスライダー 302件のビュー
  • ローカル、グローバルIPアドレスの違いと確認手順 265件のビュー
  • AWS認定ソリューションアーキテクト-アソシエイトレベル 248件のビュー
  • WordPress自作、カスタマイズ 228件のビュー
Search
Copyright © 2025 ntorelabo | Powered by Desert Themes