接口可以认为是规范类的模板,具体怎么运行操作还是需要看继承的子类怎么写,具体需要注意的的地方与写法如下所示:
- interface 接口中的方法必须为 public 公开的:
<?php
interface A{
public function info();
}
其中 public 可以省略,简写为如下方式:
<?php
interface A{
function info();
}
若定义方法类型会报致命错误:Access type for interface method A::info() must be omitted in /wwwroot/api.php on line 3 例如:
<?php
interface A{
private function info();
}
- interface 接口它不需要实例化,但是需要 implements 去继承它,并且接口中定义的变量必须传递,继承写法如下:
<?php
interface A{
private function info($name);
}
class B implements A{
function info($name){
echo "Hello{$name}!";
}
}
$obj = new B();
$obj -> info('小桥');
- interface 接口中可以定义常量但不允许定义成员变量,例如:
<?php
class A {
const Num = 100;
}
没有问题,但是定义成员变量则会出现如下报错信息:Parse error: syntax error, unexpected ‘$num’ (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST) in /wwwroot/api.php on line 3 例如:
<?php
class A {
$num = 100;
}
- 如果子类为非抽象类且类中没有接口里定义的方法时会出现致命错误:Fatal error: Access type for interface method A::info() must be omitted in /wwwroot/api.php on line 2 例如:
<?php
interface A{
function info($name);
}
class B implements A{
function a($name){
echo "Hello{$name}!";
}
}
- interface 接口中方法函数不建议定义默认值,若是定义需要子类也同时定义,例如:
<?php
interface A{
function info($name = '小明');
}
class B implements A{
function info($name){
echo "Hello{$name}!";
}
}
会出现 Fatal error: Declaration of B::info( name = ‘小明’) in /wwwroot/api.php on line 6 的致命错误,即使你向 info() 方法传递了值,例如:
<?php
interface A{
function info($name = '小明');
}
class B implements A{
function info($name){
echo "Hello{$name}!";
}
}
$obj = new B();
$obj -> info('小明');
- 子类可以继承多个接口且接口间能够进行继承:
//定义接口 A
interface A{
function info();
}
//定义接口 B 并继承接口 A
interface B extends A{
function eat($name, $food);
}
//定义子类 C 使用接口 B
class C implements B{
function info(){
echo '接口继承<br/>';
}
function eat($name = '小明', $food = '菜'){
echo $name . "正在吃" . $food . '<br>';
}
}
$demo = new C();
$demo -> info();
$demo -> eat();
$demo -> eat('小红', '苹果');