2010-11-09 66 views
3

這是我第一次進入使用perl進行子類化,我想知道爲什麼我得到這個簡單的錯誤...
「無法找到對象方法」準備「通過包」WebDB :: st「在/home/dblibs/WebDB.pm第19行。」這似乎找到該模塊WebDB確定,但不是在:: ST
的準備子程序 首先這裏是我的包(兩種封裝在一個文件中,WebDB.pm)
無法通過程序包找到對象方法

package WebDB; 
use strict; 
use DBI; 

sub connect { 
    my $dbh = (DBI->connect ("DBI:mysql:test:127.0.0.1", "root","", 
        { PrintError => 1, RaiseError => 0 })); 
    return bless $dbh, 'WebDB::st'; 
} 

package WebDB::st; 
our @ISA = qw(::st); 
sub prepare { 
    my ($self, $str, @args) = @_; 
    $self->SUPER::prepare("/* userid:$ENV{USER} */ $str", @args); 
} 


1; 

我也試過更換「我們的@ISA = qw(;; st)「與」use base'WebDB'「以及同樣的問題。 我在想這可能是我忽略的一件很簡單的事情。非常感謝!簡

回答

8

繼承DBI必須正確完成。仔細閱讀Subclassing the DBI,並正確設置RootClass(或者在@ISA設置爲DBI的情況下,在根類上顯式調用connect)。確保你有WebDB :: st子類DBI :: st和一個WebDB :: db類子類DBI :: db(即使沒有方法被覆蓋)。無需重新分配。

避免使用base;它有一些不幸的行爲導致了它的貶低,特別是當它們與不在自己文件中的類一起使用時。 明確地設置@ISA或使用較新的parent編譯:

package WebDB; 
use parent 'DBI'; 
... 
package WebDB::db; 
use parent -norequire => 'DBI::db'; 
... 
package WebDB::st; 
use parent -norequire => 'DBI::st'; 
... 
+0

ysth!你搖滾!這很好!我正在編輯一些其他代碼(不幸離開了我們公司),我是 a。很高興爲這個答案和b。樂於挖掘更多的子類。 – 2010-11-09 17:10:19

0

WebDBWebDB::st在一個文件或兩個?如果他們在單獨的文件中,我看不到任何正在執行的操作,這會導致該文件被加載。

您可以將這兩種方法中的任何一種作爲補救措施 - 將兩個軟件包放在同一個文件中(看起來就像上面粘貼的那樣),或者在WebDB.pm中添加一行use WebDB::st;

(我也想在這兩個包添加use strict; use warnings;了。)

而且,準備功能,::st - 有沒有這樣的包(除非它在別處定義)。 prepare位於WebDB::st命名空間 - 通過package聲明。但是您聲明WebDB::st作爲父母具有::st

+0

謝謝乙醚。這些都在同一個文件中。我將編輯它。JW – 2010-11-09 16:48:13

0

如果子類是棘手,因爲YSTH似乎覺得,我可能會從CPAN建議Class::Delegator。我使用如果想要像IO那樣行事的課程。通過它,Perl是第一種語言(我知道)具有用於聚合,委派,封裝的表達式語言幾乎與繼承相同。

package WebDB; 
use strict; 
use DBI; 

use Class::Delegator 
    send => [ qw<connect ...> ] 
    , to => '{_dbihandle}' 
    ... 
    ; 
+0

這只是棘手的,因爲DBI試圖爲你做一些工作,並涉及多個類。 – ysth 2013-02-21 18:26:05

相關問題