搜索
博主信息
博文 25
粉丝 0
评论 0
访问量 20110
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
类相关的关键字 - interface
力挽狂澜的博客
原创
1478人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学