簡體   English   中英

PHP擴展類沒有覆蓋函數?

[英]PHP extended class not overriding function?

在類AI上有這樣的:

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);
}

B類擴展了A類並具有:

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實際上並沒有調用createTempTable它讓它的超類ClassA調用它。

所以從理論上講,當我創建一個新的ClassB類時,它的超類調用createTempTable() ,它應該使用ClassB的函數覆蓋版本。 但事實並非如此,它仍然使用ClassA的版本。 我通過從ClassB內部執行SHOW CREATE TABLE來確認這一點。 我希望有一個syn10列,而不是我有一個description列。

為什么是這樣?

編輯:

以下是調用createTempTable函數的A類代碼:

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;
}

以下是ClassA的開始:

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

這就是classB的開始:

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

這就是classB的啟動方式:

$s = new MothersRingsAdvancedCsvFeed(2,3,4,5,1);
echo $s->processPriceSheet('mothers_rings.csv');

編輯:我注意到第二個類不會更改$temp_table的值。 你可能在這里發生了一次沖突:是否有可能其他一些AdvancedCsvFeed首先創建MySQL表csv_tmp ,而對$s->processPriceSheet的調用無法創建表,因為它已經存在了? 嘗試使用MothersRingsAdvancedCsvFeed集的構造函數

$this->temp_table = 'mothers_rings_csv_tmp';

原版的:

這里肯定還有別的東西在玩。 請考慮以下代碼:

<?php

class TestOne {
  public function foo() {
    echo "TestOne's foo.";
  }
  public function bar() {
    $this->foo();
    echo " TestOne's bar.";
  }
}
class testTwo extends TestOne {
  public function foo() {
    echo "TestTwo's foo.";
  }
}

$one = new TestOne();
$two = new TestTwo();

$one->foo();
$two->foo();

$one->bar();
$two->bar();

當我運行上面的操作時,我得到了輸出:

TestOne的foo.TestTwo的foo.TestOne的foo。 TestOne的吧.TestTwo的foo。 TestOne的吧。

因此,必須有其他因素影響您的代碼。 你能分享一些代碼,特別是調用createTempTable()的代碼嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM