5

所以我有这个父类:

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 还使用特定的属性,例如 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 元素要么是通用的,然后它也必须接受任何通用的东西。或者它是不同的东西,但它不能在它自己的界面中是通用的。

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

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

也许标准 DOMDocument 对如何表示 HTML 有所了解。

于 2012-11-04T16:59:27.423 回答