• PHP面向对象编程(imooc)代码合集(三)


    class07

    overwrite(重写)和Final关键字

    overwrite(重写):在子类中编写一个与父类function完全一样的function,实现子类特定的功能

    final关键字:final翻译过来就是"最终"的意思。final定义的函数或类,不能被子类重写,如果重写将会报错

    <?php
    date_default_timezone_set("PRC");
    /**
     * 重写和Final
     * 1. 子类中编写跟父类完全一致的方法可以完成对父类方法的重写
     * 2. 对于不想被任何类继承的类可以在class之前添加final关键字
     * 3. 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字
     */
    
    class BaseClass {
       public function test() {
           echo "BaseClass::test() called
    ";
       }
       
       public function moreTesting() {
           echo "BaseClass::moreTesting() called
    ";
       }
    }
    
    class ChildClass extends BaseClass {
      
      // 重写时参数不一定要跟父类完全一致
       public function moreTesting($tmp=null) {
           echo "ChildClass::moreTesting() called
    ";
       }
    }
    // Results in Fatal error: Cannot override final method BaseClass::moreTesting()
    $obj = new ChildClass();
    $obj->moreTesting();
    ?>

    class08数据访问补充

     * 1. parent关键字可以用于调用父类被重写的类成员
     * 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号
     * 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
    <?php
    date_default_timezone_set("PRC");
    /**
     * 数据访问补充
     * 1. parent关键字可以用于调用父类被重写的类成员
     * 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号
     * 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
     */
    
    class BaseClass {
       public function test() {
           echo "BaseClass::test() called
    ";
       }
       
       public function moreTesting() {
           echo "BaseClass::moreTesting() called
    ";
       }
    }
    
    class ChildClass extends BaseClass {
      public $height="198cm";
      private static $sValue = "static value";
      const CONST_VALUE = 'A constant value';
      public function moreTesting() {
           echo "ChildClass::moreTesting() called
    ";
           parent::moreTesting(); // parent关键字可以访问父类被重写的成员
           // step 3 self关键字可以访问该类自身的其他成员
           self::called();
           // step 4 self关键字可以访问该类定义的常量
           echo "CONST_VALUE: " . self::CONST_VALUE."
    ";
           // 常量不能被赋值修改
           // self::CONST_VALUE = 11;
           // step 5 static关键字可以访问静态成员,当调用静态属性时记得加$符号
           echo "sValue: " . static::$sValue."
    ";
      }
      // step 3
      public function called(){
        echo "ChildClass::called() called
    ";
      }
     }
    // Results in Fatal error: Cannot override final method BaseClass::moreTesting()
    $obj = new ChildClass();
    $obj->moreTesting();
    ?>

    class09接口

    接口和类不同的地方在于,接口定义的方法没有具体实现,所以可以说是“一种没有实现具体方法的类”;要实现接口的方法,必须通过一般的class来实现。引入接口的好处在于,工程开发中把要编写的function功能层次地列举出来,方便其他版块开发人员的调用

    /**
     * 接口
     * 1. 接口的基本概念和基本使用方法
     * 2. 接口里面的方法没有具体的实现
     * 3. 实现了某个接口的类必须提供接口中定义的方法
     * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口
     * 5. 接口可以继承接口(interface extends interface)
     * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。
     */
    <?php
    date_default_timezone_set("PRC");
    /**
     * 接口
     * 1. 接口的基本概念和基本使用方法
     * 2. 接口里面的方法没有具体的实现
     * 3. 实现了某个接口的类必须提供接口中定义的方法
     * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口
     * 5. 接口可以继承接口(interface extends interface)
     * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。
     */
    
    interface ICanEat {
       public function eat($food);
    }
    
    // Human类实现了ICanEat接口
    class Human implements ICanEat { 
      // 跟Animal类的实现是不同的
      public function eat($food){
        echo "Human eating " . $food . "
    ";
      }
    }
    
    // Animal类实现了ICanEat接口
    class Animal implements ICanEat {
      public function eat($food){
        echo "Animal eating " . $food . "
    ";
      }
    }
    
    // step1 不同的类可以实现同一个接口,定义接口方法的不同实现
    $man = new Human();
    $man->eat("Apple");
    $monkey = new Animal();
    $monkey->eat("Banana");
    
    // step2 尝试删除Human的eat方法并运行
    // 实现了某个接口的类必须提供接口中定义的方法
    
    // step3 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口
    //$eatObj = new ICanEat();
    var_dump($man instanceof ICanEat); // 判断某个对象是否实现了某个接口
    
    // step 4 接口可以继承接口
    interface ICanPee extends ICanEat {
      public function pee();
    }
    
    class Human1 implements ICanPee{
      public function pee(){}
    }
    
    
    ?>
  • 相关阅读:
    mysql 中表和数据库名称不要使用 '-' 命名
    htmlElement.style 是只读属性
    chrome 远程调试相关问题
    纯小白入手 vue3.0 CLI
    纯小白入手 vue3.0 CLI
    纯小白入手 vue3.0 CLI
    《前端之路》- TypeScript (四) class 中各类属性、方法,抽象类、多态
    《前端之路》- TypeScript (三) ES5 中实现继承、类以及原理
    《前端之路》- TypeScript(二) 函数篇
    《前端之路》--- 重温 Egg.js
  • 原文地址:https://www.cnblogs.com/construtora/p/5021028.html
Copyright © 2020-2023  润新知