<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>类-接口</title>
</head>
<body>
<?php
date_default_timezone_set("Asia/Shanghai");
#类-接口
#TIP: 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容
#TIP: 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的
#TIP: 接口中定义的所有方法都必须是公有,这是接口的特性
#TIP: 类可以实现多个接口,用逗号来分隔多个接口的名称
#NOTE: 实现多个接口时,接口中的方法不能有重名
#NOTE: 接口也可以继承,通过使用 extends 操作符
#NOTE: 类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误
#NOTE: 接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖
/**
* 简单例子
*/
function demo() {
interface iTemplate {
public function setVariable($name, $var);
public function getHtml($template);
}
class Template implements iTemplate {
private $vars = array();
public function setVariable ($name, $var) {
$this->vars[$name] = $var;
}
public function getHtml ($template) {
foreach ($this->$vars as $name => $value) {
$template = str_replace('{'.$name.'}', $value, $template);
}
return $template;
}
}
}
// demo();
/**
* 可扩充的接口
*/
function demo2() {
interface a {
public function foo();
}
interface b extends a {
public function baz(Baz $baz);
}
class C implements b {
public function foo(){}
public function baz(Baz $baz){}
}
}
// demo2();
/**
* 继承多个接口
*/
function demo3() {
interface a {
public function foo();
}
interface b {
public function bar();
}
interface c extends a,b {
public function baz();
}
class d implements c {
public function foo() {}
public function bar() {}
public function baz() {}
}
}
// demo3();
/**
* 使用接口常量
* tips: 常量不能被覆盖
*/
function demo4() {
interface a {
const b = 'Interface constant';
}
// 输出接口常量
echo a::b;
}
demo4();
?>
</body>
</html>