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