方法覆盖和严格的标准

Tiv*_*vie 5 php standards-compliance

所以我有这个父类:

class GenericHTMLElement
{
    public function addElement(GenericHTMLElement $element) {}
}
Run Code Online (Sandbox Code Playgroud)

这两个类扩展了

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.问题是,ListView::addElement()仅接受ListViewItem对象作为参数并不是很清楚.

此外,在生成文档时,它假设$element应该是类型GenericHTMLElement甚至与javadoc注释.

但是,更改typehint会触发StrictStandards警告.


编辑:稍微改了一下问题......

问:为什么更改方法中的参数会覆盖违反严格标准的行为? 您可以使用其他编程语言执行此操作.在PHP中,您可以在构造函数中执行此操作

问:在这种情况下违反严格标准有什么影响? 据我了解,严格的警告似乎警告程序员,有可能有人可以读取父类的签名并假设它的孩子的行为方式相同.这可能导致运行时错误并停止执行.但这正是我想要实现的目标.


编辑:

自从评论中提出这个问题以来,有关此问题的详细信息......

这是移动Web应用程序中使用JQuery Mobile的模板引擎的一部分.

JQuery mobile对如何构建"页面"有特定要求.jQueryMobile还使用特定属性,如数据主题或数据位置.

为了操纵页面的DOM,您必须强制执行该结构.

GenericHTMLElement表示HTML的"通用"块(div,表等).ListView是与ul或ol相当的jQueryMobile.ListView只能将ListViewItem(li)作为子项.例如,listView有一个名为data-filter的属性,用于启用或禁用搜索过滤器.

有关更多信息,请访问http://jquerymobile.com/test/docs/api/data-attributes.html

hak*_*kre 0

您已经定义了该addElement方法必须接受的具体类型。

如果您现在从该类型扩展并创建一个具体的子类型(或者更好地说:不同的子类型),那么您就违反了该契约。

PHP 通过严格标准警告来警告您这一点。

要么 listview 元素是通用的,然后它也必须接受任何通用的内容。或者它是不同的东西,但它在它自己的界面中不能是通用的

因此,您应该禁用严格警告,而应该三思而后行。

看起来您希望与此处的 HTML DTD 保持一致,该 DTD 只允许其他元素中的某些元素。例如,不允许将<a>标签放置在标签内<a>。然而,如果您尝试将其分解为单个类型和子类型,我发现它的效率非常低。您将无法完成您的模型 - 即使它可以用 PHP 正确表达。不过,您应该先与自己讨论这个问题。

也许标准 DOMDocument 可以让我们了解如何表示 HTML。