随笔 - 72,  文章 - 0,  评论 - 1,  阅读 - 22506

在 PHP 中,接口是一种定义方法但不实现它们的方式。接口可以被类实现,使得这些类承诺实现接口中定义的所有方法。接口主要用于定义类的共同行为,而不涉及具体的实现细节。以下是 PHP 接口的基本用法:

定义接口

interface Animal {
    public function makeSound();
    public function eat();
}

现在,Animal 接口定义了两个方法:

  1. makeSound():用来让动物发出声音。
  2. eat():用来描述动物进食的行为。

实现接口的类

你需要在实现了 Animal 接口的类中提供这两个方法的具体实现:

phpCopy Code
class Dog implements Animal {
    public function makeSound() {
        echo "汪汪";
    }
    
    public function eat() {
        echo "狗在吃食物";
    }
}

class Cat implements Animal {
    public function makeSound() {
        echo "喵喵";
    }
    
    public function eat() {
        echo "猫在吃食物";
    }
}

使用实现类

你可以创建 DogCat 对象,并调用它们的 makeSound()eat() 方法:

phpCopy Code
$dog = new Dog();
$dog->makeSound(); // 输出: 汪汪
$dog->eat(); // 输出: 狗在吃食物

$cat = new Cat();
$cat->makeSound(); // 输出: 喵喵
$cat->eat(); // 输出: 猫在吃食物

 

关键点:

  • 接口不能包含属性,只允许定义常量和方法。
  • 接口中的方法必须是公共的,且没有方法体(即方法定义时不提供实现)。
  • 一个类可以实现多个接口,通过逗号分隔接口名称。
  • 接口不能被实例化,只能通过实现接口的类来创建对象。

接口提供了一种方式来定义不同类间的共同行为,从而支持多态和灵活的代码结构。

 再来看下面这段代码

复制代码
<?php

interface Animals {
    const CHANGLIANG = "Fox";
    public function eat();
    public function sleep($hours);
    public static function jump();
}

class Cat implements Animals {
    public function eat() {
        echo "Cat 在吃饭.";
    }

    public function sleep($hours) {
        echo "Cat 要睡 $hours 小时.";
    }

    public static function jump() {
        echo '跳跳跳';
    }
}

$cat = new Cat();
$cat->eat(); // 输出: Cat 在吃饭.
$cat->sleep(18); // 输出: Cat 要睡 18 小时.
echo Cat::CHANGLIANG; // 输出: Fox
echo Cat::jump(); // 输出: 跳跳跳

?>
复制代码

由此可见,接口中可以声明常量,并且在实现接口后可以直接调用接口中定义的常量。

一个类还可以实现多个接口,如下:

复制代码
interface Movable {
    public function move();
}

interface Eatable {
    public function eat();
}

class Robot implements Movable, Eatable {
    public function move() {
        echo "机器人在移动";
    }

    public function eat() {
        echo "机器人在充电";
    }
}
$robot=new Robot;
$robot->move();
$robot->eat();
复制代码

回显如下:

[Running] D:\ceshi.test\6.php"
机器人在移动机器人在充电
 

抽象类和抽象方法用于创建不能被实例化的类,并强制子类实现特定的方法。以下是它们的基本用法:

抽象类

抽象类不能被直接实例化,只能被继承。它可以包含抽象方法和普通方法。子类继承抽象类后,必须实现抽象类中的所有抽象方法

抽象方法

抽象方法没有实现,它仅定义了方法的声明,不需要方法体。可以使用prorected ,但不能使用privare

示例代码

<?php

// 定义抽象类
abstract class Animal {
    // 抽象方法(没有实现)
    abstract public function makeSound();
    
    // 抽象方法(没有实现)
    abstract protected function sleep($time);

    // 普通方法(有实现)
    public function eat($food) {
        echo "正在吃: " . $food . "<br>";
    }
}

// 子类继承抽象类并实现抽象方法
class Dog extends Animal {
    public function makeSound() {
        echo "汪汪汪<br>";
    }

    // 实现抽象方法
    protected function sleep($time) {
        echo "睡觉时间: " . $time . "小时<br>";
    }

    // 子类可以通过公共方法间接调用受保护的抽象方法
    public function sleepFor($time) {
        $this->sleep($time); // 调用子类实现的受保护方法
    }
}

// 创建子类实例
$dog = new Dog();
$dog->makeSound(); // 输出: 汪汪汪
$dog->eat("骨头"); // 输出: 正在吃: 骨头
$dog->sleepFor(8); // 输出: 睡觉时间: 8小时

?>

代码解释

  1. 抽象类 Animal:

    • abstract public function makeSound(); 仍然是一个抽象方法,用于定义子类必须实现的功能。
    • abstract protected function sleep($time); 被定义为抽象方法,子类必须实现它,并且是受保护的(protected),意味着只能在类内或子类中访问。
    • public function eat($food); 继续作为一个具体的公共方法,用于处理食物。
  2. 子类 Dog:

    • 实现了 makeSound() 方法。
    • 实现了 sleep($time) 抽象方法,并输出睡觉时间。
    • 新增了一个公共方法 sleepFor($time),它调用 sleep($time),以便从类外部访问 sleep 的功能。
  3. 实例化 Dog 类:

    • 调用 makeSound() 输出 "汪汪汪"。
    • 调用 eat("骨头") 输出 "正在吃: 骨头"。
    • 调用 sleepFor(8) 通过 Dog 类的方法调用实现的 sleep(8),输出 "睡觉时间: 8小时"。

关键点

  • 抽象方法 sleep($time) 现在是 protected,强制子类提供具体实现。
  • sleepFor($time) 作为公共方法提供了一种方式来调用 protected 抽象方法。
 
抽象类和接口的区别

      1.抽象类可以包含非抽象方法的实现,而接口只能包含方法的声明,没有方法的实现。
      2.类只能继承一个抽象类,但可以实现多个接口。
      3.抽象类可以有构造函数,而接口不能有构造函数。
      4.抽象类中的方法可以有public、protected和private访问修饰符,而接口中的方法只能是public。
      5.子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
      6.子类实现接口时,必须实现接口中的所有方法。

 
posted on   wilson'blog  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示