接口、抽象类、命名空间与MVC
一、接口
1、知识点
1.1 对象的模板是:类; 类的模板是:接口
1.2 面向接中编程:是实现面向对象编程的三大特征(继承、封装、多态)之多态的重要手段
1.3 继承:extends; 封装:public, private, protected; 多态:接口
1.4 接口通过interface
关键字声明
1.5 接口中只能声明常量和未实现的方法(只有方法体没有具体的实现),并且访问权限必须是public
1.6 接口不能进行实例化,只能通过类实现,一个类可以实现多个接口使用,隔开
1.7 一个类实现接口就必须将实现接口中声明的所有方法
1.8 语法
interface iDemo
{
//常量
const 常量名=常量值;
//只声明方法,不实现
public function getName();
public function aAaaa();
}
//创建类实现接口:implements
class Demo1 implements iDemo
{
//实现iDemo接口的类必须将接口中声明的方法全部实现
public function getName()
{
//......
}
public function aAaaa()
{
//......
}
}
}
2、php代码
//创建接口:interface
interface iDemo
{
//接口方法:只声明,不实现
public function getIfor();
public function hello();
}
//创建类实现接口
class Demo1 implements iDemo
{
//创建自有属性
public $site;
protected $role;
//初始化自有属性
public function __construct($site, $role)
{
$this->site = $site;
$this->role = $role;
}
//实现iDemo接口的类必须将接口中声明的方法全部实现
public function getIfor()
{
return '我是:' .$this->site .'的讲师:' .$this->role;
}
public function hello()
{
return 'Hello, 大家好。。。';
}
}
$obj =new Demo1('php.cn', '朱老师');
echo $obj->getIfor();
echo '<br>';
echo $obj->hello();
三、抽象类:类中有未实现的方法
1、知识点
1.1 使用abstract
声明
1.2 不能被实例化,只能当父类被继承,通过子类来访问
1.3 抽象类可以包含普通成员,但必须包含一个抽象方法(未被实现的方法)
1.4 子类继承抽象类时,抽象类中的抽象方法必须要在子类中实现
1.5 MVC模型用到
2、php代码
<?php
//抽象类:
abstract class Demo2
{
//创建自有属性
public $site;
protected $role;
public function __construct($site, $role)
{
$this->site = $site;
$this->role = $role;
}
//抽象方法:没有被实现,只是一个声明
abstract public function getIfor();
//实现
public function hello()
{
return 'Hello, 大家新年好。。。';
}
}
//创建子类
class Sub extends Demo2
{
private $course;
//子类中实现抽象类方法
public function getIfor()
{
return '我是:' .$this->site .'的讲师:' .$this->role .', 教的课程是:' .$this->course;
}
public function __construct($site, $role, $course)
{
parent::__construct($site, $role);
$this->course = $course;
}
}
$obj =new Sub('php.cn', '朱老师', 'JS');
echo $obj->getIfor();
echo '<br>';
echo $obj->hello();
三、静态成员:属于类,不属于对象,在多个对象中共享
1、知识点
1.1 添加static
关键字,就可以将成员定义为静态成员
1.2 在静态方法中只能访问静态成员
1.3 静态方法不允许用类实例访问,所以内部也不允许出现类实例的引用$this
1.4 访问静态成员,必须用类来访问
2、php代码
<?php
class Demo3
{
//静态属性
public static $name = '朱老师';
public $salary = 10000;
//静态方法
public static function getName()
{
//静态方法不允许用类实例访问,所以内部也不允许出现类实例的引用$this
//return $this->$name;
return self::$name;
}
}
//访问静态成员
//必须用类来访问
$obj = new Demo3();
echo Demo3::$name;
echo '<br>';
echo $obj->getName();
echo '<br>';
echo Demo3::getName();
四、命名空间:主要是解决了全局成员的命名冲突
1、知识点
1.1 全局成员:不受作用域限制的成员—-类/接口、函数、常量
1.2 命名空间使用namespace
关键字定义
1.3 命名空间必须写在第一行,之前不能有任何代码
1.4 当前空间找到,则调用的是当前空间的函数; 当前的命名空间找不到某个函数或常量时,会自动到全局的命名空间进行查找
1.5 创建全局空间:全局空间和非全局空间格式分一致
2、php代码
<?php
namespace one
{
class A
{
public function getName()
{
return (new \A())->name;
}
}
function a()
{
}
//当前空间找到,则调用的是当前空间的函数
function var_dump()
{
echo 'AAAAA';
}
const C = 1;
echo (new A)->getName();
echo '<br>';
//类不会触发全局查找,函数可以
//A空间中无函数var_dump
//函数,常量,当前空间找不到,就到全局空间找
var_dump( (new A)->getName());
}
namespace two {
class A
{
}
function a()
{
}
const C = 1;
//访问空间One中的A类,全局的空间使用:\
echo \One\A::class;
}
//创建全局空间:全局空间和非全局空间格式分一至
namespace
{
class A
{
public $name = 'zhu老师';
}
}
五、MVC
1、Model.php
<?php
namespace mvc;
class Model
{
public function getData()
{
$data = [
['id' => 1, 'msnv' => 'TH000004', 'name' => 'van'],
['id' => 2, 'msnv' => 'TH045386', 'name' => 'sinh'],
['id' => 3, 'msnv' => 'TH059660', 'name' => 'phi'],
['id' => 4, 'msnv' => 'TH034876', 'name' => 'binh']
];
return $data;
}
}
2、View.php
<?php
namespace mvc;
class View
{
function fetch ($data)
{
$table = '<table border="2">';
$table .= '<caption>员工名单</caption>';
$table .= '<tr><td>id</td><td>msnv</td><td>name</td></tr>';
foreach ($data as $good) {
$table .= '<tr>';
$table .= '<td>' .$good['id'] .'</td>';
$table .= '<td>' .$good['msnv'] .'</td>';
$table .= '<td>' .$good['name'] .'</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
3、Controller.php
<?php
namespace MVC;
//1、加载模型类
require 'Model.php';
//2、加载视图类
require 'View.php';
//3、创建控制器
class Controller
{
//模型对象属性
private $model = '';
//视图对象属性
private $view = '';
//构造方法,将这个构造方作为外部对象的注入点
public function __construct($model, $view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
//1、获取数据
$data = $this->model->getData();
//2、渲染模板
return $this->view->fetch($data);
}
public function Update()
{
//.....
}
}
//4、客户端调用
$model = new Model();
$view = new View();
//4.1 实例化控制器类
//依赖注入:注入点是构造方法,实现对外部依赖对象的共享
$controller = new Controller($model, $view);
echo $controller->index();