博主信息
博文 43
粉丝 1
评论 0
访问量 43219
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP 接口(interface)与trait
蔚蓝世纪
原创
1244人浏览过

一、interface接口

使用接口(interface):可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

  1. //继承单个接口
  2. interface monitor
  3. {
  4. const name = '张希希';
  5. }
  6. class myclass implements monitor//通过类来实现这个接口
  7. {
  8. public function write()
  9. {
  10. return myclass::name . '是我们的班长';
  11. }
  12. }
  13. echo (new myclass)->write();
  14. echo '<hr>';
  15. //继承多个接口
  16. interface monitor2
  17. {
  18. const name = '李原丁';
  19. }
  20. interface chargeman extends monitor2
  21. {
  22. const class1 = '五一班';
  23. }
  24. class myclass2 implements chargeman
  25. {
  26. public function write()
  27. {
  28. return monitor2::name . '是' .chargeman::class1 . '的班长。';
  29. }
  30. }
  31. echo (new myclass2)->write();
  32. echo '<hr>';
输出效果:

二、Trait

因为php是一种单继承语言,那么我们需要继承多个类的时候怎么办呢?于是php给了我们一个工具,就是“Trait”。

  1. Trait:基本功能是,为类似 PHP 的单继承语言而准备的一种代码复用机制。
  2. 我们仅仅需要在类中用use声明多个trait,这样当前类中的同名方法覆盖trait,而trait又覆盖基类中的同名方法,属性也是一样的。
1.trait优先级:从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

如:

  1. trait Hi{
  2. public function sayHi() {
  3. echo 'Hi, baby!';
  4. }
  5. }
  6. class Hy {
  7. use Hi;
  8. public function sayHi() {
  9. echo 'Hi , Girl!';
  10. }
  11. }
  12. $a = new Hy();
  13. $a->sayHi();

输出:

2.在同一个class中可以使用多个Trait

如:

  1. trait first_trait {
  2. function first_method()
  3. {
  4. echo $number = '1250,';
  5. }
  6. }
  7. trait second_trait {
  8. function second_method()
  9. {
  10. echo $number = '2';
  11. }
  12. }
  13. class first_class {
  14. use first_trait,second_trait;
  15. }
  16. $a = new first_class();
  17. $a->first_method();
  18. $a->second_method();

输出:

3.在多个class中可以同时使用一个Trait

如:

  1. trait Hi{
  2. public function sayHi1() {
  3. echo 'Hi, baby!';
  4. }
  5. }
  6. class Hy {
  7. use Hi;
  8. public function sayHi2() {
  9. echo 'Hi , Girl!';
  10. }
  11. }
  12. class Ha {
  13. use Hi;
  14. public function sayHi3() {
  15. echo 'Hi , Boy!';
  16. }
  17. }
  18. class Hb {
  19. use Hi;
  20. public function sayHi4() {
  21. echo 'Hi , Anna!';
  22. }
  23. }
  24. $a = new Hy();
  25. $b = new Ha();
  26. $c = new Hb();
  27. $a->sayHi1();
  28. $b->sayHi1();
  29. $c->sayHi1();
  30. ?>

输出:

4.trait之间也可以嵌套
  1. trait first_trait {
  2. function first_method()
  3. {
  4. echo $name1 = '张秀英 ';
  5. }
  6. }
  7. trait second_trait {
  8. use first_trait;
  9. function second_method()
  10. {
  11. echo $name2 = '& 赵云珂';
  12. }
  13. }
  14. class first_class {
  15. use second_trait;
  16. }
  17. $a = new first_class();
  18. $a->first_method();
  19. $a->second_method();

输出:

5.trait的抽象类用法

如:

  1. trait first_trait{
  2. function first_method()
  3. {
  4. echo $number = '50';
  5. }
  6. //这里可以加入修饰符,说明调用类必须实现它
  7. abstract public function second_method();
  8. }
  9. class first_class{
  10. use first_trait;
  11. function second_method(){
  12. echo $str = '这个数字是正确的。';
  13. }
  14. }
  15. $a = new first_class();
  16. $a->first_method();
  17. $a->second_method();

输出:

三、总结

  1. 每个类的定义都以关键字 class 开头,一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。
  2. 每个接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的,这点类似于抽象类。
  3. 每个trait都是通过trait关键字来定义的,与class类似,但仅仅旨在用细粒度和一致的方式来组合功能。无法通过 trait 自身来实例化,这点类似于抽象类。
  4. classinterfacetrait都可以实现并列、嵌套。
  5. interfacetrait都需要通过class类来实例化。
  6. 多个class类可以同时调用一个trait,但是这几个类之间不需要继承。
批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:接口之间允许多继承, 类不行, 而trait 正好可以弥补这个短板, 不得不说, php的设计者真是贴心
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学