栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

覆盖私有方法时的奇怪行为

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

覆盖私有方法时的奇怪行为

继承/覆盖私有方法

在PHP中,子类中的方法(包括私有方法)为:

  • 复制;保留原始功能的范围。
  • 已替换(如果需要,则为“覆盖”)。

您可以使用以下代码查看此内容:

<?phpclass A {    //calling B::h, because static:: resolves to B::    function callH() { static::h(); }    private function h() { echo "in A::h"; }}class B extends A {    //not necessary; just to make explicit what's happening    function callH() { parent::callH(); }}$b = new B;$b->callH();

现在,如果您覆盖私有方法,则它的新作用域将不是A,它将成为B,并且调用将因为

A::callH()
在scope中运行而失败
A

<?phpclass A {    //calling B::h, because static:: resolves to B::    function callH() { static::h(); }    private function h() { echo "in A::h"; }}class B extends A {    private function h() { echo "in B::h"; }}$b = new B;$b->callH(); //fatal error; call to private method B::h() from context 'A'

调用方式

这里的规则如下:

  • 查看 对象 实际类 的方法表(在您的情况下为
    bar
    )。
    • 如果产生 私有方法
    • 如果定义方法的范围与调用函数的范围相同并且与对象的类相同,请使用它。
    • 否则,请在父类中查找一个私有方法,该私有方法的范围与调用函数之一的范围相同,并且名称相同。
    • 如果找不到满足上述要求之一的方法,则失败。
    • 如果这产生了 公共/受保护的方法
    • 如果方法的范围标记为已更改,则我们可能已用私有/受保护的方法覆盖了私有方法。因此,在这种情况下,如果另外还有一个与调用函数的作用域定义的私有名称相同的方法,请改用该方法。
    • 否则,请使用找到的方法。

结论

  1. (均为私人)对于
    bar->call()
    ,范围
    call
    foo
    。调用会
    $this->m()
    bar
    for 的方法表中进行查找
    m
    ,从而产生一个private
    bar::m()
    。但是,的范围
    bar::m()
    不同于调用范围
    foo
    foo:m()
    在遍历层次结构时找到该方法,而使用该方法。
  2. (私人
    foo
    ,公共参与
    bar
    )的范围
    call
    仍然
    foo
    。查找产生公众
    bar::m()
    。但是,其作用域被标记为已更改,因此在
    foo
    method 的调用作用域的功能表中进行了查找
    m()
    。这将产生一个
    foo:m()
    与调用范围具有相同范围的私有方法,因此将其代替。
  3. 在这里什么也看不到,因为可见度降低而出错。
  4. call
    均为公众)的范围仍然是
    foo
    。查找产生公众
    bar::m()
    。它的范围未标记为已更改(它们都是公开的),因此
    bar::m()
    使用。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/421668.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号