親クラスと子クラスで同じ関数を使用しているが、子クラスにはパラメーターが必要で、親クラスには必要ない場合、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
しないので、適切に実装されるまではそのように回避しました。