|
Perl 中,类(class) 就是一种包 (package),这两个术语可以互换。
类一般位于 .pm 模块中,类名和模块名也相同,比如一个模块名为 mywife.pm ,那么类的名字就是 mywife 。类一般由下面几个部分组成:
1. 描述对象的数据
2. 一个名为 "bless" 的函数,它用来创建对象。
3. 称为“方法”的特殊子例程,我们就是用这些方法来创建,访问,操作,以及销毁对象。
由于 Perl 不会严格监控模块中的 公有/私有 的界限。如果要保证变量的私有性,那么必须使用 my 函数。用户是不能通过双冒号或单撇号从其他包中访问 my 变量,因为 my 变量不和任何包相关,也不存储在创建它的包的符号表里,比如:
[code=perl]#!/usr/bin/perl
#声明 main 包
package main;
$name = "beyes";
my $domain = "groad";
#切换到 outmain 包中
package outmain;
print "My name is $name\n";
print "Can we access the $main::domain ?\n";[/mw_shl_code]
运行输出:[beyes@beyes class]$ ./temp.pl
My name is
Can we access the ? 由输出可见,$name 的变量具有全局作用域,所以它在 main 和 outmain 中都可见,但是在 outmain 包里无法使用双冒号来获取 my 声明的变量 $domain。这是因为,outmain 包的作用域是从声明之处开始到文件末位,而 $domain 只是一个 main 中的局部变量,它和符号表毫无关系,而只是存储在封闭代码块中所创建的专用缓冲区里。
对象
在 Perl 中,对象其实就是一块数据,而这块数据会用一个匿名散列来表示。之所以是匿名散列,这是因为它没有必要人为其定义一个名字。在这个散列中,包含了对象的数据成员和属性。
创建一个对象,首先应创建引用,这个引用的值一般就是上面所说的匿名散列的地址。接着,该引用还应当知道它所属的包。也就是说,包中有操作对象的方法,当知道了它所属的包后,它才能使用里头的这些方法。让引用 “归入” 到某个包使用 bless 函数来达到此目的。bless 能把引用的“东西”(而不是引用本身)加入到包中,这里的“东西”就是值匿名散列对象所指的数据。 bless 函数有两种使用形式:1. bless ($ref, Class);
2. bless ($ref); 但不管哪种形式,bless 函数的第 1 个参数必须是一个指针,第 2 个参数则是可选项;当指定第 2 个参数时,就归入参数所指定的包中,如果省略,那么就使用当前的包。该函数返回被归入的对象的引用,比如如下使用:
[code=perl]
# $ref 是匿名散列的引用
my $ref = {
"Onner" => undef,
"Price" => undef,
};
#将对象归入到一个名叫 Class 的包中
bless($ref, class);
#返回对象的引用
return $ref;
[/mw_shl_code]
下面程序中简单的示例了包(类)以及对象的声明,以及 bless 函数的使用:
[code=perl]#!/usr/bin/perl
#声明包
package House;
# $ref 是匿名散列的一个引用
my $ref = {
"Onner" => undef,
"Price" => undef,
};
#bless 将引用 $ref 引用所指向的对象归入 House 包中
bless($ref, House);
print "The value of \$ref is: $ref.\n";
print "The ref function returns the class (package) name: ", ref($ref), ".\n";
[/mw_shl_code]
运行输出:$ perl House.pl
The value of $ref is: House=HASH(0x9b88830).
The ref function returns the class (package) name: House.
程序中,ref 函数的参数是一个对象的引用时,函数返回这个对象所归属到的包的名称,这里就是第 2 个参数所指定的 House 。因为这里只声明了一个 House 包,如果上面的 bless 函数不指定第 2 个参数,那么就默认使用当前的包,即 House。 |
|