[PHP-users 22734]Re: PerlのDESTORYメソッドに匹敵するもの

大島由喜枝 sanoyuki @ ninus.ocn.ne.jp
2004年 7月 23日 (金) 11:45:53 JST


こんにちわ。大島です。

Perl の場合、そのオブジェクトへのリファレンスが無くなったときに
そのオブジェクトはガベージコレクションの対象になりメモリが開放されます。
ただ、そのときにファイルハンドルやデータベースコネクションは開放
されないので、オブジェクトが消えた時点でそれらも開放してやるのが
よいということです。

Perl の場合、オブジェクトが消えるのは、http セッションがきれるとき
だけとはかぎりません。そのオブジェクトが有効であるスコープから
スクリプトの実行が抜けたときです。

ですので、DESTROY メソッドは有効だと思います。

ただ、PHP の場合は、オブジェクトをローカルスコープに限定して
有効にするといったことは行われないのでしょうか。
(PHP はここ数日「基礎PHP impress社」をよんで始めたばかりです。)

Perl だと
sub functionA{
    my $obj:

}
と  my 修飾子がついた変数はそれを囲む{}内のみで有効です。
ですので {} からスクリプトの制御がでると $obj はきえます。

PHP だと
function functionA() {
    $obj;
}
としても functionA をぬけても $obj はきえませんよね。(my に相当する
修飾子があるのでしょうか。

実際 Perl と PHP で DESTROY が意味あるかどうか試したので見てみてください。
PHP では DESTORY は、データベースの切断という使い方では意味ないと
思いました。

$ cat test.php
<?
require_once("PEAR.php");

class ClassA  extends PEAR{
        var $name;
        function ClassA($name) {
                $this->PEAR();
                $this->name = $name;
        }
        function _ClassA() {
                print "さようなら $this->name さん\n";
        }

        function hello() {
                print "こんにちわ。 $this->name さん\n";
        }
}



#### MAIN ####


print "MAIN の始まりです。\n";

useClassA();

print "MAIN の終です。\n";


function  useClassA() {
        $a = new ClassA("oshima");
        $a->hello();
}
$ php test.php
MAIN の始まりです。
こんにちわ。 oshima さん
MAIN の終です。
さようなら oshima さん

$ cat test.pl
#!/usr/local/bin/perl

use strict;

package ClassA;

sub new {
        my ($class,$name) = @_;
        my $self = {name=>$name};
        bless $self, $class;
        return $self;
}

sub hello {
        my $self = shift;
        print "こんにちわ。 $self->{name} さん\n";

}

sub DESTROY {
        my $self = shift;
        print "さようなら $self->{name} さん\n";

}



#### MAIN ####

package main;


print "MAIN の始まりです。\n";

useClassA();

print "MAIN の終です。\n";


sub  useClassA() {
        my $a = new ClassA("oshima");
        $a->hello();
}

exit;
$ test.pl
MAIN の始まりです。
こんにちわ。 oshima さん
さようなら oshima さん
MAIN の終です。
$

以上です。PHP に詳しい方、補足をお願いいたします。




*************
しあわせ太郎のCGI光房
http://happytaro.pekori.jp/Home/
----- Original Message ----- 
From: "Etsuo SUMIYA" <e_sumiya @ f-den.co.jp>
To: <php-users @ php.gr.jp>; <ramsy @ ramix.jp>
Sent: Friday, July 23, 2004 11:08 AM
Subject: [PHP-users 22733] Re: PerlのDESTORYメソッドに匹敵するもの


> sumiyaといいます.素朴な質問です.
>
> From: YOSHIMURA Keitaro <ramsy @ ramix.jp>
> Subject: [PHP-users 22711] Re: PerlのDESTORYメソッドに匹敵するもの
> Date: Thu, 22 Jul 2004 18:59:31 +0900
> Message-ID: <20040722185300.E557.RAMSY @ ramix.jp>
>
> > > Perl では、DESTORY メソッドをクラスで定義しておくと
> > > そのクラスのインスタンスへのリファレンスが無くなったときに
> > > このDESTORY メソッドが呼び出されて実行されます。
> > > そこで、DESTORY メソッド内でデータベースへの disconnct なんかを
> > > 記述しておくと便利です。
> > >
> > > PHP でもこれに匹敵するようなメソッドは存在するのでしょうか。
> > php4では暗黙のデストラクタは実装されていません。
> > php5から実装されてるらしいです。
>
> persistent connectionでなければ,httpのセッションが切れる時に,DBへの
> コネクションは切断されると理解しています.だから,DBを切り替えるとか,
> そういう用途以外ではほとんどdisconnectを明示的に呼んだことはないです.
>
> クラスのオブジェクトもhttpのセッションが切れた時になくなると思っていま
> す.デストラクタを用意して明示的にdisconnectを呼ぶのと,セッションの終
> わりで自動的にdisconnectされるのとどう違うのでしょうか?
>
> 今後のために教えてください.
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3



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