[Moscow.pm] Наследование

Artem Zhuravlev zhuravlev.artem.vasilyevich на gmail.com
Вт Окт 2 06:04:17 PDT 2012


Сейчас попробую.

Спасибо.

2 октября 2012 г., 16:01 пользователь Andrij Panov
<andreparker на gmail.com>написал:

> Hi.
>
> 2012/10/2 Artem Zhuravlev <zhuravlev.artem.vasilyevich на gmail.com>:
> > Быть может не правильно выразился.
> >
> > У меня есть Объект который создается при запуске сценария и в его данных
> > есть объект входа в базу, и набором методов. Я могу добраться к данным
> > методам как и главном сценарии так и в Пакете Core. Но как сделать это ж
> > другом пакете к примеру Test.pm.
> >
> > Суть в следующем я могу добраться к параметрам объекта $query
> > (CGI::Fast->new()) когда мы попытаемся перейти на  страничку /?page=one.
> >
> > Есть некий пакет One.pm который будет загружаться при переходе в котором
> > будет обращение в базе и выводом определенных данных.
> >
> > Как в пакете One.pm мне достучаться к методам работающими с базой.
>
> Не проще ли в метод который будет вызываться из One.pm передавать
> указатель на Core?
>
> One::handler($init, @other_args);
>
>
> > Быть может рассуждаю не верно. Только учусь.
> >
> > Спасибо по этой статье и начинал осваивать ООП.
> >
> > 2 октября 2012 г., 15:04 пользователь Alexandr Alexeev <
> afiskon на gmail.com>
> > написал:
> >
> >> Не уверен, что полностью понял ваш вопрос, но надеюсь, это вам
> пригодится:
> >>
> >> 1. Не работайте с атрибутами напрямую, пишите вокруг них
> >> обертки-методы. Если лень писать, используйте Mouse например.
> >> 2. Не похоже, что в вашем случае требуется использовать наследование.
> >> Вообще наследованием часто злоупотребляют, настоящая потребность в нем
> >> возникает довольно редко. Вам точно не подойдет делегирование?
> >> 3. Разобраться с ООП в Perl может помочь эта заметка:
> >> http://eax.me/perl5-oop/ На самом деле там все довольно просто - bless
> >> превращает переменную в объект, а оператор стрелка преобразует вызов
> >> $obj->method($a, $b) в MyPackage::method($obj, $a, $b);
> >>
> >> 2012/10/2 Artem Zhuravlev <zhuravlev.artem.vasilyevich на gmail.com>:
> >> > Помогите, окончательно запутался.
> >> >
> >> > Есть сценарий
> >> >
> >> > #!/usr/bin/perl -w
> >> > BEGIN {
> >> > $ENV{FCGI_SOCKET_PATH} = ":8000";
> >> > $ENV{FCGI_LISTEN_QUEUE} = 10;
> >> > use CGI::Carp qw/carpout/;
> >> > open LOG, ">>", "carp.log" or die("Cannot open file: $!\n");
> >> > carpout(LOG);
> >> > use lib "/home/artem/FCGI";
> >> > }
> >> > use strict;
> >> > use 5.010;
> >> > use HTML::Template;
> >> > use Data::Dumper;
> >> > use engine::class::Page;
> >> > use engine::class::Core;
> >> > use CGI::Fast;
> >> > use POSIX qw(strftime);
> >> > our $query_cnt = 0;
> >> > our $query;
> >> >
> >> > while($query= CGI::Fast->new()) {
> >> > print "Content-type: text/html\n\n";
> >> > eval{
> >> > $query_cnt++;
> >> > my $init = Core->new($query_cnt);
> >> > #say Dumper ($init);
> >> > foreach my $get ($init->{db}->query("select * from city")){
> >> > say $get->{name}." || ";
> >> > }
> >> > };
> >> > if ($@){
> >> > my $now_string = strftime "%Y-%m-%d %H:%M:%S", localtime;
> >> > open FILE, ">>", "carp.log" or next("Cannot open file: $!\n");
> >> > print FILE "[".$now_string."][Eval error]".$@."\n";
> >> > close FILE;
> >> > }
> >> > }
> >> >
> >> >
> >> > пакеты и классы
> >> >
> >> > #!/usr/bin/perl
> >> > package Core;
> >> > use engine::class::DB;
> >> > @ISA = qw/DB/;
> >> > use warnings;
> >> > use strict;
> >> > use 5.010;
> >> > sub new {
> >> > my $class = shift;
> >> > my $self = {
> >> > version => '1.0',
> >> > };
> >> > bless $self, $class;
> >> > $self->init(@_);
> >> > $self->db();
> >> > return $self;
> >> > }
> >> > sub init{
> >> > my $self = shift;
> >> > $self->{query_cnt} = shift;
> >> > return $self;
> >> > }
> >> > sub db {
> >> > my $self = shift;
> >> > my $db = DB->dbconnect("логин", "пароль", "база" , "хост", "utf8",
> >> > "utf8" ,
> >> > "180" );
> >> > $self->{db} = $db;
> >> > return $self;
> >> > }
> >> > return 1;
> >> >
> >> >
> >> > #!/usr/bin/perl
> >> > package DB;
> >> > use DBI;
> >> > use strict;
> >> > use warnings;
> >> >
> >> > sub dbconnect
> >> > {
> >> > my $class = shift;
> >> > my $self = {
> >> > _login => shift,
> >> > _password => shift,
> >> > _dbname => shift,
> >> > _host => shift,
> >> > _charset => shift,
> >> > _names => shift,
> >> > _timeout => shift,
> >> > };
> >> > bless $self, $class;
> >> > $self->connect();
> >> > return $self;
> >> > }
> >> >
> >> >
> >> > sub connect
> >> > {
> >> > my $self = shift;
> >> > $self->{_base} =
> >> >
> DBI->connect("DBI:mysql:database=$self->{_dbname};host=$self->{_host}",
> >> > "$self->{_login}", "$self->{_password}") or die "Unable to connect:
> >> > $DBI::errstr\n";
> >> > $self->{_base}->do("SET charset $self->{_charset}");
> >> > $self->{_base}->do("SET names $self->{_names}");
> >> > $self->{_base}->do("SET session wait_timeout=$self->{_timeout}");
> >> > }
> >> >
> >> > sub query
> >> > {
> >> > my( $self, $query ) = @_;
> >> > $self->connect() unless $self->{_base}->ping();
> >> > my $sth = $self->{_base}->prepare($query);
> >> > $sth->execute;
> >> > return (@{$sth->fetchall_arrayref({})}) and $sth->finish;
> >> > }
> >> >
> >> > sub query_rw
> >> > {
> >> > my( $self, $query ) = @_;
> >> > $self->connect() unless $self->{_base}->ping();
> >> > $self->{_base}->do($query);
> >> > }
> >> >
> >> > sub disconnect
> >> > {
> >> > my $self->{_base}->disconnect;
> >> > }
> >> >
> >> > sub db_handle
> >> > {
> >> > my $self = shift;
> >> > return $self->{_base};
> >> > }
> >> >
> >> >
> >> > return 1;
> >> >
> >> >
> >> > Как мне построить наследование, что б в неком пакете Test я мог
> >> > добраться до
> >> > объекта коннекта в базу из Core->{db} и использовать методы класса DB.
> >> >
> >> > В основном сценарии все работает в вот в последующем не получается
> >> > добраться.
> >> >
> >> > Спасибо.
> >> >
> >> >
> >> > --
> >> > Moscow.pm mailing list
> >> > moscow-pm на pm.org | http://moscow.pm.org
> >> >
> >>
> >>
> >>
> >> --
> >> С уважением, Александр
> >> Личный блог: http://eax.me/
> >> Мой форум: http://it-talk.org/
> >> Мой Twitter: http://twitter.com/afiskon
> >> --
> >> Moscow.pm mailing list
> >> moscow-pm на pm.org | http://moscow.pm.org
> >
> >
> >
> > --
> > Moscow.pm mailing list
> > moscow-pm на pm.org | http://moscow.pm.org
> >
>
>
>
> --
> Best regards,
> Andrij Panov.
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20121002/4f43dc20/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm