8.PHP中的面向对象编程(下)

封装性

  • 把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象)。
    信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。
  • 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。

设置私有变量

  • 使用private关键字来对成员进行修饰,封装后,成员在对象的外部不能访问,但在对象内部的成员方法中可以进行访问,达到对对象保护的效果

  • 一般情况下,为了获得私有成员属性的内容,我们可以声明一个public修饰的方法来进行访问

<?php
    class person{
        private $age;

        function __construct($age){
            $this->age=$age;
        }

        public function get_age(){
            return $this->age;
        }
    }

    $li=new person(32);
    echo $li->get_age(); #使用get_age()方法访问私有变量

    // 运行结果:
    // 32
?>

使用魔术方法

  • 魔术方法__set():为成员属性进行赋值
    • 可以对赋值内容做一些限制
    • 只用一个函数就可完成对所有私有成员属性的复制
<?php
    class person{
        private $age;
        private $name;

        public function get_age(){
            return $this->age;
        }

        function __set($propertyName,$propertyValue){
            $this->$propertyName=$propertyValue;
        }

    }

    $li=new person();
    $li->age=32;     #在赋值时,系统会自动条用__set()方法
    $li->name="li";        #看起来和直接赋值没有什么区别
    echo $li->get_age();
?>
  • 魔术方法:__get()
    • 在获取私有变量的值时,会自动调用此方法
    • 它有一个必选参数,也就是属性的名称,可以对提取内容做一些限制
<?php
    class person{
        private $age;
        private $name;

        public function get_age(){
            return $this->age;
        }

        function __set($propertyName,$propertyValue){
            $this->$propertyName=$propertyValue;
        }

        function __get($propertyName){
            return $this->$propertyName;
        }
    }

    $li=new person();
    $li->age=32;
    $li->name="li";

    #获取数值
    echo $li->name."<br/>";     #自动调用__get()方法
    echo $li->age;
// 运行结果:
// li
// 32
?>  

继承性

  • 通过子类对已经存在的父类进行功能扩展

类继承的应用

<?php
    class person{
        private $age;
        private $name;

        public function get_age(){
            return $this->age;
        }

        function __set($propertyName,$propertyValue){
            $this->$propertyName=$propertyValue;
        }

        function __get($propertyName){
            return $this->$propertyName;
        }
    }

    class student extends person {
        private $class_s;
        public function read(){
            echo "正在阅读";
        }
        function __set($propertyName,$propertyValue){   #设置私有变量
            $this->$propertyName=$propertyValue;
        }
        function __get($propertyName){                  #使用私有变量
            return $this->$propertyName;
        }
    }

    $li=new student();
    $li->name="li";
    $li->age=12;
    $li->class_s="一班";
    echo $li->name." ".$li->age." ".$li->class_s." ";
    $li->read();
// 运行结果:
// li 12 一班 正在阅读
?>  

访问继承控制

image-20201027213136993

  • 请查看上表

子类中重载父类的方法

  • 在php中没有方法的重载,但是可以重载父类同名的方法
  • 在php中提供了子类在重载方法中调用父类中被覆盖方法的功能,可以使用“parent::方法名”
<?php
    class person{
        protected $age;
        protected $name;

        function __construct($name,$age){
            $this->name=$name;
            $this->age=$age;
        }

        function __get($propertyName){
            return $this->$propertyName;
        }
    }

    class student extends person {
        private $class_s;

        function __construct($name,$age,$class_s){
            parent::__construct($name,$age);    #使用父类的重载方法
            $this->class_s=$class_s;            #新增子类的属性赋值
        }

        function __get($propertyName){                  #使用私有变量
            return $this->$propertyName;
        }
    }

    $li=new student("li",12,"一");
    echo $li->name;

    #输出结果:li
?>  
  • 注意,看重载方法的时候,子类重载方法的访问权限要高于或者等于父类方法的访问权限

常见的关键字和魔术方法

final关键字

  • 可以加在类或者类方法中,但是不能使用final标识成员属性
  • 使用final的类,不能被继承
  • 在类中使用final标识的方法,在子类中不能被覆盖

static关键字

  • static关键字可以用来修成成员变量,也可以用来修饰成员方法
  • static关键字创建的成员是这个类共有的,不属于任何一个被实例化的对象,有点类似于全局变量,因此,在访问static修饰的成员时,成员方法对其访问也不能使用$this关键字,而使用self::成员名的方式来进行访问
  • static关键字修饰的成员,可以直接通过类名来访问,而不需要实例化对象;类名::成员名
  • 在静态方法中只能访问静态成员,因为非静态成员需要通过对象的引用才能访问,通常是使用$this来完成的,而静态方法在对象不存在的情况下也可以进行使用,因此不能在静态方法中访问非静态成员。
<?php
    class person{
        protected $age;
        protected $name;
        static $cap;

        function __construct($name,$age){
            $this->name=$name;
            $this->age=$age;
        }

        function __get($propertyName){
            return $this->$propertyName;
        }

        static function say(){
            echo "你好";
        }

    }

    person::$cap="student";       #访问静态成员
    echo person::say()." ";
    echo person::$cap;          #使用静态方法
    // 运行结果:
    // 你好 student
?>  

const关键字

  • 用于在类中定义常量,定义完成之后不能修改
  • 只能通过类名或者self关键字来进行访问,而不能通过对象来进行访问
  • 定义常量成员时,不用使用$符号,并且一般都是大写的形式进行声明
<?php
    class person{
        const AGE=5;

        static function get_AGE(){
            return self::AGE;
        }
    }
    echo person::AGE;
    echo person::get_AGE();

    // 运行结果:
    // 55
?>  

克隆对象

  • 可以使用clone关键字来克隆对象,克隆出来的对象互不干扰
  • 可以在类中声明一个__clone魔术方法,该方法不需要任何参数,并且克隆时自动调用
<?php
    class person{
        protected $age;

        function __set($name,$value){
            $this->$name=$value;
        }

        function __get($name){
            return $this->$name;
        }

        function __clone(){
            $this->age=55;
        }
    }

    $li=new person();
    $li->age=32;
    echo $li->age."<br/>";
    $wang=clone $li;
    echo $wang->age;

// 运行结果:
// 32
// 55
?>  

魔术方法:__toString()

  • 在直接输出对象时会自动调用,该方法要返回一个字符串,一般都是对象的相关属性
<?php
    class person{
        protected $age;

        function __set($name,$value){
            $this->$name=$value;
        }

        function __get($name){
            return $this->$name;
        }

        function __clone(){
            $this->age=55;
        }

        #输出对象
        function __toString(){
            return "age:".$this->age;
        }
    }
    $li=new person();
    $li->age=32;        #为成员变量赋值,这里自动调用__set()方法
    echo $li;           #自动调用__toString()方法

// 运行结果:
// age:32
?>  

魔术方法:__call()

  • 调用对象中不存在方法时,就会自动调用这个方法,给用户一些反馈信息
  • 接收两个参数,第一参数是并不存在方法的方法名称,第二个参数是传递进来的参数数组
<?php
    class person{
        protected $age;

        function __set($name,$value){
            $this->$name=$value;
        }

        function __get($name){
            return $this->$name;
        }

        function __call($name,$array){
            echo "方法“".$name."”不存在"."<br/>";
            echo "参数如下:"."<br/>";
            foreach ($array as $key => $value) {
                echo $key.":".$value."<br/>";
            }

        }
    }

    $li=new person();
    $li->yes(1,2,3,"参数四");

// 运行结果:
// 方法“yes”不存在
// 参数如下:
// 0:1
// 1:2
// 2:3
// 3:参数四
?>  
© 版权声明
THE END
喜欢就支持以下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容