PHP étendue de classe pas de fonction dominante?
De Classe "A", j'ai ceci:
protected function createTempTable()
{
$qry = '
CREATE TABLE `'.$this->temp_table.'` (
`style` VARCHAR( 255 ) NOT NULL ,
`description` VARCHAR( 255 ) NOT NULL ,
`metal` VARCHAR( 255 ) NOT NULL ,
`available` VARCHAR( 255 ) NOT NULL ,
`center_stone` VARCHAR( 255 ) NOT NULL ,
`total_weight` VARCHAR( 255 ) NOT NULL ,
`price` DECIMAL( 10, 2 ) NOT NULL ,
PRIMARY KEY ( `style` )
) ENGINE = MYISAM ;
';
$pdo = PDOManager::getConnection();
$sth = $pdo->query($qry);
}
Class B extends de catégorie A et a de ce:
protected function createTempTable()
{
$qry = '
CREATE TABLE `'.$this->temp_table.'` (
`style` VARCHAR( 255 ) NOT NULL ,
`syn10` DECIMAL( 10, 2 ) NOT NULL ,
`gen10` DECIMAL( 10, 2 ) NOT NULL ,
`syn14` DECIMAL( 10, 2 ) NOT NULL ,
`gen14` DECIMAL( 10, 2 ) NOT NULL ,
PRIMARY KEY ( `style` )
) ENGINE = MYISAM ;
';
$pdo = PDOManager::getConnection();
$sth = $pdo->query($qry);
}
ClassB ne fait pas appel createTempTable
il permet, il est super classe ClassA l'appeler.
Donc, en théorie, quand je crée un nouveau ClassB
la classe, c'est super classe appels createTempTable()
qui devrait utiliser ClassB de remplacer la version de la fonction. Cependant, il n'est pas, il utilise toujours les ClassA de la version. J'ai confirmé cela en effectuant un SHOW CREATE TABLE
de l'intérieur ClassB. J'ai attendu d'avoir un syn10
colonne à la place j'ai eu un description
colonne.
Pourquoi est-ce?
edit:
Voici le code de la classe A qui appelle la createTempTable
fonction:
public function processPriceSheet ($file, $test = false)
{
if(!file_exists($file))
{
die('The file "'.$file.'" does not exist.');
}
$fp = fopen($file,'r');
$this->createTempTable();
while (!feof($fp))
{
$row = fgetcsv($fp);
$this->processLine($row);
}
fclose($fp);
$products_updates = $this->massUpdate();
$this->findMissingFromDB();
$this->findMissingFromCSV();
return $products_updates;
}
Ici est de savoir comment ClassA commence:
class AdvancedCsvFeed
{
protected $vendor_prefix;
protected $style_column;
protected $price_column;
protected $price_multiplier;
protected $instock_column;
protected $temp_table = 'csv_tmp';
public function __construct($price_column, $style_column, $vendor_prefix = '', $price_multiplier = 1, $instock_column = 0)
{
$this->vendor_prefix = $vendor_prefix;
$this->price_column = $price_column;
$this->style_column = $style_column;
$this->price_multiplier = $price_multiplier;
$this->instock_column = $instock_column;
}
... other functions
C'est de cette façon classB commence:
class MothersRingsAdvancedCsvFeed extends AdvancedCsvFeed
{
private $syn10_price_column;
private $gen10_price_column;
private $syn14_price_column;
private $gen14_price_column;
public function __construct($syn10_price_column, $gen10_price_column, $syn14_price_column, $gen14_price_column, $style_column, $price_multiplier = 3)
{
$this->syn10_price_column = $syn10_price_column;
$this->gen10_price_column = $gen10_price_column;
$this->syn14_price_column = $syn14_price_column;
$this->gen14_price_column = $gen14_price_column;
$this->style_column = $style_column;
$this->price_multiplier = $price_multiplier;
}
... other functions
Et c'est de cette façon classB est lancé:
$s = new MothersRingsAdvancedCsvFeed(2,3,4,5,1);
echo $s->processPriceSheet('mothers_rings.csv');
Dufel, c'est vrai, mais de la façon dont je comprends la programmation orientée objet, la super-classe ne fonctionne toujours pas. Si je lance un ClassA ensuite, il ne connaît aucune ClassB. Cependant lorsque je lance un ClassB, toutes les références à tout les membres doivent d'abord référence à la remplacé membres définis à l'ClassB, et seulement alors se rabattre sur les membres de ClassA si elles ne sont pas remplacées dans classB. Sinon, quel est le point d'annuler quoi que ce soit?
Donc, nous les définitions de classe. La façon dont vous l'avez posté il remplace la méthode...
Hmm, je devrais avoir lu votre code plus soigneusement que le premier commentaire était basé sur ce que vous avez dit au fond. Jamais l'esprit.
Ajouter un peu de débogage crochets pour essayer de voir qui est en train d'être couru. Vous avez peut-être l'appel de classe A
createTempTable
méthode de quelque part d'autre. Ajouter un peu de backtraces et die() ou mieux encore utiliser XDebug de tracer les appels à essayer de voir où l'erreur provient deOriginalL'auteur JD Isaacks | 2011-01-20
Vous devez vous connecter pour publier un commentaire.
EDIT: j'ai remarqué que la deuxième classe ne change pas la valeur de
$temp_table
. Vous pouvez avoir une collision ici: est-il possible que certains autresAdvancedCsvFeed
est la création de la table MySQLcsv_tmp
d'abord, et l'appel à$s->processPriceSheet
ne parvient pas à créer la table parce qu'il existe déjà? Essayez d'avoir le constructeur deMothersRingsAdvancedCsvFeed
ensembleORIGINAL:
Il doit y avoir quelque chose d'autre à jouer ici. Considérons le code suivant:
Quand je le lance, j'ai le résultat suivant:
Donc, il doit y avoir quelque chose d'autre touchant votre code. Pouvez-vous partager un peu plus de code, plus précisément ce que les appels
createTempTable()
?J'ai une idée, laissez-moi savoir si c'est ça, toujours la pensée des autres...
ok eh bien au moins je sais que c'est censés pour faire ce que je m'attends à ce que, à votre exemple prouve que. si je figure sur ce qui se passe, je vais poster une réponse ici. Merci.
Je ne comprends pas pourquoi cela fait une différence, mais j'ai ajouté
protected $temp_table = 'mr_csv_tmp';
de classe B de la définition et il a fixé le problème.votre droit, je n'étais pas le supprimer. Donc la fonction EST prise en substituée mais la table MySQL a déjà été créé, qui ne sont PAS remplacées. Maintenant, il fait sens pour moi. Merci.
OriginalL'auteur Josh