当您在父类和子类中使用相同的函数,但子类需要参数而父类不需要时,您将收到Strict Standards 错误。
示例
经理:
public function getAtPosition($position)
{
foreach ($this->getList() as $obj)
{
if ($obj->getPosition() == $position)
return $obj;
}
return null;
}
MenuManager 扩展了 Manager:
public function getAtPosition($position, $parent)
{
foreach ($this->getList() as $m)
{
if ($m->getParent() == $parent && $m->getPosition() == $position)
return $m;
}
return null;
}
这个例子会产生错误:
严格的标准:MenuManager::getAtPosition() 的声明应该
兼容 Manager::getAtPosition($position)
因为我们没有相同的函数参数,所以让我们欺骗这个并添加参数,即使我们没有使用它们!
经理:
public function getAtPosition($position, $dummy = 0) // Dummy to avoid Strict standards errors
{
foreach ($this->getList() as $obj)
{
if ($obj->getPosition() == $position)
return $obj;
}
return null;
}
MenuManager 扩展了 Manager:
public function getAtPosition($position, $parent = 0)
{
foreach ($this->getList() as $m)
{
if ($m->getParent() == $parent && $m->getPosition() == $position)
return $m;
}
return null;
}
唯一需要注意的是,当使用 getAtPosition() from MenuManager.class.php 时,请确保您实际上发送了 2 个参数,因为我们必须声明 $parent = 0 以匹配父级的声明。
每个扩展 Manager 且不包含 getAtPosition() 的类都将使用来自 Manager 的方法。
如果在子类中声明,php 将使用子类的方法而不是父类的方法。 PHP 中没有overloading,所以我就是这样解决它的,直到它被正确实现。