Tiv*_*vie 5 php standards-compliance
所以我有这个父类:
class GenericHTMLElement
{
public function addElement(GenericHTMLElement $element) {}
}
Run Code Online (Sandbox Code Playgroud)
这两个类扩展了
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.问题是,ListView::addElement()仅接受ListViewItem对象作为参数并不是很清楚.
此外,在生成文档时,它假设$element应该是类型GenericHTMLElement甚至与javadoc注释.
但是,更改typehint会触发StrictStandards警告.
编辑:稍微改了一下问题......
问:为什么更改方法中的参数会覆盖违反严格标准的行为? 您可以使用其他编程语言执行此操作.在PHP中,您可以在构造函数中执行此操作
问:在这种情况下违反严格标准有什么影响? 据我了解,严格的警告似乎警告程序员,有可能有人可以读取父类的签名并假设它的孩子的行为方式相同.这可能导致运行时错误并停止执行.但这正是我想要实现的目标.
编辑:
自从评论中提出这个问题以来,有关此问题的详细信息......
这是移动Web应用程序中使用JQuery Mobile的模板引擎的一部分.
JQuery mobile对如何构建"页面"有特定要求.jQueryMobile还使用特定属性,如数据主题或数据位置.
为了操纵页面的DOM,您必须强制执行该结构.
GenericHTMLElement表示HTML的"通用"块(div,表等).ListView是与ul或ol相当的jQueryMobile.ListView只能将ListViewItem(li)作为子项.例如,listView有一个名为data-filter的属性,用于启用或禁用搜索过滤器.
有关更多信息,请访问http://jquerymobile.com/test/docs/api/data-attributes.html
您已经定义了该addElement方法必须接受的具体类型。
如果您现在从该类型扩展并创建一个更具体的子类型(或者更好地说:不同的子类型),那么您就违反了该契约。
PHP 通过严格标准警告来警告您这一点。
要么 listview 元素是通用的,然后它也必须接受任何通用的内容。或者它是不同的东西,但它在它自己的界面中不能是通用的。
因此,您不应该禁用严格警告,而应该三思而后行。
看起来您希望与此处的 HTML DTD 保持一致,该 DTD 只允许其他元素中的某些元素。例如,不允许将<a>标签放置在标签内<a>。然而,如果您尝试将其分解为单个类型和子类型,我发现它的效率非常低。您将无法完成您的模型 - 即使它可以用 PHP 正确表达。不过,您应该先与自己讨论这个问题。
也许标准 DOMDocument 可以让我们了解如何表示 HTML。
| 归档时间: |
|
| 查看次数: |
1119 次 |
| 最近记录: |