Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Bazil                                2:5020/400     10 Jul 2002  20:51:38
 To : Artem Chuprina
 Subject : Re[2]: область видимости
 -------------------------------------------------------------------------------- 
 
 Приветствую Вас, Artem!
 
 B>> Следующий код:
 
 B>> use DBI;
 
 B>> our $_dbh = undef;
 
 B>> sub connect
 B>> {
 B>>     ...
 B>>     $_dbh = DBI->connect(...) || ...;
 B>>     ...
 B>>     return $_dbh;
 B>> }   ^^^^^^^^^^^^^ здесь варнинг 'Database handle destroyed without explicit 
 B>> disconnect'
 
 B>> DESTROY или END
 B>> {
 B>>     $_dbh->disconnect() if $_dbh;
 B>> }
 
 B>> Вопрос: почему возникает варнинг? Переменная ведь не вышла за область
 B>> видимости. Как это лечится?
 
 AC> А ты уверен, что при return, а не при connect (оттого, что затирается
 AC> предыдущее значение)?
 
 Абсолютно
 
 AC>  И потом, извиняюсь, чего там DESTROY?
 
 Объекта, методом класса которого является connect. Да это неважно,
 можно заменить на END. Я не стал приводить лишний код (в том числе
 конструктор), не имеющий отношения к вопросу. Видимо, все-таки
 придется уточнить детали.
 Есть базовый класс, реализующий интерфейс БД. И некоторое количество
 наследуемых от него классов. Предупреждение возникает в экземпляре
 любого потомка. Варнинг типа рантайм.
 Полный текст базового класса:
 
 package DB;
 
 use strict;
 use warnings;
 use DBI;
 
 our $_dbh = undef;
 
 sub dbh { $_dbh }
 
 sub db_errstr { $_dbh->errstr() }
 
 sub new
 {
     my ( $class, %connect_params ) = @_;
 
     my $self = {};
 
     bless $self, $class;
 
     if( %connect_params )
     {
         $self->connect( %connect_params );
     }
 
     return $self;
 }
 
 sub connect
 {
     my ( $self, %connect_params ) = @_;
 
     $_dbh = DBI->connect
     (
         'DBI:'       . $connect_params{ 'DB_DRIVER' }   .
         ':database=' . $connect_params{ 'DB_NAME' }     .
         ';host='     . $connect_params{ 'DB_HOST' }     .
         ';port='     . $connect_params{ 'DB_PORT' }     ,
                        $connect_params{ 'DB_USER' }     ,
                        $connect_params{ 'DB_PASSWORD' }
     )
         || die $DBI::errstr;
 
     return $_dbh;
 }
 
 DESTROY
 {
     $_dbh->disconnect() if $_dbh;
 }
 
 1;
 
 --
 Причем, интересно: опускаешь return $_dbh в connect - варнинг
 появляется в конструкторе. Мистика какая-то... :)
 
 Удачи!
  Bazil
 -Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 
 --- ifmail v.2.15dev5
  * Origin: Talk.Mail.Ru (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 область видимости   Bazil   29 Jun 2002 19:56:06 
 Re: область видимости   Konstantin Stupnik   02 Jul 2002 12:43:53 
 Re: область видимости   Artem Chuprina   09 Jul 2002 13:55:13 
 Re[2]: область видимости   Bazil   10 Jul 2002 20:51:38 
 Re: область видимости   Andrey Sapozhnikov   10 Jul 2002 21:11:57 
 Re: область видимости   Konstantin Stupnik   11 Jul 2002 09:20:33 
Архивное /ru.perl/174413cc3feea.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional