所以我有这个父类:
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的属性,用于启用或禁用搜索过滤器。
的更多信息答案 0 :(得分:0)
您已经定义了addElement
方法必须接受的具体类型。
如果您现在从该类型扩展并创建一个更多特定的子类型 - 或者更好地说:不同 - ,那么您违反了该合同。
PHP通过严格的标准警告警告你。
listview元素是泛型,然后它也必须接受任何泛型。或者它是不同的,但它不能是泛型在它自己的接口中。
所以你应该不禁用严格警告,但要三思而后行。
看起来您希望在此处符合HTML DTD,只允许其他人使用某些元素。例如,不允许在<a>
标记内放置<a>
标记。但是,如果你试图将其分解为单个类型和子类型,我发现它非常高效。你不会完成你的模型 - 即使它可以用PHP正确表达。但是你应该先用自己的方式讨论这个问题。
也许标准的DOMDocument揭示了如何表示HTML。