ロジックやプレップ内で、関数やクラスを定義する場合は注意が必要です。
普通に定義しただけでは、これらの存在はグローバル空間に公開されてしまいます。
そのため、すでに同名の関数やクラスが存在していた場合は名前衝突が起こりエラーが発生します。
これを防ぐには4通りの方法があります。
以下は、module.func1 ロジックモジュラーにおいて、関数 calculate を定義する場合の例です。
1) プレフィクスを付与する
もっとも古典的な手法で、PHP Version 5.3 未満の場合に適用します。
module.func1.logic.php
1 2 3 4 5 6 7 8 | <?php echo module_func1_logic_calculate(); function module_func1_logic_calculate() { return 1 + 2; } |
名前衝突が起こらなければ、プレフィクスは独自に定義しても構いません。
もっと短くすることも可能でしょう。
しかし、見た目が美しくなく、可読性も低下するので、できればこの手法は採用したくありません。
PHP Version 5.3 以上を利用し、以下の3、4の手法を適用することを強く推奨します。
2) create_function を使う
こちらも古典的な手法で、PHP Version 5.3 未満の場合に適用します。
module.func1.logic.php
1 2 3 4 5 6 7 | <?php $calculate = create_function('', ' return 1 + 2; '); echo $calculate(); |
「関数内のクォートの扱いが複雑になる」などの create_function 特有の使いづらさがあり、やはりお勧めしません。
PHP Version 5.3 以上を利用し、以下の3、4の手法を適用することを強く推奨します。
3) 無名関数を使う
PHP Version 5.3 以上の場合に適用します。
module.func1.logic.php
1 2 3 4 5 6 7 8 | <?php $calculate = function() { return 1 + 2; }; echo $calculate(); |
4) 名前空間を使う
PHP Version 5.3 以上の場合に適用します。
module.func1.logic.php
1 2 3 4 5 6 7 8 9 10 | <?php namespace module_func1_logic; //echo namespace\calculate(); echo calculate(); function calculate() { return 1 + 2; } |
いずれにしても、PHP Version 5.3 以上を利用し、3または4の手法を適用することを強く推奨します。
なお、上記は関数やクラスの場合であって、変数に名前衝突は発生しません。
変数はモジュラーファイル内のスコープに隠蔽されます。