如果在我的代码中,我会打电话:
__PACKAGE__->method;
这会限制此模块的可用性,如果继承此模块吗?
答案 0 :(得分:9)
这取决于你想做什么:
#!/usr/bin/perl
package A;
use strict; use warnings;
sub new { bless {} => $_[0] }
sub method1 {
printf "Hello from: %s\n", __PACKAGE__;
}
sub method2 {
my $self = shift;
printf "Hello from: %s\n", ref($self);
}
package B;
use strict; use warnings;
use parent 'A';
package main;
my $b = B->new;
$b->method1;
$b->method2;
输出:
Hello from: A Hello from: B
答案 1 :(得分:6)
如果您打算继承该方法,请在指示对象上调用它,并且不要依赖于您找到它的包。如果您打算调用包内部的方法,而其他包不应该看到,那可能没关系。在Intermediate Perl中有一个更全面的解释,可能在perlboot中(这是本书的摘录)。
一般情况下,除非我正在撰写modulino,否则我尽量不要使用__PACKAGE__
。
您为什么要使用__PACKAGE__
?
答案 2 :(得分:3)
这取决于。有时__PACKAGE__->method()
正是您所需要的。
否则最好使用ref($self)->class_method()
或$self->method()
。
答案 3 :(得分:3)
“这取决于。”是正确的答案。实际需要包名称是相对罕见的;通常你会有一个实例或类名开头。也就是说,有时你确实需要包名 - __PACKAGE__
显然是该工作的工具,优于文字。以下是一些指导原则:
永远不要在方法内部调用__PACKAGE__
方法,因为这样做会使继承者无法通过简单地覆盖被调用的方法来更改实现。请改用$self
或$class
。
一般来说,尽量避免使用__PACKAGE__
内部方法。 __PACKAGE__
的每次使用都会增加一点灵活性。有时,缺乏灵活性是你想要的(因为你需要编译时解析或者非常想控制信息存储的位置),但要确保你想要的东西值得付出代价。你以后会感谢自己。
在方法之外,您无法访问$self
,并且应该从__PACKAGE__
而不是文字调用方法。这对于Class::Accessor
提供的编译时声明非常重要。