方法覆盖和严格的标准

时间:2012-11-04 16:33:46

标签: php standards-compliance

所以我有这个父类:

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对象作为参数并不是很清楚。

此外,在生成文档时,即使使用该javadoc注释,它也假定$element的类型为GenericHTMLElement

但是,更改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

的更多信息

1 个答案:

答案 0 :(得分:0)

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

如果您现在从该类型扩展并创建一个更多特定的子类型 - 或者更好地说:不同 - ,那么您违反了该合同。

PHP通过严格的标准警告警告你。

listview元素是泛型,然后它也必须接受任何泛型。或者它是不同的,但它不能是泛型在它自己的接口中。

所以你应该禁用严格警告,但要三思而后行。

看起来您希望在此处符合HTML DTD,只允许其他人使用某些元素。例如,不允许在<a>标记内放置<a>标记。但是,如果你试图将其分解为单个类型和子类型,我发现它非常高效。你不会完成你的模型 - 即使它可以用PHP正确表达。但是你应该先用自己的方式讨论这个问题。

也许标准的DOMDocument揭示了如何表示HTML。