类的封装性,简单来说就是在属性和方法前加了一个限定词,在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 '';
子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。