PHP中private、public、protected的详细介绍

478,035次阅读
没有评论

共计 2551 个字符,预计需要花费 7 分钟才能阅读完成。

PHP 中 private、public、protected 的详细介绍,这个是 PHP 的基础,简单粗俗的描述下:
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 是指当前对像

直接上一示例:

<?php
// 父类
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:webmytestp.php on line 18
        echo '我有',$this->money,'元钱 <br />'; // 我有 3000 元钱
        echo '我今年',$this->age,'岁 <br />';// 我今年 30 岁
    }
}
$class = new Stu();
echo $class->age,'<br />'; // 28

echo $class->friend; // 出错:因为类外不能调用 private
echo $class->money; // 出错:因为类外不能调用 protected 属性
$class->talk();

 

以上输出:

 

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

 

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

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

 

正文完
 0