[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 メーリングリストの案内