PHP接口的概念跟接口语言与接口的应用场景

    xiaoxiao2025-04-28  14

    类: 是某一类事物的抽象,是某类对象的蓝图.


    举例:

    比如: 女娲造人时,脑子中关于人的形象 就是人类 class Human

    如果,女娲决定造人---->形象又没最终定稿时,---->她脑子有哪些支离破碎的形象呢?

    她可能会这么思考:

    动物: 会吃饭

    猴子: 会奔跑

    猴子: 会哭

    自己: 会思考

    小鸟:会 飞

    定义如下功能:

    eat()

    run();

    cry();

    think();

    interface:接口

    定义如下功能: PHP //interface:接口 interface animal { public function eat();//吃 } interface monkey { public function run();//跑 public function cry();//哭 } interface wisdom { public function think();//思考 } interface bird { public function fly();//飞 } /*** 如上,我们把每个类中的这种实现的功能拆出来 分析: 如果有一种新生物,实现了eat() + run() +cry() + think() ,这种智慧生物,可以叫做人. ***/ /* class Human implements animal,monkey,wisdom { } Class Human contains 4 abstract methods 竟然说我有4个抽象方法 -----------------因为接口的方法本身就是抽象的,不要有方法体,也不必加abstract ----------------- */ class Human implements animal,monkey,wisdom { public function eat() { echo '吃'; } public function run() { echo '走'; } public function cry() { echo '哭'; } public function think() { echo '思考'; } } $lisi = new Human(); $lisi->think(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 //interface:接口 interface animal {      public function eat ( ) ; //吃 }   interface monkey {      public function run ( ) ; //跑      public function cry ( ) ; //哭 }   interface wisdom {      public function think ( ) ; //思考 }   interface bird {      public function fly ( ) ; //飞 }     /*** 如上,我们把每个类中的这种实现的功能拆出来 分析: 如果有一种新生物,实现了eat() + run() +cry() + think() ,这种智慧生物,可以叫做人. ***/   /* class Human implements animal,monkey,wisdom {      }   Class Human contains 4 abstract methods 竟然说我有4个抽象方法   -----------------因为接口的方法本身就是抽象的,不要有方法体,也不必加abstract ----------------- */   class Human implements animal , monkey , wisdom {      public function eat ( ) {          echo '吃' ;      }        public function run ( ) {          echo '走' ;      }        public function cry ( ) {          echo '哭' ;      }        public function think ( ) {          echo '思考' ;      } }   $lisi = new Human ( ) ; $lisi -> think ( ) ;

    重点说明:

    类如果是一种事物/【动物】的抽象

    那么 接口,则是事物/动物----------【功能】的抽象,

    功能各拆成小块------>自由组合成新的物种

    根据接口,造一个 PHP class BirdMan implements animal,monkey,wisdom,bird{ public function eat() { echo '吃'; } public function run() { echo '走'; } public function cry() { echo '哭'; } public function think() { echo '思考'; } public function fly() { echo 'hi,我是天使,但大家都叫我鸟人'; } } echo '<br />'; $birdli = new BirdMan(); $birdli->fly(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class BirdMan implements animal , monkey , wisdom , bird {      public function eat ( ) {          echo '吃' ;      }        public function run ( ) {          echo '走' ;      }        public function cry ( ) {          echo '哭' ;      }        public function think ( ) {          echo '思考' ;      }        public function fly ( ) {          echo 'hi,我是天使,但大家都叫我鸟人' ;      } }   echo '<br />' ;   $birdli = new BirdMan ( ) ; $birdli -> fly ( ) ;

    接口的具体语法:


    1:以人类为, class Human 是人的草图

    接口 是零件--->可以用多种零件组合出一种新物种来.

    2: 如上,[接口本身]即是---------抽象的,

    [内部声明的方法] 默认也是---------抽象的,不用加 abstract

    3: 一个类可以一次性实现多个接口.

    语法用【 implements 实现 】(把我这几个功能实现了)

    class ClassName implements interface1,interface2,interface3 {

    }

    然后再把接口的功能给实现.

    4 接口也可以继承, 用extends

    5:接口是一堆方法的说明,不能加属性

    6:接口就是供组装成类用的,封闭起来没有意义,因此方法只能是public

    父类eat也会继承 PHP interface animal { public function eat(); } interface monkey extends animal { public function run(); public function cry(); } interface wisdom { public function think(); } interface bird extends animal{ public function fly(); } class Human implements monkey,wisdom { public function eat() { echo '吃'; } /* public function eat() { echo '吃'; } 致命错误:类人包含抽象方法,因此必须被声明为抽象或实现的方法eat() 父类eat也会继承*/ public function run() { echo '走'; } public function cry() { echo '哭'; } public function think() { echo '思考'; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 interface animal {      public function eat ( ) ; }   interface monkey extends animal {      public function run ( ) ;      public function cry ( ) ; }   interface wisdom {      public function think ( ) ; }   interface bird extends animal {      public function fly ( ) ; }       class Human implements monkey , wisdom {      public function eat ( ) {          echo '吃' ;      } /*    public function eat() {         echo '吃';     } 致命错误:类人包含抽象方法,因此必须被声明为抽象或实现的方法eat() 父类eat也会继承*/      public function run ( ) {          echo '走' ;      }        public function cry ( ) {          echo '哭' ;      }        public function think ( ) {          echo '思考' ;      } }

    面向对象的一个观点:


    做的越多,越容易犯错

    抽象类{就定义类模板}--------------->具体子类实现{语言展现china,japan,english}

    接口:

    抽象的数据库类

    举例:

    ----------->创业做网站:

    到底用什么数据库? mysql, oracle,sqlserver,postgresql?

    这样:先开发网站,运行再说.

    先弄个mysql开发着,正式上线了再换数据库也不迟

    ----------->引来问题:

    换数据库,会不会以前的代码又得重写?

    答:不必,用抽象类

    ----------->开发者,开发时,就以db抽象类来开发.

    抽象类 PHP abstract class db { public abstract function connect($h,$u,$p);//链接功能 public abstract function query($sql);//发送sql public abstract function close();//关闭 } 1 2 3 4 5 6 7 abstract class db {      public abstract function connect ( $h , $u , $p ) ; //链接功能        public abstract function query ( $sql ) ; //发送sql        public abstract function close ( ) ; //关闭 }

    下面这个代码有误

    因为子类实现时, connect和抽象类的connect参数不一致

    错误的代码 Default class mysql extends db { public function connect($h,$h) { return true; } public function query($sql,$conn) { } public function close() { } } 1 2 3 4 5 6 7 8 9 10 11 class mysql extends db {      public function connect ( $ h , $ h ) {          return true ;      }        public function query ( $ sql , $ conn ) {      }        public function close ( ) {      } }

    正确的严格的抽象类调用!

    下面这个mysql类,严格实现了db抽象类 PHP 下面这个mysql类,严格实现了db抽象类 试想: 不管上线时,真正用什么数据库 我只需要再写一份如下类 class oracle extends db { } class mssql extends db { } class postsql extends db { } 业务逻辑层不用改? 为什么不用改? 因为都实现的db抽象类. 我开发时,调用方法不清楚的地方,我就可以参考db抽象类. 反正子类都是严格实现的抽象类. */ class mysql extends db { public function connect($h,$h,$u) { return true; } public function query($sql) { } public function close() { } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 下面这个 mysql,严格实现了 db抽象类 试想 : 不管上线时 ,真正用什么数据库   我只需要再写一份如下类 class oracle extends db { }   class mssql extends db { }   class postsql extends db { }   业务逻辑层不用改 ?   为什么不用改 ? 因为都实现的 db抽象类 .       我开发时 ,调用方法不清楚的地方 ,我就可以参考 db抽象类 . 反正子类都是严格实现的抽象类 . * / class mysql extends db {      public function connect ( $h , $h , $u ) {          return true ;      }        public function query ( $sql ) {      }        public function close ( ) {      } }

    接口 就更加抽象了

    比如一个社交网站,

    关于用户的处理是核心应用.

    登陆

    退出

    写信

    看信

    招呼

    更换心情

    吃饭

    骂人

    捣乱

    示爱

    撩骚

    这么多的方法,都是用户的方法,

    自然可以写一个user类,全包装起来

    但是,分析用户一次性使不了这么方法

    用户信息类:{登陆,写信,看信,招呼,更换心情,退出}

    用户娱乐类:{登陆,骂人,捣乱,示爱,撩骚,退出}

    开发网站前,分析出来这么多方法,

    但是,不能都装在一个类里,

    分成了2个类,甚至更多.

    作用应用逻辑的开发,这么多的类,这么多的方法,都晕了.

    PHP interface UserBase { public function login($u,$p); public function logout(); } //登陆 退出 interface UserMsg { public function wirteMsg($to,$title,$content);//写信 public function readMsg($from,$title);//收信 } interface UserFun { public function spit($to); public function showLove($to); } //娱乐 /* 作为调用者, 我不需要了解你的用户信息类,用户娱乐类, 我就可以知道如何调用这两个类 因为: 这两个类 都要实现 上述接口. 通过这个接口,就可以规范开发. */ /* 下面这个类,和接口声明的参数不一样,就------------->报错, 这样,接口强制统一了类的功能 不管你有几个类,一个类中有几个方法 我只知道,方法都是实现的接口的方法. */ class User implements UserBase { public function login($u) { } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 interface UserBase {      public function login ( $u , $p ) ;        public function logout ( ) ; } //登陆 退出 interface UserMsg {      public function wirteMsg ( $to , $title , $content ) ; //写信      public function readMsg ( $from , $title ) ; //收信 }   interface UserFun {      public function spit ( $to ) ;      public function showLove ( $to ) ; } //娱乐     /* 作为调用者, 我不需要了解你的用户信息类,用户娱乐类, 我就可以知道如何调用这两个类   因为: 这两个类 都要实现 上述接口. 通过这个接口,就可以规范开发.   */     /* 下面这个类,和接口声明的参数不一样,就------------->报错, 这样,接口强制统一了类的功能 不管你有几个类,一个类中有几个方法   我只知道,方法都是实现的接口的方法. */ class User implements UserBase {      public function login ( $u ) {      } }

    推荐阅读:

    PHP抽象类:无法实例化

    转载请注明原文地址: https://ju.6miu.com/read-1298522.html
    最新回复(0)