[PHP-users 22737]=?ISO-2022-JP?B?UmU6IFtQSFAtdXNlcnMgMjI3MzVdIFJlOiBQZXJsGyRCJE4=?= =?ISO-2022-JP?B?REVTVE9SWRskQiVhJT0lQyVJJEtJJEUoJDkkayRiJE4bKEI=?=

Eiji Miwa miwa @ offside.ne.jp
2004年 7月 23日 (金) 13:06:54 JST


 ミワです。

On 2004年 7月 23日 , at 00:14 PM, 大島由喜枝 wrote:
>
> register_shutdown_function() もクラスの中で実行したいと思い、
> コンストラクター内で実行しましたがうまくいきました。
>> class A {
>         var $name;
>         function A($name) {
>                 $this->name = $name;
>                 register_shutdown_function(array(&$this, 'destroy'));
>         }

 register_shutdown_function に限らず、
 set_error_handler などでも同じですが、コンストラクタ内で
 自分自身(この場合 class A)を設定してはマズいです。
 #少なくとも PHP 4.3.4 の時点では。

 詳しいことはよくわかりませんが、コンストラクタ内の $this は
 $a = new A() とした場合、インスタンス $a とは別物になってしまうようです。
 
 以下のようにしてみるとよくわかります。

-----
miwa$ /usr/local/bin/php -v
PHP 4.3.4 (cli) (built: Apr  6 2004 19:13:00)
Copyright (c) 1997-2003 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2003 Zend Technologies

miwa$ cat test2.php
<?php

class A
{
         var $name;

         function A($name)
         {
                 $this->name = $name;
                         register_shutdown_function(array(&$this, 
'destroy'));
         }

         function destroy()
         {
                 print "さようなら $this->name さん\n";
         }

}

print "MAIN START\n";
$a = new A('hoge');
$a->name = 'huga'; // 追加
print "MAIN END\n";

?>

miwa$ /usr/local/bin/php test2.php
MAIN START
MAIN END
さようなら hoge さん
-----

 「さようなら huga さん」を期待しますが、そのようにはなりません。
 #これは仕様なんでしょうかね?

--
 miwa at offside.ne.jp



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