2010-11-09 35 views
3

Ceci est ma première incursion dans la sous-classe avec perl et je me demande pourquoi je reçois cette simple erreur ...
"Impossible de trouver la méthode de l'objet" préparer "via package" WebDB :: st "sur /home/dblibs/WebDB.pm ligne 19.". Il semble trouver le module WebDB ok, mais pas le sous-programme se préparer à :: st
D'abord mon paquet est ici (les deux paquets sont dans un seul fichier, WebDB.pm)
Impossible de trouver la méthode de l'objet via le package

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; 

J'ai aussi essayé de remplacer le " notre @ISA = qw (;; st) "avec" utiliser la base 'WebDB' "et le même problème. Je pense que c'est probablement quelque chose de très simple que je néglige. Merci beaucoup! Jane

Répondre

8

Sous-classe DBI doit être fait correctement pour fonctionner correctement. Lisez attentivement le code Subclassing the DBI et définissez correctement RootClass (ou appelez explicitement connect sur votre classe racine avec @ISA défini sur DBI). Assurez-vous que WebDB :: st sous-classe DBI :: st et une classe WebDB :: db sous-classe DBI :: db (même si aucune méthode n'est surchargée). Pas besoin de reblesser.

Évitez d'utiliser base; il a un comportement malheureux qui a conduit à sa dépréciation, en particulier lorsqu'il est utilisé avec des classes qui ne sont pas dans un fichier propre. soit explicitement définie @ISA ou utilisez le nouveau parent pragma:

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

ysth! Tu gères! Cela a fonctionné très bien! Je suis en train d'éditer d'autres codes (qui malheureusement ont quitté notre société) et je suis a. heureux pour cette réponse et b. heureux de creuser plus dans le sous-classement. –

0

WebDB et WebDB::st dans un fichier ou deux? Si elles sont dans des fichiers séparés, je ne vois rien qui fasse use WebDB::st;, ce qui entraînerait le chargement de ce fichier.

Vous pouvez faire l'une de ces choses comme un remède - mettre les deux paquets dans le même fichier (qui ressemblerait exactement comme vous l'avez collé ci-dessus), ou ajouter une ligne use WebDB::st; dans WebDB.pm.

(Je voudrais aussi ajouter use strict; use warnings; dans ces deux paquets aussi.)

En outre, la fonction est de préparer pas dans ::st - il n'y a pas ensemble (à moins qu'il soit défini par ailleurs). prepare se trouve dans l'espace de noms WebDB::st - via la déclaration package. Vous déclarez cependant que WebDB::st a ::st en tant que parent.

+0

Merci Ether. Ce sont dans le même fichier. Je vais modifier cela dans. JW –

0

Si subclassing est aussi difficile que ysth semble penser, je pourrais recommander Class::Delegator CPAN. J'utilise si pour les classes qui veulent agir comme IO. Et par là, Perl est la première langue (dont je suis conscient) qui a un langage d'expression pour l'agrégation, la délégation, l'encapsulation presque égal à l'héritage.

package WebDB; 
use strict; 
use DBI; 

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

c'est seulement difficile parce que DBI essaie de faire une partie du travail pour vous et plusieurs classes sont impliquées. – ysth