だから私はこの親クラスを持っています:
class GenericHTMLElement
{
public function addElement(GenericHTMLElement $element) {}
}
これら2つのクラスによって拡張される
class ListViewItem extends GenericHTMLElement
{
}
class ListView extends GenericHTMLElement
{
/**
* @param ListViewItem $element
* @throws WrongTypeException
*/
public function addElement(GenericHTMLElement $element)
{
if (!$element instanceof ListViewItem)
{
throw new WrongTypeException("ListViewItem", $element);
}
parent::addElement($element);
}
}
これはうまくいきます。問題はListView::addElement()
、ListViewItem オブジェクトのみを引数として受け入れることが明確でないことです。
さらに、ドキュメンテーションを生成するとき、その javadoc コメントがあっても$element
型である必要があると想定します。GenericHTMLElement
ただし、typehint を変更すると、StrictStandards 警告がトリガーされます。
編集:質問を少し変更しました...
Q. メソッド オーバーライドのパラメーターを変更すると、厳格な基準に違反するのはなぜですか? 他のプログラミング言語でそれを行うことができます。そしてPHPでは、コンストラクターでそれを行うことができます
Q. この場合、厳格な基準に違反すると、どのような影響がありますか? 私が理解しているように、厳密な警告は、誰かが親クラスの署名を読み取り、その子が同じように動作すると想定する可能性があることをプログラマーに警告するように見えます。これにより、実行時エラーが発生し、実行が停止する可能性があります。しかし、それはまさに私が達成しようとしていることです。
編集:
コメントで質問されたので、これについて詳しく...
これは、コアで JQuery Mobile を使用するモバイル Web アプリケーションのテンプレート エンジンの一部です。
JQuery モバイルには、「ページ」の構造に関する特定の要件があります。jQueryMobile は、data-theme や data-position などの特定の属性も使用します。
ページの DOM を操作するには、その構造を強制する必要があります。
GenericHTMLElement は、HTML の「一般的な」ブロック (div、テーブルなど) を表します。ListView は、ul または ol に相当する jQueryMobile です。ListView は、子として ListViewItem (li) のみを持つことができます。たとえば、listView には、検索フィルターを有効または無効にする data-filter という名前のプロパティがあります。
詳細はhttp://jquerymobile.com/test/docs/api/data-attributes.htmlをご覧ください