[英]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.