如何在没有严格警告的情况下正确扩展使用其他扩展类的PHP类

时间:2011-05-27 18:24:09

标签: php inheritance

想象一下,我有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

有人可以帮助我吗?这是不好的做法,我应该以不同的方式编码吗?或者这只是一个我应该忽略的警告?

非常感谢任何建议/指导。

4 个答案:

答案 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)

如果RowSpecialRow没有直接关联(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);

interface

答案 3 :(得分:0)

由于它不遵循PHP的标准,我称之为不好的做法。关键是衍生类应该始终像它的祖先一样工作。所以期望Row参数的类可以以相同的方式处理SpecialRow。你正在扩展课程,而不是超载它。我建议为此目的添加另一种方法。