博客列表 >面向接口和特殊类trait编程的学习

面向接口和特殊类trait编程的学习

我是郭富城
我是郭富城原创
2020年05月03日 04:43:07677浏览

面向接口编程

1.结合自己的理解, 写一个接口的案例

  • 接口定义了实现某种服务的一般规范,声明了所需的函数(接口方法)和常量,但不指定如何实现。之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定义。关键是要建立必须实现的一组一般原则,只有满足了这些原则才能说实现了这个接口。

    就如同老师给同学们出了一道开放题,这个题目是抽象的,解答的方法有很多

  1. <?php
  2. interface Fruit
  3. {
  4. const MAX_WEIGHT = 5; //静态常量(接口的常量)
  5. function setName($name);
  6. function getName();
  7. }
  8. //实现接口
  9. class Apple implements Fruit
  10. {
  11. private $name;
  12. function getName()
  13. {
  14. return $this->name;
  15. }
  16. function setName($_name)
  17. {
  18. $this->name = $_name;
  19. }
  20. }
  21. $apple = new Apple(); //创建对象
  22. $apple->setName("苹果");
  23. echo "创建了一个" . $apple->getName();
  24. echo "<br />";
  25. echo "MAX_GRADE is " . Apple::MAX_WEIGHT; //静态常量

2.接口的继承

  • 接口含有常量,接口方法
  • 接口默认都是抽象方法,不能直接实例化
  • 接口类就是一个类的领导者,指明方向,子类必须完成它指定方法。

    接口是一堆方法的说明,不能加属性(成员变量)
    接口就是供组装成类用的,方法只能用 public;

  1. <?php
  2. interface iNicola
  3. {
  4. //接口常量
  5. const NATION = '中国广东梅州';
  6. }
  7. interface iNicola1 extends iNicola
  8. {
  9. //接口常量
  10. const USER_NAME = '尼古拉';
  11. }
  12. //接口允许多继承
  13. interface iNicola2 extends iNicola, iNicola1
  14. {
  15. //接口方法
  16. public function write();
  17. }
  18. //实现类
  19. class Nicola implements iNicola, iNicola1, iNicola2
  20. {
  21. //必须实现接口中的抽象方法
  22. public function write()
  23. {
  24. return iNicola1::USER_NAME . '家乡是:' . iNicola::NATION;
  25. }
  26. }
  27. echo (new Nicola)->write();

3. trait 的基本功能,代码复用

  • 与抽象类和接口一样,不能被实例化,只能嵌入到宿主类使用
  • trait 是一个特殊类:1.常规属性,2.静态,3.抽象,不能有类常量
  • 代码复用

    在继承上下文环境中,具有优先级,通过优先级别的设置,降低单继承的影响
    子类 > trait > 父类

  1. <?php
  2. // trait php5.4+ 代码复用
  3. // 与抽象类和接口一样,不能被实例化,只能嵌入到宿主类使用
  4. // trait是一个特殊类:1.常规属性,2.静态,3.抽象,不能有类常量
  5. trait tDemo
  6. {
  7. //常规
  8. public $nicola = '尼古拉';
  9. public function get()
  10. {
  11. return $this->nicola;
  12. }
  13. //静态
  14. public static $nico = '搬运工/Boss';
  15. public static function set()
  16. {
  17. return '职业是:' . self::$nico;
  18. }
  19. //抽象
  20. public static $age;
  21. //抽象方法
  22. abstract public static function set1();
  23. }
  24. // 客户端
  25. class Nicola
  26. {
  27. use tDemo;
  28. public static function set1()
  29. {
  30. return self::$age;
  31. }
  32. }
  33. $nicola = new Nicola;
  34. Nicola::$age = '18';
  35. echo Nicola::set1();
  • 案例演示
  1. <?php
  2. trait Dog{
  3. public $name="小狗";
  4. public function bark(){
  5. echo "这是一只旺财";
  6. }
  7. }
  8. class Animal{
  9. public function eat(){
  10. echo "旺财正在吃东西";
  11. }
  12. }
  13. class Cat extends Animal{
  14. use Dog;
  15. public function drive(){
  16. echo "旺财在开车";
  17. }
  18. }
  19. $cat = new Cat();
  20. $cat->drive();
  21. echo "<br/>";
  22. $cat->eat();
  23. echo "<br/>";
  24. $cat->bark();

4. 总结

关于 trait 的理解,php 从以前到现在一直都是单继承的语言,无法同时从两个基类/父类中继承属性和方法,为了解决这个问题,php 出了 Trait 这个特性。通过在类中使用 use 关键字,声明要组合的 Trait 名称,具体的 Trait 的声明使用 Trait 关键词,Trait 不能实例化。

上一条:PHP运算符下一条:数据库设计问题
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议