Переопределение метода и строгие стандарты

Поэтому у меня есть этот родительский класс:

class GenericHTMLElement { public function addElement(GenericHTMLElement $element) {} } 

который распространяется на эти два класса

 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 как аргумент.

Более того, при создании документации предполагается, что $element должен иметь тип GenericHTMLElement даже с этим комментарием javadoc.

Тем не менее, изменение typehint запускает предупреждение StrictStandards.


EDIT: немного изменил вопросы …

В. Почему изменяется параметр в методе, нарушающем строгие стандарты? Вы можете сделать это на других языках программирования. И в PHP вы можете сделать это в конструкторе

В. Каковы последствия нарушения строгих стандартов в этом случае? Насколько я понимаю, строгое предупреждение предупреждает программиста, что есть вероятность, что кто-то может прочитать подпись родительского класса и предположить, что дети ведут себя одинаково. Это может привести к ошибке во время выполнения и прекратить выполнение. Но это именно то, чего я пытаюсь достичь.


РЕДАКТИРОВАТЬ:

Поскольку это было задано в комментариях, более подробная информация об этом …

Это часть механизма шаблонов из мобильных веб-приложений, в котором в основном используется JQuery Mobile.

JQuery mobile имеет особые требования относительно структуры «страницы». jQueryMobile также использует определенные атрибуты, такие как данные-тема или позиция данных.

Чтобы управлять DOM страницы, вам необходимо обеспечить соблюдение этой структуры.

GenericHTMLElement представляет собой «общий» блок HTML (div, таблица и т. Д.). ListView – эквивалент jQueryMobile для ul или ol. ListView может иметь только ListViewItem (li) в качестве дочерних элементов. Например, в ListView есть свойство с именем data-filter, которое включает или отключает фильтр поиска.

подробнее на странице http://jquerymobile.com/test/docs/api/data-attributes.html

Related of "Переопределение метода и строгие стандарты"

Вы уже определили конкретный тип, который должен принять метод addElement .

Если вы теперь расширяетесь от этого типа и создаете более определенный подтип – или лучше сказано: другое – вы нарушаете этот контракт.

PHP предупреждает вас об этом со строгим стандартным предупреждением.

Либо элемент listview является общим, а затем он должен принимать все общие . Или это нечто другое, но тогда оно не может быть общим в собственном интерфейсе .

Поэтому вы не должны отключать строгое предупреждение, но дважды подумайте, что вы там делаете.

Похоже, вы хотите быть в соответствии с HTML DTD здесь, что позволяет только некоторые элементы внутри других. Например, нельзя помещать тег <a> внутри тега <a> . Однако я считаю, что это очень непроизводительно, если вы пытаетесь разбить это на отдельные типы и подтипы. Вы не закончите свою модель – если даже она может быть правильно выражена с помощью PHP. Однако вы должны обсудить это с вашим первым.

Возможно, стандартный DOMDocument проливает свет на то, как HTML может быть представлен.