为什么会有接口呢?

一个 class 不是可以打遍天下呢?

对象接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的

接口中定义的所有方法都必须是公有的,这是接口的特性,接口定义一个构造方法是被允许的。

实现(implements)

要实现一个接口,使用implements操作符类中必须实现接口中定义的所有方法,否则会报错。类可以实现多个接口,用逗号来分割多个接口的名称。、

注意:接口中的方法不能有重名

注意:接口也可以继承,通过使用extends操作符

注意:类要实现接口, 必须使用和接口中所定义的方法完全一直的方式。否则会导致报错。
常量

接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。

iTemplate.php

<?php
interface iTemplate {
 public function setVariable($name,$var);
 public function getHtml($template);
}

Template 实现 iTemplate
Template.php

<?php
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;
     }
}

// 可以被继承
A.php

<?php
interface A{
 public function a();
}

B.php

<?php
interface B extends A {
 // 继承接口,可以不使用父类接口的方法
 public function b(Baz $baz);
 // 继承接口,也可以重写父类接口的方法
 //public function foo();}

C.php =>C implements B

<?php
class C implements B {
 public function a()
 { 
    echo "foolish";
 }
 public function b(Baz $baz)
 {
    echo "junk";
 }
}

父类接口定义一个常量,子类implements 父类,不能重写常量
D.php

<?php
interface D {
 const b = 'interface constant';
}
echo D::b;

F.php

<?php
class F implements D {
 const b = "class F "; // 会报错
}

总结:
接口:
1:可以继承可以实现
2:接口只定义方法,实现
3:一个类实现某个接口(implements),那么这个类必须实现接口中所有的方法
4:接口的中定义的方法,关键字必须是 public
5:一个接口继承了另一个接口 (extends) ,然后一个类实现接口,必须实现两个接口中所有的方法
6:接口不能实例化


Gabriel
36 声望4 粉丝

« 上一篇
二叉树的遍历
下一篇 »
PHP抽象类

引用和评论

0 条评论