关键词搜索

源码搜索 ×
×

PHP中private、public、protected的区别详解

发布2019-12-29浏览417次

详情内容

public 表示全局,类内部外部子类都可以访问;
private表示私有的,只有本类内部可以使用;
protected表示受保护的,只有本类或子类或父类中可以访问;

再啰嗦的解释下:

一、

public: 公有类型

在子类中可以通过 self::属性名(或方法名)  调用public方法或属性,parent::方法名 调用父类方法

在实例中可以能过 $obj->属性名(或方法名) 来调用 public类型的方法或属性

protected: 受保护类型

在子类中可以通过 self::属性名(或方法名) 调用protected方法或属性,parent::属性名(或方法名) 调用父类方法。

在实例中不能通过 $obj->属性名(或方法名) 来调用  protected类型的方法或属性   

private: 私有类型
该类型的属性或方法只能在该类中使用,

在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法

二、
self 和parent 的区别
  a).在子类中常用到这两个对像。他们的主要区别在于self可以调用父类中的公有或受保护的属性,但parent不可以调用

  b).self:: 它表示当前类的静态成员(方法和属性)与 $this不同,$this是指当前对像

直接上一示例:

  1. <?php
  2. //父类
  3. class father{
  4. public function a(){
  5. echo "public function a".PHP_EOL;
  6. }
  7. private function b(){
  8. echo "private function b".PHP_EOL;
  9. }
  10. protected function c(){
  11. echo "protected function c".PHP_EOL;
  12. }
  13. }
  14. //子类
  15. class child extends father{
  16. function d(){
  17. parent::a();//调用父类的a方法
  18. }
  19. function e(){
  20. parent::c(); //调用父类的c方法
  21. }
  22. function f(){
  23. parent::b(); //调用父类的b方法
  24. }
  25. }
  26. $father=new father();
  27. $father->a(); //输出 public function a
  28. $father->b(); //显示错误 外部无法调用私有的方法
  29. $father->c(); //显示错误 外部无法调用受保护的方法
  30. $chlid=new child();
  31. $chlid->d();//输出 public function a
  32. $chlid->e(); 输出 protected function c
  33. $chlid->f();//显示错误 无法调用父类private的方法 Uncaught Error: Call to private method father::b() from context 'child'

 通过上面实力我们可以看出:

  protected 保护模式 只在类本身及派生类中可访问,那么 这个$chlid->e(); 调用的是 father 的function c(), 也就说 在child 中调用father的c 是可以的. 但如果你直接用child->c(), 那就是不行的. 要通过child的e() 中转一下 才能调用到father 的c()

再来举例说明:

  1. <?php
  2. class Man {
  3. private $name = '周伯通';
  4. protected $money = 3000;
  5. public $age = 30;
  6. public function say() {
  7. echo '我叫',$this->name,'<br />';
  8. echo '我有',$this->money,'元钱<br />';
  9. echo '我今年',$this->age,'岁';
  10. }
  11. }
  12. class Stu extends Man {
  13. private $friend = '小白';
  14. public function talk() {
  15. echo '我叫',$this->name,'<br />';//我叫 Notice: Undefined property: Stu::$name in D:\web\mytest\p.php on line 18
  16. echo '我有',$this->money,'元钱<br />'; //我有3000元钱
  17. echo '我今年',$this->age,'岁<br />';//我今年30
  18. }
  19. }
  20. $class = new Stu();
  21. echo $class->age,'<br />'; // 28
  22. echo $class->friend; //出错:因为类外不能调用private
  23. echo $class->money; //出错:因为类外不能调用protected属性
  24. $class->talk();

以上输出:

  1. <br />
  2. <br />
  3. <b>Fatal error</b>: Uncaught Error: Cannot access private property Stu::$friend in D:\web\mytest\p.php:26
  4. Stack trace:
  5. #0 {main}
  6. thrown in
  7. <b>D:\web\mytest\p.php</b> on line
  8. <b>26</b>
  9. <br />

分析原因: Undefined property: Stu::$name 这是说明:stu对象 没有name属性 但上面不是说私有的不是可以继承吗? 是可以继承过来,但系统有标记,标记其为父类层面的私有属性. 因此无权调用,导致此错发生. 可以分析出: protected 可以在 子类内访问

protected能在子类访问,本类内能否访问? 答:当然可以

 

参考:

https://www.cnblogs.com/phpper/p/8976304.html

https://www.cnblogs.com/chbyl/p/7116591.html

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载