相关疑难解决方法(0)

PHP子类可以改变重写方法的参数吗?

我可以覆盖子类中的PHP方法并更改签名中的参数,如下所示.

class theParent {
  function myMethod($param1) {
    // code here
  }
}

class theChild extends theParent {
  function myMethod($param1, $param2) {
    // code here
  }
}
Run Code Online (Sandbox Code Playgroud)

我测试了它,它工作正常,不会引起任何错误.我的问题是,这是不好的形式?还是OOP的基本原则?

如果父方法被声明为abstract,则子签名不能偏离.据推测,如果您需要强制执行界面的这一方面,这是使用的机制?

php oop

6
推荐指数
1
解决办法
5206
查看次数

方法覆盖和严格的标准

所以我有这个父类:

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

php standards-compliance

5
推荐指数
1
解决办法
1119
查看次数

标签 统计

php ×2

oop ×1

standards-compliance ×1