2019-07-23 类的封装性

类的封装性,简单来说就是在属性和方法前加了一个限定词,在php中有三个限定词:public(公共的)、protected(被保护的)、private(私有的),如果属性前加了任何一个限制词var要省略。它们具体有什么区别呢?它们的关系又是什么呢?下面做一个解析。

首先来看一个表格:

 
  public protected private
类中 可以被访问 可以被访问 可以被访问
类外 可以被访问    
子类 可以被访问 可以被访问  

上面的表格已经可以让我们对这三个属性做一个清楚地认知,下面通过实例简述:

1.public(公共的)

class Person{
    public $name;
    public $age;
    public $sex;

    public function say()
    {
        echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
    }
}

$obj = new Person();
$obj->name = "ZhangSan";
$obj->age = "20";
$obj->sex = "male";
$obj->say();

输出结果为:My name is ZhangSan. I am 20 years old.male in sex.

//继承
class Student extends Person{

    public function sing()
     {
         echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
     }
}

$obj1 = new Student();
$obj1->name = "ZhangSan";
$obj1->age = "20";
$obj1->sex = "male";
$obj1->sing();

输出结果为:My name is ZhangSan. I am 20 years old.male in sex.

可以看到,无论是在外部还是在继承中,public 属性都可以被访问到。还要注意一点,如果不加任何限定词,默认限定词即为public。

2.protected(受保护的)

我们把上个例子当中的方法设为受保护的,试一下在类外能否被访问到:

class Person{
    public $name;
    public $age;
    public $sex;

    protected function say()
    {
        echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
    }
}


$obj = new Person();
$obj->name = "ZhangSan";
$obj->age = "20";
$obj->sex = "male";
$obj->say();

输出结果是会报错:Fatal error: Call to protected method Person::say() from context '';提示我们在类外是不能访问受保护的方法的。 

class Person{

    protected function say()
     {

         echo "我是父类";
     }
}

//子类继承父类
class Student extends Person{
    function sing()
    {
        //调用父类受保护的方法
        echo $this->say();
    }
}

$obj = new Student();
$obj->sing();

 输出结果为:我是父类。说明继承的子类可以调用父类中受保护的方法。

3.private(私有的)

看名字我们就大概可以看到,这个限制词把属性和方法限制成类私有的,所以在类外部和子类中都是不可访问的。

class Preson{

    private function say(){
        echo "我是父类";
    }
}

$obj = new Preson();
$obj->say();

 输出结果为报错:Fatal error: Call to private method Preson::say() from context '';

在继承中怎么样呢?

class Preson{

    private function say(){
        echo "我是父类";
    }
}

class Student extends Preson
 {
     function sing()
      {
          echo $this->say();
      }
 }

$obj = new Student();
$obj->sing();

 输出结果为报错:Fatal error: Call to private method Preson::say() from context '';

子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

原文地址:https://www.cnblogs.com/zhangxu-fasu/p/11232587.html