据我所知,创建类(包)的动态实例就像是对Perl语法的破解(使用'bless')。 Perl不支持名为“class”的关键字;因此一切都是有限的。
导致OOP困难的Perl的第一个限制是在创建静态类属性和静态类方法时。任何解决方案?
答案 0 :(得分:17)
对于类级变量,有两种常用方法:
package Bar;
use strict;
use warnings;
sub new { bless {}, shift };
# (1) Use a lexical variable scoped at the file level,
# and provide access via a method.
my $foo = 123;
sub get_foo { $foo }
# (2) Use a package variable. Users will be able to get access via
# the fully qualified name ($Bar::fubb) or by importing the name (if
# your class exports it).
our $fubb = 456;
使用示例:
use Bar;
my $b = Bar->new;
print "$_\n" for $b->get_foo(), $Bar::fubb;
答案 1 :(得分:7)
在这个时代,如果你真的想用Perl做OOP,你最好使用像Moose这样的对象框架,这将有助于清理狡猾的语法。它会使Perl中的OO伤害更少,如果你使用像MooseX :: Declare这样的扩展,它会更甜蜜。
我没有做很多OO的事情,但我想我知道你想要做什么,而且我确实相信Moose可以直截了当地做到这一点。
答案 2 :(得分:0)
我找到了解决方案:
package test;
my $static_var = undef;
#constructor not needed
#static method to set variable
sub set_var {
my ($value) = @_;
$static_var = $value;
}
#static method to get variable value
sub get_var {
return $static_var;
}
1;
根据http://www.stonehenge.com/merlyn/UnixReview/col46.html,似乎无法直接访问包中的这些变量。也许必须有get
,set
方法才能访问它们。
如上文所述:
也没有语法允许此代码之外的任何其他代码访问这些变量,因此我们可以确保我们的变量不会神秘地改变。
我真的不知道该作者是否正确。
答案 3 :(得分:0)
标准包变量表现为类变量
package foo;
my $bar;
1;
然后:
$foo::bar=1; # or whatever
$foo::bar++;
print $foo::bar, "\n";