在类的成员前面通常都有访问修饰符的,访问修饰符相当于给类的每一个成员设置调用的权限。
共有三个访问修饰符:
public:公共的,共有的,公开的
protected:受保护的
private:私有的
用该修饰符修饰的成员,可以在“任何位置”使用(访问),权限最大。
访问(使用)是这样一个语法模式:
对象变量->成员;
类名::成员;
访问位置分为3个:
1:某个类内部:自然是该类的某个方法中
2:某个类的具有继承关系的子(父)类的内部:是指其他类的某个方法中。
3,某个类的外部:一般就是独立的代码区(不在类中),类似我们之前的代码。
public我们前面讲了好多,不专门举例了。类中除了一般属性需要专门指定一个访问修饰符,其他成员是可以省略访问修饰符的,默认就是public。
protected修饰的成员,可以在当前类或当前类的上下级具有继承关系的类中访问。
把Animal类中的$feature改成protected修饰:
第8行代码直接在类外部访问时就会出错。
在Person类里调用Animal类的$feature属性,添加一个showfeature方法
是可以访问到的。
private 修饰的成员,只能在其所在的类中访问。
把Animal类的$feature改成private修饰,Person类无权限调用了。
private开通的权限最低,包括上节讲的子类想调用已被覆盖的父类同名方法,前提也是父类方法的访问修饰符不能是private。
访问修饰符存在的意义很重要的,比如一个类的属性变量可能只为本类的方法所用,那就没有必要让类外部实例化的对象直接访问,避免了类外部失误修改属性而造成不必要的问题。
类内部protected、private修饰的属性可以像Person类定义一个showFeature方法一样让外部只能访问而不能修改。
拓展:
class Father { private function show() { print("show<br />"); } protected function show2() { print("show2<br />"); } public function show3() { print("show3<br />"); } public static function main() { $f = new Father(); $f->show(); $f->show2(); $f->show3(); } public function main2() { $f = new Father(); $f->show(); $f->show2(); $f->show3(); } } Father::main(); (new Father)->main2(); (new Father)->show();
结果:
show show2 show3 show show2 show3 Fatal error: Call to private method Father::show() from context ''
在类内实例化自己,得到一个新对象变量(非$this),这种情况下也是可以访问到自己的非公开类成员的。
(new Father)这是一种匿名对象的写法。