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 类的封装性的主要内容,如果未能解决你的问题,请参考以下文章