当您在父类和子类中使用相同的函数,但子类需要参数而父类不需要时,您会收到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()
都将使用方法 from Manager
。
如果在子类中声明,php 将使用子类中的方法而不是父类的方法。PHP中没有overloading
,所以我就是这样解决它的,直到它被正确实现。