PHP

PHPで即時実行関数を使って名前空間を汚さない

投稿日:2018年1月25日 更新日:

JavaScript だとよく見るやり方なのですが、「即時実行関数を使って名前空間を汚さない」やり方って、PHP の場合はあまりやらないのでしょうか?

PHPで関数を宣言すると、その名前はグローバル空間に所属することになります。

ですので、「1つのPHPファイル内でしか使わないんだけど、同じ処理が複数回必要なので、その処理を関数にして使いまわしたい。でも名前空間は汚したくない。」場合、何かやり方を考える必要があります。namespace キーワードを使って 名前空間 を定義することもできますが、それもちょっと大げさに感じる場合です。

こんな時に、即時実行関数が便利なんですよね。

基本的には以下のように書きます。

(function() {
  // ここで定義した変数は、グローバル空間を汚しません。
})();

function(){} で定義した関数を括弧で囲み、それに () を付けることですぐに実行させています。

この関数の中で、変数を定義してみます。

(function() {
  // ここで定義した変数は、グローバル空間を汚しません。
  $foo = 1;
  $bar = function() {

  };

  // ここで、$foo と $bar が使えます。
  echo $foo;
  $bar();

})();

関数内で定義した変数は、その関数内でしか使えず、グローバル空間を汚しません。関数を使いたい場合は、上記の $bar のように変数に関数を代入するだけです。

例えば、test.php という名前で以下のコードを書いたとすると、

<?php

$bar = function() {
    echo 'Hello! in global' . PHP_EOL;
};

(function() {

    function foo() {
        echo 'Hello! in foo in 即時実行間数' . PHP_EOL;
    }

    $bar = function() {
        echo 'Hello! in bar in 即時実行間数' . PHP_EOL;
    };

    echo 'Hello! in 即時実行間数' . PHP_EOL;
    foo();
    $bar();

})();

// global からアクセス可能
foo();

// global で定義した関数が実行される
// global で定義してなければ、Undefined variable となる
$bar();

実行結果は以下のようになります。

$ php test.php
Hello! in 即時実行間数
Hello! in foo in 即時実行間数
Hello! in bar in 即時実行間数
Hello! in foo in 即時実行間数
Hello! in global

foo のように普通に関数を定義してしまうと、グルーバル空間での定義となりますので気を付けましょう。

📂-PHP
-,

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

PHPでのエラー処理・例外処理

目次1. PHPの例外クラス2. 例外クラスの使い分け3. 独自アプリ用例外クラスの作成例と利用例4. 資料 1. PHPの例外クラス PHPには以下の例外クラスが組み込まれています。 PHPの例外ク …

PHP

画像ファイルの拡張子でないURLから 画像ファイルを返すPHPコードの例

ウェブブラウザで画像ファイルをダウンロードする場合、URL は https://example.com/foo/bar.png というように、末尾がそのファイル名になっていることが多いと思います。 こ …

PHP

PHP 7.3.0 新機能

目次はじめにFlexible Heredoc and Nowdoc SyntaxPCRE2 MigrationMultiple MBString Improvements はじめに PHP 7.3.0 …

PHP

PHPって何ができるの?

「PHPって何ができるか?」を知るために、最小限の PHP を使った Webページが Webブラウザにどんなデータを返すのか? を見ていきます。 スポンサードリンク 目次1. この記事が前提としている …

PHP

PHP: ob_start() 関数によるバッファリングの動作

PHP の ob_start() 関数によるバッファリングの動作について説明します。