[PHP-users 25800] Re: 関数内関数の正しい定義方法

Yasuo Ohgaki yohgaki @ ohgaki.net
2005年 6月 13日 (月) 07:00:19 JST


大垣です。

関数内で関数を定義したいケースとは条件によって別実装の関数を利用したい、という
事と思います。
# ダイナミックバインディングのような事したい場合など。

個人的にはrequire/include別ファイルを読むように書いたほうが良さそうな気もします。

どちらかというと関数内に関数が定義できるという仕様は「後付」の仕様で、スクリプトの
実行時に動的に関数を定義する言語仕様の副作用として使えるようになってしまった機能
と(私の中では)位置づけています。
# 古いPHPマニュアルには関数内で関数が定義できる仕様は機能として
# 紹介されていませんでした。
# 「関数が実行時に定義される」とはPHPのコードがバイトコードにコンパイル
# されている際には関数は定義されず、関数を定義するバイトコードがVMで
# 実行される時に関数が定義される事。


Tadashi Jokagi wrote:
>       上鍵です.こんにちは.
>       「新しい関数を定義する機能として foo() を考えてくれ,関数を複数定義
>     できないことと foo() を複数回呼ぶことができないのは同じだ」といった回
>     答が帰ってきました.
> 

次のようなケースと同じ、と言っていると思います。

main.php
----
<?php
function foo($flag = true) {
 if ($flag) {
   inlcude('a/my_functions.php');
 } else {
   include('other/my_functions.php');
 }
}

foo();
?>
----

a/my_funcitons.php
----
<?php
function bar() {}
?>
----

other/my_function.php
----
<?php
function bar() {}
?>
----

でエラーになるのと同じという事ですね。

これは基本的に次のように記述するのと同じなります。この為、関数内関数が使えるように
なっています。

----
<?php
function foo($flag = true) {
 if ($flag) {
   function bar() {}
 } else {
   function bar() {}
 }
}

foo();
?>
----

require_once/include_onceが無かった頃はよくrequire/includeされるファイルの先頭で
読み込み済み(関数が定義されているか)確認するコード見かけました。

<?php
if (defined(MY_FUNCTIONS)) {
  return;
}
define('MY_FUNCTIONS', true);

function bar() {}
?>

条件に応じて関数の中身を替えたい、と言う場合はこちらの書き方の方が分かりやすい(?)かも
しれません。

# この事は「はじめてのPHP言語プログラミング」に詳しく書いてないような気も...

--
Yasuo Ohgaki
http://blog.ohgaki.net/



PHP-users メーリングリストの案内