博客列表 >类相关的关键字 - interface

类相关的关键字 - interface

力挽狂澜的博客
力挽狂澜的博客原创
2018年05月10日 18:57:461214浏览

interface 

接口类: 成员方法必须声明为public访问权限,有定义但没有具体实现,可以声明常量但无法声明属性,无法实例化,只能被其他类implements(实现)的特殊类.只能extends(继承)接口,但可以继承多个interface(接口) .

1.接口中定义的所有方法都必须没有实现,只有定义

<?php
//错误示例: 方法进行了实现
interface human {
    public function walk(){
        // todo
    }
    
    public function run(){
        // todo
    }
}

( ! ) Fatal error: Interface function human::walk() cannot contain body in F:\wamp\www\blog.54skyer.cn\index.php on line 81

2.接口中所有方法的访问修饰符都必须是public

<?php
//错误示例: 方法访问权限修饰符不是public
interface human {
    protected function walk();
    
    private function run();
}

( ! ) Fatal error: Access type for interface method human::walk() must be omitted in F:\wamp\www\blog.54skyer.cn\index.php on line 79


<?php
//正确示例: 方法访问权限修饰符必须都是public,且方法只有定义没有实现.
interface human {
    public function walk();
    
    public function run();
}

3.可以定义常量,但不能定义属性

<?php
//错误示例: 定义属性
interface mp4 {
    $name = 'mp4';
    public function vedio();
    public function music();
}

( ! ) Parse error: syntax error, unexpected '$name' (T_VARIABLE), expecting function (T_FUNCTION) in F:\wamp\www\blog.54skyer.cn\index.php on line 80

<?php
//正确示例: 定义常量
interface mp4 {
    const name = 'mp4';
    public function vedio();
    public function music();
}

4.不能被实例化,只能被其他类实现

<?php
//错误示例: 实例化
interface human {
    public function walk();
    
    public function run();
}
$human = new human();

( ! ) Fatal error: Cannot instantiate interface human in F:\wamp\www\blog.54skyer.cn\index.php on line 83

<?php
//错误示例: 不是所有的方法都被实现.teacher::run()没有方法体
interface human {
    public function walk();
    
    public function run();
}
//$human = new human();
class teacher implements human {
    public function walk(){
        echo "teacher walk";
    }
    
    public function run();
}

( ! ) Fatal error: Non-abstract method teacher::run() must contain body in F:\wamp\www\blog.54skyer.cn\index.php on line 90

<?php
//错误示例: 不是所有的方法都被实现.human::walk没有被实现
interface human {
    public function walk();
    
    public function run();
}
//$human = new human();
class teacher implements human {
    public function run(){
        echo "teacher run";
    };
}

( ! ) Fatal error: Class teacher contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (human::walk) in F:\wamp\www\blog.54skyer.cn\index.php on line 92

<?php
//正确示例: 所有的方法都被实现.
interface human {
    public function walk();
    
    public function run();
}
//$human = new human();
class teacher implements human {
    public function walk(){
        echo "teacher walk";
    }
    public function run(){
        echo "teacher run";
    };
    // 还有有自己的特殊行为
    public function teach(){
        echo "teacher teach";
    }
}
$teacher = new teacher();
$teacher->walk();
$teacher->run();
$teacher->teach();

5.可以extends(继承)其他接口,最后的类implements(实现)接口时,需要将继承链上的所有接口的抽象方法都实现

<?php
//错误示例: 没有将继承链上的接口的方法都实现
interface human {
    public function walk();
    
    public function run();
}

interface male extends human {
    public function showSelf();
}

class man implements male {
    
}
$man = man();

Fatal error: Class man contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (male::showSelf, human::walk, human::run) in F:\wamp\www\blog.54skyer.cn\index.php on line 90

<?php
//正确示例: 继承链上的接口的方法都实现
interface human {
    public function walk();
    
    public function run();
}

interface male extends human {
    public function showSelf();
}

class man implements male {
    
}
class man implements male {
    public function walk(){
        echo "man wallk";
    }
    
    public function run(){
        echo "man run";
    }
    
    public function showSelf(){
        echo "man show himself";
    }
}
$man = new man();
$man->walk();
$man->run();
$man->showSelf();

6.可以继承多个接口,多个被继承的接口用逗号隔开,最后的类implements(实现)接口时,需要将继承链上的所有接口的抽象方法都实现

<?php
//错误示例: 没有将继承链上的接口的方法都实现
interface mp3 {
    public function music();
}

interface phone {
    public function call();
}

interface mobilephone extends mp3, phone {
    public function note();
}

class iphone implements mobilephone {
    
}

$iphone = new iphone();

( ! ) Fatal error: Class iphone contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (mobilephone::note, mp3::music, phone::call) in F:\wamp\www\blog.54skyer.cn\index.php on line 92

<?php
//正确示例: 将继承链上的接口的方法都实现
interface mp3 {
    public function music();
}

interface phone {
    public function call();
}

interface mobilephone extends mp3, phone {
    public function note();
}

class iphone implements mobilephone {
    public function music(){
    echo 'play a music';
    }
    public function call(){
    echo 'make a call';
    }
    
    public function note(){
    echo 'write a note';
    }
}

$iphone = new iphone();
$iphone->music();
$iphone->call();
$iphone->note();

总结: 接口更多是定义一个标准,用来规范属于这个抽象范围内的子类或者实现类.如果希望代码工程是标准规范可控,应该业务模型阶段把接口都定义好,写业务逻辑时只需要关注实现就可以了,方法属性命名都可以在定义接口类时定义好.

注:

implements(实现)接口的第一个普通类[即可以是普通的class也可以是abstract class],所有方法访问权限必须为public,方法的实现必须保持参数数量一致,参数名称可以不同.

有关abstract(抽象类)的相关只是见另一篇博文 => 类相关的关键字 - abstrct

欢迎评论区交流讨论!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议