欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2019-07-23 类的封装性

程序员文章站 2022-06-15 13:17:53
类的封装性,简单来说就是在属性和方法前加了一个限定词,在php中有三个限定词:public(公共的)、protected(被保护的)、private(私有的),如果属性前加了任何一个限制词var要省略。它们具体有什么区别呢?它们的关系又是什么呢?下面做一个解析。 首先来看一个表格: 上面的表格已经可 ......

类的封装性,简单来说就是在属性和方法前加了一个限定词,在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 '';

 

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