Поэтому у меня есть этот родительский класс:
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
Вы уже определили конкретный тип, который должен принять метод addElement
.
Если вы теперь расширяетесь от этого типа и создаете более определенный подтип – или лучше сказано: другое – вы нарушаете этот контракт.
PHP предупреждает вас об этом со строгим стандартным предупреждением.
Либо элемент listview является общим, а затем он должен принимать все общие . Или это нечто другое, но тогда оно не может быть общим в собственном интерфейсе .
Поэтому вы не должны отключать строгое предупреждение, но дважды подумайте, что вы там делаете.
Похоже, вы хотите быть в соответствии с HTML DTD здесь, что позволяет только некоторые элементы внутри других. Например, нельзя помещать тег <a>
внутри тега <a>
. Однако я считаю, что это очень непроизводительно, если вы пытаетесь разбить это на отдельные типы и подтипы. Вы не закончите свою модель – если даже она может быть правильно выражена с помощью PHP. Однако вы должны обсудить это с вашим первым.
Возможно, стандартный DOMDocument проливает свет на то, как HTML может быть представлен.