• 締切済み

関数内のクラス定義について

function func_name() { --- snip --- class class_name { --- snip --- } --- snip --- } のように関数内でクラスを定義した例を見たのですが、関数外でクラスを定義した場合とどこが違うのでしょうか? またどのような意味があるのでしょうか? PHPでは関数内に子関数を定義すると子関数もグローバルになって二重定義エラーになるためこのようなことは出来ないと認識しているのですが、関数内でのクラス定義でこのようなことは起こりませんか。 またclass class_nameはグローバルなスコープを持たないのでしょうか?よろしくお願いします。

みんなの回答

回答No.2

__autoload関数は、PHP5からの対応ですので、PHP4もサポートしているプログラムであった場合、正常に動作しません。 何らかのハックの類だと思いますが、全体の流れを読まないとなんともいえません。

回答No.1

PHP5.2.2で試してみました。 <?php function hoge(){ class Test{ public function hello(){ echo 'hello world'; } } } hoge(); $new = new Test(); $new->hello(); ?> 上記のスクリプトにて試してみましたところ、 hoge();と関数hogeを呼んでいる行をコメントアウトしてみてください。 Testクラスをnewする行でクラス未定義でエラーになります。 つまり、その関数が呼ばれたときのみクラスを定義する、という方法なのでしょうね。 一般的にやるかといわれると疑問ですが。 尚、二回hoge関数を呼ぶと、クラスの再定義エラーとしてエラーが出ます。 ただ、PHP4の時にPHP5の関数をエミュレートして、且つ、アップデートを行っても再定義エラーが起こらないようにするための記述方法なんてものもあり、それが、 <?php if(!function_exists('file_put_contents'){ function file_put_contents(){ //処理内容を記述 } } ?> こんな風にしてやって、file_put_contentsが定義されていない場合は、ユーザ関数としてfile_put_contents関数を定義する みたいな書き方はありました。

kahata
質問者

お礼

classの定義はやはりグローバルなスコープを持ちますね。 クラスを動的に定義するのなら__autoloadかclass_existsを用いればよいように思いますが、なぜこんなことをしているのかわかりません。 ありがとうございます。 参考: http://jp.php.net/manual/ja/language.oop5.autoload.php, http://jp.php.net/manual/ja/function.class-exists.php

関連するQ&A