Perl面向对象开发
【Jobeen】

       Perl类是仅是一个包而已,当你看到Perl文档中提到"类"时,把它看作"包"就行了。
       构造函数是类的子程序,它返回与类名相关的一个引用。将类名与引用相结合称为"祝福"一个对象,因为建立该结合的函数名为bless(),其语法为:
       bless YeReference [,classname]
       YeReference是对被"祝福"的对象的引用,classname是可选项,指定对象获取方法的包名,其缺省值为当前包名。
       Perl类的方法只不过是一个Perl子程序而已,也即通常所说的成员函数。Perl的方法定义不提供任何特殊语法,但规定方法的第一个参数为对象或其被引用的包。
       下面通过一个示例来简单地演示Perl面向对象的用法。
       1、说明
       本程序演示了在Perl中如何进行面向对象编程:演示程序包含两个文件:queryper.pl 和 queryper.pm,把 queryper.pl 和 queryper.pm 放在当前目录下,运行"perl queryper.pl"即可以看到结果。queryper.pm定义了名为queryper的类。queryper.pl中创建了queryper类的实例,并测试了queryper的成员方法。
       2、queryper.pm的内容
       package queryper;
       use strict;
       sub new {
       my $class = shift();
       print("CLASS = $class\n");
       my $self = {};
       $self->{"name"} = shift();
       $self->{"age"} = shift();
       bless $self, $class;
       return $self;
       }
       sub getname {
       my ($self) = @_;
       return $self->{"name"};
       }
       sub setname {
       my ($self, $name) = @_;
       $self->{"name"} = $name;
       }
       sub getage {
       my ($self) = @_;
       return $self->{"age"};
       }
       sub setage {
       my ($self, $age) = @_;
       $self->{"age"} = $age;
       }
       1;
       3、queryper.pl的内容
       #!/usr/bin/perl -w
       use strict;
       use queryper;
       my $tom = queryper->new("Tom", "27");
       my $kiss = queryper->new("Kiss", "29");
       my @querypers = ($tom, $kiss);
       for my $p (@querypers) {
       printf("name: %s\tage: %s\n", $p->getname(), $p->getage());
       }
       4、程序运行结果
       CLASS = queryper
       CLASS = queryper
       name: Tom age: 27
       name: Kiss age: 29
       5、当调用queryper->new("Tom", "27")时发生了哪些事情
       下面我们将重点分析new函数代码:
       当调用queryper->new("Tom", "27")时,有3个参数被传递给queryper中的new函数,它们分别是: 类的名称"queryper"(这是一个隐含参数)、"Tom"、"27"。在调用new方法时多用于设定一些初始化的信息,像到数据库的连接,文件句柄的开启等操作。当然也不一定要用new函数,也可以用init函数来做此类工作,这不是规定的。
       语句my $class = shift();获得第一个参数
       语句my $self = {};创建一个哈希表对象的引用
       语句$self->{"name"} = shift(); 把传进来的第二个参数存入到哈希表中
       语句$self->{"age"} = shift(); 把传进来的第三个参数存入到哈希表中
       语句bless $self, $class,我把bless理解为"把类型信息和变量绑定" :
       $self是一个指针,在这里指向了一个哈希表对象的引用
       $class是一个字符串,在这里是queryper类的名字
       在perl中,根据类的名字可以查找到这个类所有的成员方法和成员变量,因此类的名称就代表了类的类型信息.
       所谓bless就是把 queryper类的类型信息赋予哈希表对象的引用
       语句'return $self;'则返回哈希表对象的引用