我知道这可能是一个非常简单的主题,但我试图得到最好的逻辑,因为我还是Perl新手。Perl共享变量与子类
如果我不使用面向对象,只是将代码分割成文件,所有的全局变量都可以在所有文件中进行访问。
我想要做同样的事情,但使用OO风格。示例是我想要一个名为“BaseSub”的基类,它具有包含应用程序配置的散列,称为%Config。现在我有一个名为“DB”的子类用于数据库连接,我想从位于“BaseSub”包中的%Config访问设置。我怎么做。
我知道这可能是一个非常简单的主题,但我试图得到最好的逻辑,因为我还是Perl新手。Perl共享变量与子类
如果我不使用面向对象,只是将代码分割成文件,所有的全局变量都可以在所有文件中进行访问。
我想要做同样的事情,但使用OO风格。示例是我想要一个名为“BaseSub”的基类,它具有包含应用程序配置的散列,称为%Config。现在我有一个名为“DB”的子类用于数据库连接,我想从位于“BaseSub”包中的%Config访问设置。我怎么做。
如果你在这个时代写的perl OO,你真的应该使用Moose。它使OO代码更容易,更干净,更小。
继承变量的正确方法是创建对象属性。这里有一个简单的例子:
package MyBaseClass;
use Moose;
has config => (
is => 'ro',
default => sub { {
who => 'World',
} }
);
package MyClass;
use Moose;
extends qw(MyBaseClass);
sub greet
{
my $self = shift;
printf("Hello %s!\n", $self->config->{who});
}
package main;
my $object = MyClass->new();
$object->greet();
一个伟大的起点学习驼鹿是Moose::Manual。
编辑:
如果你希望能够修改的配置,你可以只捅hashref从配置访问直接返回:
$object->config->{who} = 'Friends';
但更好的方法可能是做一个配置类,并使配置属性持有的一个实例:
package Myconfig;
use Moose;
has who => (is => 'rw', default => 'World');
package MyBaseClass;
use Moose;
has config => (
is => 'ro',
isa => 'MyConfig',
default => sub { MyConfig->new },
);
# inherit, instantiate, etc as before...
$object->config->who('Friends');
另一种方法可能是Moose::Meta::Attribute::Native::Trait::Hash,它可以很容易地设置帮助器方法来处理本机Perl数据类型。
好,我怎么能配置attr动态哈希也作为动态数组,我可以从基类甚至子类更改。 – daliaessam
已更新我的答案,以包含有关制作可修改配置属性的建议。 – Lasse
Moose默认安装在托管域中,因为它不是标准的Perl模块,或者我必须要求他们将其安装在服务器上吗? – daliaessam
你有任何代码,你目前的工作? – Aldo