Blogger Information
Blog 25
fans 0
comment 0
visits 16864
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类相关的关键字 - interface
力挽狂澜的博客
Original
1218 people have browsed it

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

欢迎评论区交流讨论!

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post