所以我有这个父类:
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