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');
Je ne sais pas si il y a un moyen de contourner cela, mais je ne suis pas surpris. La super-classe ne sais rien à propos de ses enfants ou de leurs implémentations des méthodes de la classe.
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 de

OriginalL'auteur JD Isaacks | 2011-01-20