【发布时间】: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 实际上的地方。