5

だから私はこの親クラスを持っています:

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をご覧ください

4

1 に答える 1

0

addElementメソッドが受け入れる必要のある具象型はすでに定義されています。

ここでそのタイプから拡張して、より具体的なサブタイプを作成する場合、またはより適切に言えば、異なる場合、その契約を破っています。

PHPは、厳格な標準警告でそのことを警告します。

listview要素はジェネリックであり、ジェネリックも受け入れる必要があります。または、それは何か違うものですが、それ自体のインターフェースでは一般的ではありません。

したがって、厳密な警告を無効にするのではなく、そこで何をするかをよく考えてください。

ここでは、他の要素内の特定の要素のみを許可するHTMLDTDに準拠する必要があるようです。たとえば、<a>タグをタグ内に配置することは許可されていません<a>。ただし、それを個々のタイプとサブタイプに分解しようとすると、非常に非生産的であることがわかります。モデルを完成させることはできません-たとえそれがPHPで適切に表現できれば。ただし、最初に自分自身とそれについて話し合う必要があります。

たぶん、標準のDOMDocumentは、HTMLをどのように表現できるかを明らかにするでしょう。

于 2012-11-04T16:59:27.423 に答える