在A类上,我有以下内容:
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的父类(super class)来调用。因此,从理论上讲,当我创建一个新的
ClassB
类时,它的父类(super class)将调用createTempTable()
,它应使用ClassB的函数的替代版本。但是,它没有,它仍然使用ClassA的版本。我通过在ClassB内部执行SHOW CREATE TABLE
来确认这一点。我希望有一个syn10
列,而我有一个description
列。为什么是这样?
编辑:
这是来自类A的调用
createTempTable
函数的代码: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();
当我运行上面的代码时,我得到了输出:
因此,必须有其他因素影响您的代码。您是否可以共享更多代码,尤其是所谓的
createTempTable()
?关于PHP扩展类不具有覆盖功能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4751390/