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

【PHP】Composer の使い方

Composer は、PHPのパッケージ管理ツールです。利用するパッケージ(ライブラリ)間の依存関係も解決してくれます。 スポンサードリンク 目次1. Composer の特徴2. 対応している PH …

PHP

Ubuntu で 複数のバージョンの PHP を使う手順

目次1. はじめに2. 前提とする環境 3. PHP 7.2 を導入する手順手順1:リポジトリを追加するツールをインストール手順2:リポジトリを追加手順3:PHP 7.2 をインストール4. PHP …

PHP

Composer を使って PSR-4 オートロードしている場合、composer.json は必要なくなる

PHP を使った開発でよく使う Composer に関するお話しです。 例えば、composer.json に以下のように記述して開発を行ったとします。 { … “autoload”: { “ps …

PHP

PHP 7.3.0 新機能

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

PHP

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

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