zoukankan      html  css  js  c++  java
  • PHP的面向对象 — 封装、继承、多态

          K在上一次的基础篇中给大家介绍了一下关于PHP中数组和字符串的使用方法等,这一次,K决定一次性大放送,给大家分享一下PHP中面向对象的三大特性:封装、继承、多态三个方面的知识。

    一、封装

      在PHP中,封装可以用三个子来概括:私有化。具体来说,是通过访问修饰符,将类中不需要外部访问的属性和方法进行私有化处理,来实现访问控制。

      那么封装的作用是什么?封装的作用主要有两点,一是方法封装,即将使用者关注的功能暴露,而隐藏其他使用者用不到的功能;二是属性封装,即对用户的数据进行控制,防止不合法的数据传输设置。

      那么封装操作是如何实现的?

      对于方法的封装,我们通过对方法前加private关键字来进行设置,即进行私有化处理。demo如下:

    private function formatName(){} // 这个方法仅仅能在类内部使用$this调用
             function showName(){
                 $this -> formatName();
             }

      对于属性的封装,我们可以有两种方法来进行实现。

      一是通过自己提供的set/get方法来对私有化的属性进行设置/读取。demo如下:

    private $age;
             function setAge($age){
                 $this -> age = $age;
             }
             function getAge(){
                 return $this -> age;
             }

      二是通过魔术方法来进行实现。demo如下:

    private $age;
    function __get($key){
        return $this -> $key;
    }
    function __set($key,$value){
        $this -> $key = $value;
    }
    $对象 -> age;  >>> 访问对象私有属性时,自动调用__get()魔术方法,并且将访问的属性名传给__get()方法;
    $对象 -> age = "11";  >>> 设置对象的私有属性时,自动调用__set()魔术方法,并且将设置的属性名以及属性值传给__set()方法;

      此外,有关封装的魔术方法主要有以下几种:

       ① __set():给类私有属性赋值时自动调用,调用时给对象传递两个参数,需要设置的属性名、属性值
       ② __get():读取类私有属性时自动调用,调用时给方法传递一个参数,需要读取的属性名
       ③ __isset():外部使用isset()函数检测私有属性时,自动调用。
       >>>类外部使用isset()检测私有属性,默认是检测不到的。即false
       >>>所以,我们可以使用__isset()函数,在自动调用时,返回内部检测结果。
       function __isset($key){
         return isset($this->$key);
       }
       当外部使用isset($对象名->私有属性)检测时,将自动调用上述__isset()返回的结果!
       ④ __unset():外部使用unset()函数删除私有属性时,自动调用。
       function __unset($key){
        unset($this->$key);
       }
       当外部使用unset($对象名->私有属性)删除属性时,自动将属性名传给__unset(),并交由这个魔术方法处理。

    二、继承

      在PHP中,继承也可以用单词extends来概括。extends在子类上使用,可以让子类继承父类中的非私有属性和方法。demo如下:

    class Student extends Person{}

      但是,在使用继承时,需要注意以下几点:

      ① 子类只能继承父类的非私有属性。
      ② 子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用。
      ③ PHP只能单继承,不支持一个类继承多个类,但是一个类可以进行多层继承。
       >>> class Person{}
       class Chengnian extends Person{}
       class Student extends Chengnian{}
      Student类就同时具有了Chengnian类和Person类的属性和方法

      下面给大家介绍一下关于方法重写(方法覆盖)的一些知识。

      方法覆盖是指子类对继承父类中重名方法的重写或覆盖,而它的实现需要满足两个条件,一是子类继承父类;二是子类重写父类已有方法。

      那么如果我想要在调用父类中的方法,应该怎么做?我们可以通过如下代码实现:

    parent::方法名();

      同理,在子类继承父类时,首先也要调用父类的构造函数来赋值,实现代码如下:

    function __construct($name,$age,$school){
        parent::__construct($name,$age);
        $this -> school = $school;
    }
    // 其中name、age属性继承自父类,school属于子类

    三、多态

      在PHP中,多态是最常用到的一种特性。所谓多态,是指同一个东西不同形态的展示。在PHP中,我们这样定义多态,一个类被多个子类继承,如果这个类的某个方法在多个子类中表现不同的功能,那么这种行为我们就称其为多态的实现。

      多态的实现必须要满足三个条件:一是子类继承父类,二是子类重写父类的方法,三是父类引用指向子类对象

      多态的实现K用一个小小的demo来给大家进行演示,demo如下:

        abstract class Person{
            abstract function say();
        }
        
        class Chinese extends Person{ // 条件一:子类继承父类
            function say(){ // 条件二:子类重写父类方法
                echo "我说中文!<br>";
            }
        }
        class English extends Person{ //条件一:子类继承父类
            function say(){ // 条件二:子类重写父类方法
                echo "I speak English!<br>";            
            }
        }
        
    //    Person $c = new Chinese(); // 父类引用指向子类对象,PHP中此形式行不通
    //    Person $e = new English();
        
        function func(Person $p){ //PHP中的类型约束只存在与函数的形参
            $p -> say();
        }
        func(new Chinese()); // 条件三:父类引用指向子类对象
        func(new English()); // 条件三:父类引用指向子类对象

    好了,以上就是K给大家带来的关于PHP面向对象中封装、继承、多态这三个特性的初步理解,如果对你有帮助的话,可不要忘了给K点个赞哟~

  • 相关阅读:
    vue-cli3 中跨域解决方案
    自定义超链接动画---transition
    Vue 单选框与单选框组 组件
    js 控制随机数生成概率
    Vue slot插槽
    vue 组件通信
    vue中computed计算属性与methods对象中的this指针
    C#提取html中的汉字
    MVC几种找不到资源的解决方式
    使用Windows服务定时去执行一个方法的三种方式
  • 原文地址:https://www.cnblogs.com/wk1102/p/6986483.html
Copyright © 2011-2022 走看看