【问题标题】:Method Overriding and Strict Standards方法压倒一切和严格标准
【发布时间】:2012-10-24 14:28:22
【问题描述】:

所以我有这个父类:

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 注释也是如此。

但是,更改类型提示会触发 StrictStandards 警告。


编辑:稍微改变了问题...

问。为什么更改方法中的参数会违反严格标准? 你可以用其他编程语言来做到这一点。而在 PHP 中,你可以在构造函数中做到这一点

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


编辑:

既然在cmets中被问到,关于这个的更多细节......

这是来自移动 Web 应用程序的模板引擎的一部分,其核心使用 JQuery Mobile。

JQuery 移动版对如何构建“页面”有特定要求。 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

【问题讨论】:

  • 为什么ListView 扩展GenericHTMLElement?为什么后者在这里是一个类,而不是一个接口?
  • ??因为您应该能够实例化 GenericHTMLElement 类的对象。 ListView 和 ListViewItem 只是特殊的 GenericHTMLElements
  • 在ListView中,不能只定义addElement(ListViewItem $element);吗?
  • @Stefan 它触发了严格标准警告
  • 恕我直言,我只是不明白如何实例化 Generic 元素;对我来说,它看起来更像是一个抽象类或接口,这取决于它是定义行为的一部分 - 还是只是相应对象的外部。至于ListItem 扩展这个,嗯...它看起来像Composite pattern 实际上的地方。

标签: php standards-compliance


【解决方案1】:

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

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

PHP 会通过严格标准警告向您发出警告。

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

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

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

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

【讨论】:

  • 谢谢。我正在使用 DOMDocument,这些类实际上是包装器。我们不会为 HTML 中的每个标签创建一个类,只是那些相关的。 (实际上他们已经完成了,测试也是如此)jquerymobile.com/test/docs/api/data-attributes.html
  • 我们采用了Android API的模型,其中布局元素继承自同一个基类(View)。
  • 那么为什么在 PHP 中覆盖参数不好呢?
  • @KaernStone:覆盖参数本身还不错。但是如果你定义了一个接口但你不遵守它,那么这表明你已经实现(或可能定义)了错误的接口。
猜你喜欢
  • 2013-03-31
  • 2013-05-08
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2013-01-08
相关资源
最近更新 更多