精易论坛

标题: PHP - 类的成员访问控制 [打印本页]

作者: dream518    时间: 2020-7-19 10:59
标题: PHP - 类的成员访问控制
// 类的成员访问控制:作用域
// public: 公开成员,默认值,类外部类内部以及类的子类中均可使用
// protected :受保护成员,禁止类外部使用,类内部及子类可使用
// private : 私有成员,仅在当前类中可使用,类外部及子类均禁止使用
// 类的上下文环境:当前类以及他的扩展类/子类,构成的一个具有层级结构的类家庭

class User
{
    public $name = 'michael';
    protected $age = 30;
    private $gender = '男';
    // 当前类访问私有成员
    public function func()
    {
        return "性别:{$this->gender}";
    }
}
// 访问一下
$user = new User;
echo $user->name;
// echo $user->age; 报错无法访问受保护的
// echo $user->gender;  报错 无法访问私有的
echo $user->func();  //输出性别:男

// 创建子类
class Ser extends User
{
// 创建一个方法访问父类中的受保护成员
public function class()
{
    return "年龄:{$this->age}";
}

// 子类访问父类私有成员
public function class1()
{
     return "性别:{$this->gender}";
}
}
$ser = new Ser;
echo $ser->class();
// 输出年龄:3

// 输出父类私有成员
// echo $ser->class1();  报错:未定义的属性

类的继承



// 面向对象   OOP:封装,继承,多态
// 封装 public protected private
// 继承 extends
// 多态 方法的重写是实现方法级的多态,面向接口开发是实现对象级的多态

// 类的继承
// 二类成员:父类的public protected
// 三种操作:继承,重写,扩展
// 继承:父类的二类成员自动成为子类的成员
// 重写:覆盖与父类同名的成员(属性、方法)
// 扩展:子类添加自身的方法来扩展父类的功能
// 父类也叫基类,子类也叫扩展类

// 创建父类
class User
{
    public $name = 'michael';
    protected $age = 30;
    private $gender = '男';
    public static $nationality = '加拿大';
    // 创建方法
    public function Name()
    {
        return $this->name;
    }
}

// 创建子类
class Ser extends User
{
    // 重写父类属性
    public $name = "kaiwen";
    // 重写方法
    public function Name(){
        return parent::Name().'不是中国人';
    }
    // 扩展属性
    public $hibby = 'shoot';
    // 扩展方法
    public function means(){
        return parent::Name()."爱好:{$this->hibby}";
    }
}

// 子类实例化
$ser = new Ser;
// 直接继承父类方法,在子类输出
echo $ser->Name();  //输出 michael
// 重写父类name属性,输出
echo $ser->Name();   //输出 kaiwen不是中国人 因为上面已经重写了name的值 所以不是michael
echo '<hr>';
// 扩展
echo $ser->means();  //输出kaiwen爱好:shoot

// 最终方法最终类 在前面加 final

抽象类



// 抽象类:部分分离了设计(抽象类的完成)与实现(工作类的完成)
// 只要一个类中有一个抽象方法 那么这个类就是抽象类
// 抽象方法:没有方法体

// 创建一个抽象类
abstract class User
{
    public $name = 'michael';
    protected $age = 30;
    private $gender = '男';
    public static $nationality = '加拿大';
    // 创建方法
    public function Name()
    {
        return $this->name;
    }
    // 创建抽象方法:没有方法体
    abstract public function class();
}

// 子类叫做实现类或者工作类 父类中的抽象方法必须在子类中实现
// 实现类、工作类:是一个可以被实例化的普通类
// 工作类不一定是一个可以被实现的普通类,他也可以是一个抽象类
// 抽象类也可以被继承,也可以被用在继承上下文环境中、
// 抽象类中允许有抽象成员,但不是强制的,也可以没有
abstract class Ser extends User
{
    // 创建一个受保护的属性
    protected $hibby = 'shoot';
    // 必须将父类中的抽象方法实现
    public function class(){
        return "姓名:{$this->name} 兴趣:{$this->hibby}";
    }
}

// 最终工作类:允许被实例化

class Er extends Ser
{
    public function class(){
        return parent::class();
    }
}

// 实例化
$er =  new Er;
echo $er->class();
// 输出姓名:michael 兴趣:shoot









欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4