验证PHP接口

从完全不了解接口的地方开始学习。引用自官方文档。

通过对象接口,可以创建指定代码,而无需定义了这些方法的实现,来指定某个类需要实现的方法类型。

现在开始实际写作了。

1. 基本 – 基本的 de)

我花了一些时间来理解。

<?php

require_once(__DIR__ . '/classTest.php');

classSample::two();

?>
<?php

interface Test {
    public function one();
    public function two();
}

class classTest implements Test
{
    public function one(){
        echo 'TestOne';

    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements Test
{
    public function one(){
        echo 'SampleTwo';

    }

    public function two(){
        echo 'SampleTwo';

    }
}

?>
・実行結果
SampleTwo

这里是正常的,但是在接口中指定的方法是必须要使用的。

如果提到的话,需要至少使用one方法和two方法。

如果在”ClassSample”类中将”one”方法注释掉并运行,则会如下所示↓

・実行結果
Fatal error: Class classSample contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Test::one) in /・・・・・・/classTest.php on line 22

如果方法增加了

方法增多的句子有问题吗?

<?php

require_once(__DIR__ . '/classTest.php');

classSample::three();

?>
<?php

interface Test {
    public function one();
    public function two();
}

class classTest implements Test
{
    public function one(){
        echo 'TestOne';

    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements Test
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }


    public function three(){
        echo 'SampleThree';

    }

}

?>
・実行結果
SampleThree

关于新增加的方法可以使用。

3. 繼承

能不能继承?

<?php

interface Test extends classTest {
    public function one();
    public function two();
}

class classTest
{
    public function one(){
        echo 'TestOne';

    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements Test
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

}

?>
・実行結果
Fatal error: Test cannot implement classTest - it is not an interface in /・・・・・・・/classTest.php on line 3

这个怎么样?

<?php

interface TestA {
    public function one();
}

interface TestB extends TestA{
    public function two();
}

class classTest
{
    public function one(){
        echo 'TestOne';

    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements TestA
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

}

?>
・実行結果
SampleTwo

原來如此。所以接口可以被繼承是嗎?

另外,可以使用逗号分隔来进行多重继承。

<?php

interface TestA {
    public function one();
}

interface TestB{
    public function two();
}

interface TestC extends TestA, TestB{
    public function three();
}

class classSample implements TestC
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

    public function three(){
        echo 'SampleThree';

    }

}

?>

4. 接口(Interface)和抽象(Abstract)的区别。

我会引用下面的文章:
https://qiita.com/yukiyohure0923/items/0e49a313b2b8c98d3a29

1. 可以定义常量。
2. 只能指定public访问修饰符。
3. 由于interface不是类,所以无法实例化。
4. 当在类中使用时,需通过implements关键字指定interface的名称。
5. 无法定义带有实现的方法或属性(仅允许抽象方法)。
6. 一个类可以实现多个interface(类似于多重继承)。
7. 必须在类内部使用(重写)通过interface定义的方法。

・摘要
1. 访问修饰符可以自由地添加
2. 抽象属性只能在抽象类中定义
3. 抽象类是类,但不能直接实例化
4. 在类中使用时,可以像常规继承一样使用extends
5. 可以定义具有实体方法和属性的普通类
6. 必须在继承抽象类并继承了“定义但未实现的方法”的类中使用(覆盖)

广告
将在 10 秒后关闭
bannerAds