• php的抽象类和接口的总结和区别


      php对象的三大特征是封装、继承和多态,抽象类和接口是“继承”必不可少的技术,抽象类和接口有那些相同和不同之处能?下面简单介绍一下。

      1.abstract 关键字:
      1)用abstract关键字修饰的类和方法,即为抽象类或抽象方法;
      2)用abstract修饰的方法不能用private私有关键字修饰;
      3)abstract属单继承,每个类只能继承一个父类;
      4)abstact抽象类的继承对private、protected和public关键字的适用范围是:private只适用于本类不能被继承;protected适用于本类和子类,不适用于类的外部;public适用于本类、子类和类的外部。
      示例:

    <?php
    
    abstract class Person{
        
        protected $name;
        protected $country;
        
        function __construct($name = "", $country = ""){
            $this->name = $name;
            $this->country = $country;
        }
        
        abstract function say();
        abstract function eat();
        
        function run(){
            echo "使用两务腿走路!";
        }
        
    }
    
    class ChineseMan extends Person{
        
        function say(){
            echo $this->name."是".$this->country."人,讲汉语。<br>";
        }
        
        function eat(){
            echo $this->name."使用筷子吃饭。<br>";
        }
        
    }
    
    class Americans extends Person{
    
        function say(){
            echo $this->name."是".$this->country."人,讲英语。<br>";
        }
        
        function eat(){
            echo $this->name."使用刀和叉子吃饭。<br>";
        }
        
    }
    
    $chineseMan = new ChineseMan("高先生", "中国");
    $americans = new Americans("alex", "美国");
    
    $chineseMan->say();  //高先生是中国人,讲汉语。
    $americans->say();     //alex是美国人,讲英语。
    
    $chineseMan->eat();  //高先生使用筷子吃饭。
    $americans->eat();     //alex使用刀和叉子吃饭。

      2.interface关键字:
      1)用interface关键字修饰的类就是接口,没有class关键字;
      2)接口内的属性只能用const关键字修饰为常量;
      3)接口内的方法全部都是抽象方法,不像abstract可以提取一部分为抽象方法;
      4)接口内的方法只能是public,且常常省略。
      5)接口属多继承,每个类可继承自多个接口,各接口名称用逗号隔开。
      格式是:

    class Person implements interface1, interface2,...interfaceN{ 
        //Class contents 
    }

      示例:

    <?php
    
    interface USB{
        function run();
    }
    
    class Computer{
        function useUSB($usb){
            $usb->run();
        }
    }
    
    class Ukey implements USB{
        function run(){
            echo "My name is Ukey<br>";
        }
    }
    
    class Umouse implements USB{
        function run(){
            echo "My name is Umouse<br>";
        }
    }
    
    $computer = new Computer;
    $computer->useUSB(new Ukey());
    $computer->useUSB(new Umouse());

      3.一个类可以继承一个抽象类,和多个接口,且抽象类在前,接口在后。
    格式是:

    class ChineseMan extends Person implements interface1,interface2,...interfaceN{
         //Class contents 
    }

      示例:

    <?php
    
    //定义第一个接口
    interface One{
        //只能是常量
        const CONSTANT = "CONSTANT value";
        function fun1();
        function fun2();
    }
    
    //定义第二个接口继承自第一个接口
    interface Two extends One{
        function fun3();
    }
    
    //定义第三个独立接口
    interface Three{
        function fun4();
    }
    
    //定义一个抽象类和一个抽象方法
    abstract class Four{
        abstract function fun5();
    }
    //定义一个类Five要先继承抽象类Four后,再继承接口Two、Three,并且实现所有的抽象方法
    class Five extends Four implements Two, Three{
        function fun1(){
            //常量输出
            echo Five::CONSTANT."<br>";
            echo __METHOD__."<br>";
        }
        
        function fun2(){
            echo __METHOD__."<br>";
        }
        
        function fun3(){
            echo __METHOD__."<br>";
        }
        
        function fun4(){
            echo __METHOD__."<br>";
        }
        
        function fun5(){
            echo __METHOD__."<br>";
        }
    }
    
    //实列化对象
    $obj = new Five;
    $obj->fun1();
    $obj->fun2();
    $obj->fun3();
    $obj->fun4();
    $obj->fun5();
  • 相关阅读:
    IEEE 754 浮点数的表示方法
    .NET Core 3.0及以上的EFCore连接MySql
    一些常见错误/技巧/结论总结
    2-sat学习笔记
    动态DP学习笔记
    动态规划优化算法——wqs二分 and 折线优化
    扩展莫队小总结(二) (回滚莫队/二次离线莫队)
    CF1504X Codeforces Round #712
    CF1500D Tiles for Bathroom (递推+大讨论)
    CF1486X Codeforces Round #703
  • 原文地址:https://www.cnblogs.com/qingsong/p/13168963.html
Copyright © 2020-2023  润新知