[PHP-users 6094] Re: PHP4.1.2のregister_shutdown_function()について

kentarou_ishimaru php-users@php.gr.jp
Tue, 12 Mar 2002 10:57:20 +0900


kehiです。
河治さん、市原さん、小山さん、丁寧なご返答ありがとうございます。
まとめて小山さんの投稿にレスをつけます事ご了承ください。

>  少なくともこの呼び方では、Get_test($REMOTE_ADDR) が返す値 (つまり 
>null) を register_shutdown_function() に渡しているので、
>
>> Warning: Unable to call (null)() - function does not exist in Unknown on 
>> line 0
>
>となるのでしょう。
>
>> とはいえ、ワーニングが出るだけで機能的には
>> 以前同様の処理は実現できていますので
>
>ということで、以前でもスクリプト終了時に呼ばれていたわけではないと思わ
>れます。

!!!
今回の処理に関しましては恥ずかしながらご指摘の通りのようです。
register_shutdown_function(Get_test($REMOTE_ADDR);
のように指定すると指定した関数がスクリプト終了時に実行されるものと
勝手に勘違いしていました。(^^;;
PHP4.1.0以上ではこうした使い方をすると
親切にもワーニングを出すようにしてくれたということですね。

で、これだけでは何ですので、ちょろっと実験してみました。
第2引数の指定が可能なのかどうかと、
そもそも呼び出す関数を引数つきで実行したい場合は
global変数で参照するしかないのか等です。

<?php

$chk1 = "aaa";
$chk2 = "bbbb";

function Get_test($val){ //引数無しのときは$valは指定しないとして
	global $chk2;
	if($val == null){
		$val = $chk2;
	}
	$myFile = fopen("test.txt","w");
	if(!($myFile)){
		exit;
	}
	fputs($myFile, "$val");
	fclose($myFile);
}

	register_shutdown_function(Get_test($chk2));
//	register_shutdown_function('Get_test',$chk2);
//	register_shutdown_function(Get_test);

Get_test($chk1);
print("<html><body>");
print("test");
print("</body></html>");
exit;

?>
====================-
結果:
1:register_shutdown_function(Get_test($chk2));
ご指摘のとおりaaaが記録されました。
ゆえに関数そのものは実行はされるが、
スクリプト終了時ではないということです。
Warning: Unable to call (null)() - function does not exist in Unknown on 
line 0

2:register_shutdown_function('Get_test',$chk2);
ワーニングは出ませんでした。しかしながら、
aaaが記録されるので第2引数をこのような形で
渡すのは誤りだと思われます。

3:register_shutdown_function(Get_test);
bbbbが記録されましたのでこれが正しい使用法のようです。
もちろんワーニングも出ませんでした。

<補足>
#上記の関数を引数なしのFunction Get_test(){のように変えています。
</補足>


こんな感じです。おかしければつっこみを入れてください。
THX
☆_/_/_/_/石丸 健太郎(kehi@scg.fuji-ric.co.jp)_/_/_/_/★
    富士総合研究所 情報企画室
    My WebSite is Station kehi where's
    http://kehi.yi-web.ne.jp/     check it out !!  (^^)!
  投げれば答えが返ってくる。あなたのネットのブーメラン 〜e-リサ〜
  http://eresearch.fuji-ric.ne.jp/
★_/_/_/_/_/_/_/_/_/_/_/__/_//_/_/_/_/_/_/_/_/☆