Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > использование метода из другого класса


Автор: Vavilen 15.10.2011, 20:25
Добрый день!
Запутался я в ООП. Прошу помочь!

Есть Core.pm
Там производится подключение к БД MySQL.
Код

package Core;

use strict;
use warnings;
use DBI;
use DBD::mysql;

use lib ('/home/orbital/Pitch/lib');

my $database = "DB";
my $hostname = "127.0.0.1";
my $port = "3306";
my $user = "root";
my $password = "mysql";
my $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";


sub new { 
        my $class = shift;
        my $self = {};
        bless $self, $class;
        $self->{dbh} = DBI->connect($dsn,$user,$password, {RaiseError => 1,AutoCommit => 0}) or die $DBI::errstr;
      my $session = Core::Session->new();
        my $user = Core::User->new();
        return ($self , $session , $user);
};
1;

Есть Core::Session
Там ведется работа с сессией пользователя. Привел несколько методов. Их гораздо больше.
Код

use strict;
use warnings;
use lib ('/home/orbital/Pitch/lib');

package Core::Session;


use CGI::Cookie;

sub new {
    my $class= shift;
    my $self= {};
    bless $self, $class;
    return $self;
};

sub load_session {
    my $self = shift;
    my $session_id =_cookie();
    my $data_handler = $self->{dbh}->prepare("SELECT * FROM session WHERE session_id=?");
    $session_id ? $data_handler->execute($session_id) : return 0;
    my $loaded_session=$data_handler->fetchrow_hashref;
    return $loaded_session;
}#//sub load_session

sub save_session {
    my $self= shift;
    my $args;
    @_ ? $args=@_ :  $args='0';
    my $generate_session_id= generate_id();
                            #$self->session_id({});
                            $self->_session($generate_session_id);
                            my $new_session= $var->{dbh}->prepare("INSERT INTO session (session_id, data) VALUES (?,?)");
                            $new_session->execute ($generate_session_id, $args);
                            return $generate_session_id;
}


Есть Core::User
В этом пакете ведется работа с учетной записью пользователя. Привел несколько методов. Их гораздо больше.
Код

use strict;
use warnings;
use lib ('/home/orbital/Pitch/lib');

package Core::User;



sub new {
    my $class= shift;
    my $self= {};
    bless $self, $class;
    return $self;
};

sub create_user { # создание нового пользователя
    my $self= shift;
    my $params= shift; # все данные о пользователе передаются в виде ссылки на хэш, который заполняется введенными значениями в HTML странице (param)
    my $add_row= $self->{dbh}->prepare ("INSERT INTO users (login,  password,   email,  user_profile) VALUES (?,?,?,?) ");
    $add_row->execute ($params->{login}, $params->{password}, $params->{email}, $params->{user_profile});
    my $get_user_id= $self->{dbh}->{mysql_insertid}; # запрашиваем id только что созданного пользователя
    return $get_user_id;
}#// sub create_user


sub do_login { # метод осуществляет вход пользователя   
    my $self= shift;
    # следующий входной параметр (ссылка на хэш) содержит логин и пароль, введенные польлзователем в форме "авторизация"
    my $login_from_html     =    $_[0]  ->  {login};
    my $password_from_html  =    $_[0]  ->  {password};
    my $check_login_password_handler    =   $self   ->  {dbh} ->  prepare("SELECT id, login,  password,   group   FROM users WHERE login=? AND password=?");
    $check_login_password_handler   ->  execute($login_from_html,   $password_from_html);
    my $user_info_row  =   $check_login_password_handler->fetchrow_hashref;
    
    if ($user_info_row)    { # пользователь с такими login, password найден
        my $get_session = $self->load($user_info_row); # получаем данные о сессии пользователя
        my $set_cookie  =   $self->set_cookie($get_session); # формируем cookie
        return $set_cookie;
    }
    else {
        return 0;
    }
    } #// sub login


Подскажите, пожалуйста, как сделать, чтобы были доступны некоторые методы из Core::Session в Core::User, и наоборот!

Автор: Pfailed 15.10.2011, 21:01
Вынести эти методы в отдельный класс, возможно Core,  и наследоваться от него в них.

Автор: KSURi 15.10.2011, 21:56
Или читайте про композицию, как альтернативу наследованию.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)