在PHP中,如果在属性和方法前如果不加public、private或者protected修饰词,默认是使用public。
public:本类、子类和类外部都可以访问;
private:只在本类中可以访问,子类和外部都不可以访问;
protected:本类和子类中可以访问,类外部不能访问;
例如:
class Father
{
public $name = 'lily';
private $age = 18;
protected $school = '社会大学';
public function introduce() {
echo 'my name is ' . $this->name . ',';
echo 'my school is ' . $this->school;
echo 'my age is ' . $this->age . ',';
}
public function getName() {
echo 'my name is ' . $this->name;
}
private function getAge() {
echo 'my age is ' . $this->age';
}
protected function getSchool() {
echo 'my school is ' . $this->school;
}
}
class Child extends Father
{
public function info() {
echo 'my name is ' . $this->name .',';
echo 'my school is ' . $this->school, ',';
echo 'my age is ' . $this->age;
}
}
// 实例化
$a = new Father();
$a->introduce(); // my name is lily,my school is 社会大学,my name is 18
$a->getAge(); // Call to private method Father::getAge() from context '' in
$a->getSchool(); // Call to protected method Father::getSchool() from context '' in
Father::getSchool(); //Call to protected method Father::getSchool() from context '' in
Father::$age; // Cannot access private property Father::$age in
// 实例化子类
$b = new Child();
$b->getName(); // my name is lily
$b->getAge(); // Call to private method Father::getAge() from context '' in
$b->getSchool(); // Call to protected method Father::getSchool() from context '' in
$b->info(); // my name is lily,my school is 社会大学,<b>Notice</b>: Undefined property: Child::$age in
从上面的示例可以看出:
introduce方法里面调用了Father类的3个属性,从输出结果看,如果是在类本身里面去访问带有public\private\protected修饰词的属性和方法是都可以访问到的;
在类外部,不管是实例化还是静态去调用private方法getAge(),和protected方法getSchool()是访问不到的,只能在类的内部访问;
子类中info方法调用到了父类的3个属性,输出结果只有public属性name和protected属性school,输出private属性age时会报提示错误:未定义的属性;info是子类Child的公共方法,访问school属性的时候是在类内部完成的,所以可以访问到protected属性;