Blogger Information
Blog 62
fans 7
comment 2
visits 58290
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
面向接口和特殊类trait编程的学习
我是郭富城
Original
678 people have browsed it

面向接口编程

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 不能实例化。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:接口, 像是宪法, 是其它法律的参考与依据
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post