想象一下,我有2个课程(我在这里简化了逻辑):
class Table {
public function addRow (Row $row){
$this->row = $row;
}
// lots of code
}
class Row {
// lots of code
}
我想扩展表类来做类似的事情,所以我创建了2个新类:
class SpecialTable extends Table{
public function addRow (SpecialRow $row){
parent::addRow($row);
}
// lots of code
}
class SpecialRow extends Row{
// lots of code
}
当我尝试将SpecialRow添加到SpecialTable对象时,我收到类似于:
的警告PHP Strict standards: Declaration of SpecialTable::addRow() should be compatible with that of Table::addRow() in /SpecialTable.php on line XX
有人可以帮助我吗?这是不好的做法,我应该以不同的方式编码吗?或者这只是一个我应该忽略的警告?
非常感谢任何建议/指导。
答案 0 :(得分:2)
如果您要更改参数类型,您应该使用类似于SpecialTable :: addSpecialRow()的名称 - 否则,SpecialTable实际上不会扩展表,重载它(PHP不支持)。
根据您的简化示例,它应该是public function addRow(Row $row)
,因为您只需要调用父级。根据您在该函数中对$ row实际执行的操作,您可以键入-hint Row
并检查代码中是否为SpecialRow
,或者如果您不需要它,则只使用Row { {1}}岬。
答案 1 :(得分:1)
确保SpecialRow从Row扩展:
class SpecialRow extends Row {
// lots of code
}
而且,SpecialTable扩展自表:
class SpecialTable extends Table {
// lots of code
}
答案 2 :(得分:1)
如果Row
和SpecialRow
没有直接关联(SpecialRow
是专门的Row
,因此应该extend Row
),您可以使用{ {3}}。如果没有一些疯狂的丑陋,PHP不支持方法重载,所以替代方案可能是这样的:
<强>接口强>:
interface IRow
{
// interface body
}
行类:
class Row implements IRow
{
}
class SpecialRow implements IRow
{
}
表类:
class Table
{
public function addRow(IRow $row)
{
$this->row = $row;
}
}
class SpecialTable
{
public function addRow(IRow $row)
{
$this->row = $row;
}
}
<强>实施强>:
$t = new Table();
$st = new SpecialTable();
$r = new Row();
$sr = new SpecialRow();
$t->addRow($r);
$st->addRow($sr);
答案 3 :(得分:0)
由于它不遵循PHP的标准,我称之为不好的做法。关键是衍生类应该始终像它的祖先一样工作。所以期望Row参数的类可以以相同的方式处理SpecialRow。你正在扩展课程,而不是超载它。我建议为此目的添加另一种方法。