Blogger Information
Blog 119
fans 3
comment 1
visits 94621
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础 接口、抽象类、命名空间与MVC------PHP培训十期线上班 学号:510251 01月16日作业
赵大叔
Original
619 people have browsed it

接口、抽象类、命名空间与MVC

一、接口

1、知识点

1.1 对象的模板是:类; 类的模板是:接口
1.2 面向接中编程:是实现面向对象编程的三大特征(继承、封装、多态)之多态的重要手段
1.3 继承:extends; 封装:public, private, protected; 多态:接口
1.4 接口通过interface关键字声明
1.5 接口中只能声明常量和未实现的方法(只有方法体没有具体的实现),并且访问权限必须是public
1.6 接口不能进行实例化,只能通过类实现,一个类可以实现多个接口使用,隔开
1.7 一个类实现接口就必须将实现接口中声明的所有方法
1.8 语法

  1. interface iDemo
  2. {
  3. //常量
  4. const 常量名=常量值;
  5. //只声明方法,不实现
  6. public function getName();
  7. public function aAaaa();
  8. }
  9. //创建类实现接口:implements
  10. class Demo1 implements iDemo
  11. {
  12. //实现iDemo接口的类必须将接口中声明的方法全部实现
  13. public function getName()
  14. {
  15. //......
  16. }
  17. public function aAaaa()
  18. {
  19. //......
  20. }
  21. }
  22. }

2、php代码

  1. //创建接口:interface
  2. interface iDemo
  3. {
  4. //接口方法:只声明,不实现
  5. public function getIfor();
  6. public function hello();
  7. }
  8. //创建类实现接口
  9. class Demo1 implements iDemo
  10. {
  11. //创建自有属性
  12. public $site;
  13. protected $role;
  14. //初始化自有属性
  15. public function __construct($site, $role)
  16. {
  17. $this->site = $site;
  18. $this->role = $role;
  19. }
  20. //实现iDemo接口的类必须将接口中声明的方法全部实现
  21. public function getIfor()
  22. {
  23. return '我是:' .$this->site .'的讲师:' .$this->role;
  24. }
  25. public function hello()
  26. {
  27. return 'Hello, 大家好。。。';
  28. }
  29. }
  30. $obj =new Demo1('php.cn', '朱老师');
  31. echo $obj->getIfor();
  32. echo '<br>';
  33. echo $obj->hello();

三、抽象类:类中有未实现的方法

1、知识点

1.1 使用abstract声明
1.2 不能被实例化,只能当父类被继承,通过子类来访问
1.3 抽象类可以包含普通成员,但必须包含一个抽象方法(未被实现的方法)
1.4 子类继承抽象类时,抽象类中的抽象方法必须要在子类中实现
1.5 MVC模型用到

2、php代码

  1. <?php
  2. //抽象类:
  3. abstract class Demo2
  4. {
  5. //创建自有属性
  6. public $site;
  7. protected $role;
  8. public function __construct($site, $role)
  9. {
  10. $this->site = $site;
  11. $this->role = $role;
  12. }
  13. //抽象方法:没有被实现,只是一个声明
  14. abstract public function getIfor();
  15. //实现
  16. public function hello()
  17. {
  18. return 'Hello, 大家新年好。。。';
  19. }
  20. }
  21. //创建子类
  22. class Sub extends Demo2
  23. {
  24. private $course;
  25. //子类中实现抽象类方法
  26. public function getIfor()
  27. {
  28. return '我是:' .$this->site .'的讲师:' .$this->role .', 教的课程是:' .$this->course;
  29. }
  30. public function __construct($site, $role, $course)
  31. {
  32. parent::__construct($site, $role);
  33. $this->course = $course;
  34. }
  35. }
  36. $obj =new Sub('php.cn', '朱老师', 'JS');
  37. echo $obj->getIfor();
  38. echo '<br>';
  39. echo $obj->hello();

三、静态成员:属于类,不属于对象,在多个对象中共享

1、知识点

1.1 添加static关键字,就可以将成员定义为静态成员
1.2 在静态方法中只能访问静态成员
1.3 静态方法不允许用类实例访问,所以内部也不允许出现类实例的引用$this
1.4 访问静态成员,必须用类来访问

2、php代码

  1. <?php
  2. class Demo3
  3. {
  4. //静态属性
  5. public static $name = '朱老师';
  6. public $salary = 10000;
  7. //静态方法
  8. public static function getName()
  9. {
  10. //静态方法不允许用类实例访问,所以内部也不允许出现类实例的引用$this
  11. //return $this->$name;
  12. return self::$name;
  13. }
  14. }
  15. //访问静态成员
  16. //必须用类来访问
  17. $obj = new Demo3();
  18. echo Demo3::$name;
  19. echo '<br>';
  20. echo $obj->getName();
  21. echo '<br>';
  22. echo Demo3::getName();

四、命名空间:主要是解决了全局成员的命名冲突

1、知识点

1.1 全局成员:不受作用域限制的成员—-类/接口、函数、常量
1.2 命名空间使用namespace关键字定义
1.3 命名空间必须写在第一行,之前不能有任何代码
1.4 当前空间找到,则调用的是当前空间的函数; 当前的命名空间找不到某个函数或常量时,会自动到全局的命名空间进行查找
1.5 创建全局空间:全局空间和非全局空间格式分一致

2、php代码

  1. <?php
  2. namespace one
  3. {
  4. class A
  5. {
  6. public function getName()
  7. {
  8. return (new \A())->name;
  9. }
  10. }
  11. function a()
  12. {
  13. }
  14. //当前空间找到,则调用的是当前空间的函数
  15. function var_dump()
  16. {
  17. echo 'AAAAA';
  18. }
  19. const C = 1;
  20. echo (new A)->getName();
  21. echo '<br>';
  22. //类不会触发全局查找,函数可以
  23. //A空间中无函数var_dump
  24. //函数,常量,当前空间找不到,就到全局空间找
  25. var_dump( (new A)->getName());
  26. }
  27. namespace two {
  28. class A
  29. {
  30. }
  31. function a()
  32. {
  33. }
  34. const C = 1;
  35. //访问空间One中的A类,全局的空间使用:\
  36. echo \One\A::class;
  37. }
  38. //创建全局空间:全局空间和非全局空间格式分一至
  39. namespace
  40. {
  41. class A
  42. {
  43. public $name = 'zhu老师';
  44. }
  45. }

五、MVC

1、Model.php

  1. <?php
  2. namespace mvc;
  3. class Model
  4. {
  5. public function getData()
  6. {
  7. $data = [
  8. ['id' => 1, 'msnv' => 'TH000004', 'name' => 'van'],
  9. ['id' => 2, 'msnv' => 'TH045386', 'name' => 'sinh'],
  10. ['id' => 3, 'msnv' => 'TH059660', 'name' => 'phi'],
  11. ['id' => 4, 'msnv' => 'TH034876', 'name' => 'binh']
  12. ];
  13. return $data;
  14. }
  15. }

2、View.php

  1. <?php
  2. namespace mvc;
  3. class View
  4. {
  5. function fetch ($data)
  6. {
  7. $table = '<table border="2">';
  8. $table .= '<caption>员工名单</caption>';
  9. $table .= '<tr><td>id</td><td>msnv</td><td>name</td></tr>';
  10. foreach ($data as $good) {
  11. $table .= '<tr>';
  12. $table .= '<td>' .$good['id'] .'</td>';
  13. $table .= '<td>' .$good['msnv'] .'</td>';
  14. $table .= '<td>' .$good['name'] .'</td>';
  15. $table .= '</tr>';
  16. }
  17. $table .= '</table>';
  18. return $table;
  19. }
  20. }

3、Controller.php

  1. <?php
  2. namespace MVC;
  3. //1、加载模型类
  4. require 'Model.php';
  5. //2、加载视图类
  6. require 'View.php';
  7. //3、创建控制器
  8. class Controller
  9. {
  10. //模型对象属性
  11. private $model = '';
  12. //视图对象属性
  13. private $view = '';
  14. //构造方法,将这个构造方作为外部对象的注入点
  15. public function __construct($model, $view)
  16. {
  17. $this->model = $model;
  18. $this->view = $view;
  19. }
  20. public function index()
  21. {
  22. //1、获取数据
  23. $data = $this->model->getData();
  24. //2、渲染模板
  25. return $this->view->fetch($data);
  26. }
  27. public function Update()
  28. {
  29. //.....
  30. }
  31. }
  32. //4、客户端调用
  33. $model = new Model();
  34. $view = new View();
  35. //4.1 实例化控制器类
  36. //依赖注入:注入点是构造方法,实现对外部依赖对象的共享
  37. $controller = new Controller($model, $view);
  38. echo $controller->index();

4、结果展示

undefined

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