我很难尝试理解以下代码的输出:

class Bar

{

public function test() {

$this->testPublic();

$this->testPrivate();

}

public function testPublic() {

echo "Bar::testPublic\n";

}

private function testPrivate() {

echo "Bar::testPrivate\n";

}

}

class Foo extends Bar

{

public function testPublic() {

echo "Foo::testPublic\n";

}

private function testPrivate() {

echo "Foo::testPrivate\n";

}

}

$myFoo = new foo();

$myFoo->test();

输出:

Foo::testPublic

Bar::testPrivate

Foo类重写了testPublic()和testPrivate(),并继承了test().当我调用test()时,有一个显式指令包含$this伪变量,因此在创建$myFoo实例后,test()函数的最终调用将是$myFoo-> testPublic()和$myFoo-> testPrivate().第一个输出正如我所料,因为我将testPublic()方法重写为echo Foo :: testPublic.但第二个输出对我来说毫无意义.如果我覆盖testPrivate()方法,为什么Bar :: testPrivate?根据定义,无论如何也不会继承父类的私有方法!这没有道理.为什么父方法被称为???

解决方法:

您的代码的问题是方法Bar :: testPrivate是私有的,因此子类不能覆盖它.对于初学者,我建议您阅读PHP-http://www.php.net/manual/en/language.oop5.visibility.php中的可见性.在那里您将了解到只有公共和受保护的类成员方法/属性可以被覆盖,而私有成员方法/属性不能被覆盖.

举个例子,尝试将Bar :: testPrivate方法的可见性更改为public或protected,而不更改示例代码中的任何其他内容.现在尝试运行测试.怎么了?这个:

PHP Fatal error: Access level to Foo::testPrivate() must be protected (as in class Bar) or weaker

最大的问题是:“为什么?”.好吧,你现在用私有的Foo:testPrivate覆盖了Bar :: testPrivate.这个新的私有方法超出了Bar :: test的范围,因为私有类成员只对其当前类可见,而不是父/子类!

因此,正如您所看到的,OOP为类成员提供了一定量的封装,如果您不花时间去理解它,可能会非常混乱.

标签:php,oop,override,visibility

来源: https://codeday.me/bug/20190831/1772887.html

php 继承 可见性,php – 私有方法覆盖和可见性相关推荐

  1. java可以继承私有的,关于java:继承中的私有方法

    这是一个有趣的代码片段: public class Superclass { public static void main (String[] args){ Superclass obj = new ...

  2. 传智播客python笔记_python传智播客笔记--第十天:隐藏属性,私有属性,私有方法,__del__方法,类的继承,类中方法的重写...

    封装,继承,多态 隐藏属性,私有属性,私有方法,__del__方法,类的继承,类中方法的重写 -**************************************************** ...

  3. java:方法覆盖与方法重载

    方法签名 方法签名是指方法的参数类型,顺序和个数.不包含方法名称. 重载 重载必须满足以下条件 方法名 相同 方法的参数类型,个数和顺序至少一项不同 方法的返回类型可以不同 方法的访问权限修饰符可以不 ...

  4. 类属性,实例属性,私有属性,类方法,实例方法,静态方法,私有方法,魔法方法

    实例对象可以调用实例方法/属性.静态方法.类方法/属性,类对象只能调用静态方法和类方法/属性 dir()函数不带参数时,返回当前范围内的变量.方法和定义的类型列表 dir()函数带参数时会返回该参数的 ...

  5. Java的子类可以继承父类的私有变量和私有方法吗?

    答:实际上继承了. 父类的成员变量(包含私有变量)和成员方法地址(包含私有成员方法)都存放在子类对象中.父类的私有变量和私有方法虽然在子类对象中,但是对于子类对象而言是不可见的,无法直接访问和调用,必 ...

  6. java多态 覆盖_Java ------ 继承、方法覆盖、多态

    一.什么是继承 面向对象的三大特性: 封装. 继承.多态: 继承就是子类型将父类型的的属性继承到自己类中进行使用,通过继承的方式子类型可以使用父类型的属性和方法,并且,继承只能单重继承,无法多继承,但 ...

  7. Python类中公开方法、私有方法和特殊方法的继承原理

    在Python中,对象的私有成员在类外部.派生类或程序中无法直接访问,但是可以通过"对象名._类名__私有成员名"这样一种特殊的形式来访问. 基类的构造方法和公开方法可以在类的外部 ...

  8. Java——继承、方法覆盖

    继承 一.继承的作用 基本作用:子类继承父类,代码可以得到复用. 主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制. 二.继承的相关特性 B类继承A类,则称A类为超类(supercl ...

  9. python_day6_面向对象的介绍/构造函数/类变量和实例变量/析构函数/私有属性和私有方法/继承、多继承和继承实例/多态

    python_面向对象的介绍/构造函数/类变量和实例变量/析构函数/私有属性和私有方法/继承.多继承和继承实例/多态 在这里得感谢,老师Alex金角大王(路飞学城IT) Python(给兄弟们挂个

最新文章

  1. 多实例gpu_MIG技术快速提高AI生产率
  2. 波士顿房价数据可视化
  3. 78. Subsets
  4. OJ1037: 四则运算
  5. [Node.js] 模块化 -- NodeJS之heroAdmin后台管理系统基础
  6. 这真不是网友P的图?雷军微博曝光小米9 SE真机图 彩虹小米有点炫酷
  7. (Android)java虚拟机和Dalvik虚拟机的区别
  8. 七种qsort排序方法
  9. Atitit 知识结构化的艺术 目录 1. 知识信息结构化脑图 2 1.1. 散乱化模式 2 2. 直线排列 2 2.1.1. 直排 2 2.1.2. 链表模式 2 3. 树形排列 2 3.1.
  10. 开源的调查问卷平台LimeSurvey
  11. UiPath调用超级鹰识别验证码
  12. php 依赖安装顺序6,构建PHP框架:第6部分-依赖倒置,控制倒置,哦,天哪!
  13. 为intent添加FLAG_EXCLUDE_STOPPED_PACKAGES标记
  14. matlab仿真不确定时滞系统容错控制,基于模糊模型的非线性不确定时滞系统的H_∞鲁棒容错控制...
  15. B2C电商项目(第十五天、秒杀后端、异步下单、防止恶意刷单、防止重复秒杀、下单接口隐藏、下单接口限流 )
  16. 17款好用的跨浏览器测试神器,兼容性测试必备
  17. Mac上如何利用itunes恢复存放在移动硬盘的iPhone数据
  18. 51nod 1875 丢手绢
  19. 对于软件工程专业学生有哪些书可推荐?
  20. 面试3 -- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

热门文章

  1. 一个简易的下拉刷新松耦合实践
  2. 测试cpu玩游戏的软件,玩游戏时显卡和CPU到底哪个更重要?来看下面的测试你就会明白了...
  3. Google Ads搜索广告如何搭建广告系列?
  4. 超级好看!巧用PS将风光人像打造成唯美的小星球效果!
  5. FFmpeg H264编码
  6. 在易语言代码中嵌入汇编/机器码
  7. C/C++基础----多态
  8. getline函数的作用
  9. DW1000 学习笔记2 - 硬件
  10. Java进阶之多线程