无法通过包子类DBI定位对象方法

Jan*_*kie 3 oop perl subclass dbi

这是我第一次尝试使用perl进行子类化,我想知道为什么我会得到这个简单的错误...
"无法在/home/dblibs/WebDB.pm中通过包"WebDB :: st"找到对象方法"prepare"第19行." 它似乎找到了模块WebDB ok,但没有找到~st的prepare子例程
首先这里是我的包(两个包都在一个文件中,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;
Run Code Online (Sandbox Code Playgroud)

我也尝试用"use base'WebDB'"替换"我们的@ISA = qw(;; st)"和同样的问题.我认为这可能是我非常简单的事情.非常感谢!简

yst*_*sth 10

必须完成子类化DBI才能正常工作.阅读仔细对DBI进行子类化并正确设置RootClass(或者在根类上显式调用connect,并将@ISA设置为DBI).确保你有WebDB :: st子类化DBI :: st和一个WebDB :: db类子类化DBI :: db(即使没有被覆盖的方法).无需重新考虑.

避免使用base; 它有一些不幸的行为导致它被弃用,特别是当与不属于自己的文件的类一起使用时.显式设置@ISA或使用更新的parentpragma:

package WebDB;
use parent 'DBI';
...
package WebDB::db;
use parent -norequire => 'DBI::db';
...
package WebDB::st;
use parent -norequire => 'DBI::st';
...
Run Code Online (Sandbox Code Playgroud)