这三个词在定义类的属性和方法时使用,其最大的区别在与他们作用域不同
public :全局使用,不仅是本类,其子类,创建的对象都可以使用,甚至子类的子类由于继承关系,也可以使用.
protected:本类和其子类使用,如果后续有继承的话,
private : 仅限本类使用
class ClassA
{
public $a = 1;
protected $b = 2;
private $c = 3;
public function share() {
echo ‘a=‘.$this->a."\n";
echo ‘b=‘.$this->b."\n";
echo ‘c=‘.$this->c."\n";
}
protected function fuZi() {
echo ‘a=‘.$this->a."\n";
echo ‘b=‘.$this->b."\n";
echo ‘c=‘.$this->c."\n";
}
}
class ClassB extends ClassA
{
public function jiCheng() {
echo ‘我是B类继承了protected的属性b=‘.$this->b."\n";
echo ‘我是B类继承的protected方法‘.parent::fuZi()."\n";
}
//
/*protected function fuzi()
{
echo ‘i am b‘;
}*/
}
class ClassC extends ClassB
{
public function Cji() {
echo ‘我是C类继承了B类a=‘.$this->a."\n";
echo ‘我是C类继承了B类b=‘.$this->b."\n";
$this->fuZi();
}
}
$classB = new ClassB();
$classB->jiCheng();//经过测试继承的protected方法属性都可以获取
$classC = new ClassC();
$classC->Cji();
执行结果如下图
由于B继承了A,C又继承了B,因此就将A里protected属性和方法传递到了C,如果在B里面使用函数的覆盖,会发现C类里的fuZi函数也跟着变化,这说明protected属性的作用域是本类和子类,如果在子类中进行了覆盖,后续使用将是新的函数,将代码中B类fuZi函数注释释放,得到下图结果:
原文:https://www.cnblogs.com/MrBear/p/9988515.html