第七章:第8节 PHP面向对象——访问修饰符

更新于:2019-06-18 14:10:06

在类的成员前面通常都有访问修饰符的,访问修饰符相当于给类的每一个成员设置调用的权限。


共有三个访问修饰符:


public:公共的,共有的,公开的

protected:受保护的

private:私有的


public公有的

用该修饰符修饰的成员,可以在“任何位置”使用(访问),权限最大。

访问(使用)是这样一个语法模式:

对象变量->成员;

类名::成员;


访问位置分为3个:


1:某个类内部:自然是该类的某个方法中

2:某个类的具有继承关系的子(父)类的内部:是指其他类的某个方法中。

3,某个类的外部:一般就是独立的代码区(不在类中),类似我们之前的代码。


public我们前面讲了好多,不专门举例了。类中除了一般属性需要专门指定一个访问修饰符,其他成员是可以省略访问修饰符的,默认就是public。


protected 受保护的

protected修饰的成员,可以在当前类或当前类的上下级具有继承关系的类中访问。


1.png


把Animal类中的$feature改成protected修饰:


1.png

第8行代码直接在类外部访问时就会出错。


1.png

在Person类里调用Animal类的$feature属性,添加一个showfeature方法

1.png


1.png

1.png

是可以访问到的。


private私有的

private 修饰的成员,只能在其所在的类中访问。


把Animal类的$feature改成private修饰,Person类无权限调用了。


1.png

private开通的权限最低,包括上节讲的子类想调用已被覆盖的父类同名方法,前提也是父类方法的访问修饰符不能是private。


1.png

访问修饰符存在的意义很重要的,比如一个类的属性变量可能只为本类的方法所用,那就没有必要让类外部实例化的对象直接访问,避免了类外部失误修改属性而造成不必要的问题。


类内部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)这是一种匿名对象的写法。


本节学习代码》》》