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
のように普通に関数を定義してしまうと、グルーバル空間での定義となりますので気を付けましょう。