当前位置:首页 > 编程技术 > PHP编程 > 正文内容

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

曾经3年前 (2022-05-01)PHP编程911

先简单粗俗的描述下:
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是指当前对像

直接上一示例:

//父类
class father{    
    public function a(){
        echo "public function a".PHP_EOL;
    }    
    private function b(){
        echo "private function b".PHP_EOL;
  }    
  protected function c(){     
      echo "protected function c".PHP_EOL;
  }
}
//子类
class child extends father{  
  function d(){
      parent::a();//调用父类的a方法    
  }    
  function e(){
    parent::c(); //调用父类的c方法    
   }    
   function f(){
    parent::b(); //调用父类的b方法    
  }
}
$father=new father();
$father->a(); //输出 public function a
$father->b(); //显示错误 外部无法调用私有的方法
$father->c(); //显示错误 外部无法调用受保护的方法
$chlid=new child();
$chlid->d();//输出 public function a
$chlid->e(); ////输出 protected function c
$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()

再来举例说明:

<?php
class Man {  
  private $name = '周伯通';  
  protected $money = 3000;    
  public $age = 30;    
  public function say() {        
      echo '我叫',$this->name,'<br />';        
      echo '我有',$this->money,'元钱<br />';        
      echo '我今年',$this->age,'岁';
    }
}
class Stu extends Man {    
    private $friend = '小白';    
    public function talk() {        
        echo '我叫',$this->name,'<br />';//我叫 Notice: Undefined property: Stu::$name in D:\web\mytest\p.php on line 18        
        echo '我有',$this->money,'元钱<br />'; //我有3000元钱        
        echo '我今年',$this->age,'岁<br />';//我今年30岁
  }
}
$class = new Stu();
echo $class->age,'<br />'; // 28echo $class->friend; //出错:因为类外不能调用privateecho 
$class->money; //出错:因为类外不能调用protected属性
$class->talk();

以上输出:

30<br /><br /><b>Fatal error</b>:  Uncaught Error: Cannot access private property Stu::$friend in D:\web\mytest\p.php:26
Stack trace:
#0 {main}
  thrown in<b>D:\web\mytest\p.php</b> on line<b>26</b><br />

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

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

无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。


扫描二维码推送至手机访问。

版权声明:本文由珍惜发布,如需转载请注明出处。

本文链接:https://www.zp68.com/article/4.html

分享给朋友:

“PHP中private、public、protected的区别详解” 的相关文章

PHP将两个MP3文件进行合并,可以多个MP3文件合并

以下代码是基于PHP 7.x 的,版本小于7.x 的请自行将 代码中的__construct 改为 mp3<?php class mp3 { var $str; var $time; var $frames; // ...

php实现边执行边输出的效果

客户端的请求到web服务器,web服务器再调用PHP代码;PHP返回内容到web服务器,web服务器再返回给客户端边执行边输出就需要web服务器和PHP都不缓存内容首先, Nginx不缓存PHP返回的内容header('X-Accel-Buffering: no'...

最详细的PHP flush()与ob_flush()的区别详解

buffer ---- flush()buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一...

PHP中刷新输出缓冲

PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每...

php 使用curl_multi_init批量请求

抓取多个URL地址是Web开发中常见的需求,使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址,并提供具体的代码案例和注释。curl库介绍curl是一个常用的开源网络传输工具,可以通过各种协议(如HTTP、FTP、TELNET)在不同的平台上进行数...

PHP 多线程 curl_multi_init 的使用 PK curl_init 看看那个更快

php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。本案例用来测试大并发的情况下 curl_multi_init() 到底比 curl_init() 快多少。话不多少,直接上...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。