验证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. 必须在继承抽象类并继承了“定义但未实现的方法”的类中使用(覆盖)

bannerAds