gpt4 book ai didi

php - 方法覆盖和严格的标准

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:34 26 4
gpt4 key购买 nike

所以我有这个父类:

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 中,您可以在构造函数中执行此操作

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


编辑:

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

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

JQuery Mobile 对如何构建“页面”有特定的要求。 jQueryMobile 还使用特定的属性,例如数据主题或数据位置。

为了操纵页面的 DOM,您必须强制执行该结构。

GenericHTMLElement 表示 HTML 的“通用” block (div、表格等)。ListView 是 ul 或 ol 的 jQueryMobile 等价物。 ListView 只能有一个 ListViewItem (li) 作为子项。例如,listView 有一个名为 data-filter 的属性,用于启用或禁用搜索过滤器。

更多信息请访问 http://jquerymobile.com/test/docs/api/data-attributes.html

最佳答案

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

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

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

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

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

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

也许标准 DOMDocument 阐明了 HTML 的表示方式。

关于php - 方法覆盖和严格的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13220489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com