2019-07-23 类的封装性

Posted zhangxu-fasu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ‘‘;

 

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

以上是关于2019-07-23 类的封装性的主要内容,如果未能解决你的问题,请参考以下文章

增加类的封装性

类的封装性和继承

面向对象-封装性

封装性

详细的解释下类的封装性,抽象性,继承性和多态性。

面向对象的特性一:封装性