小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-03-13 / 8 阅读
0
0

php 面向对象 interface接口

在PHP中,面向对象编程(OOP)中的 interface用于定义一个协议或一组规范,任何实现该接口的类都必须遵守这些规范,即实现接口中声明的所有方法。以下是关于PHP接口的关键点:

如果接口中定义了static关键字,那么这个方法在类中也要定义关键字,否则会报错。

定义接口:

// 定义接口
interface MyInterface
{
    const CONSTANT = 'Some value'; // 接口中可以定义常量

    // 接口中的方法默认就是抽象的,不需要使用abstract关键字
    public function methodOne();
  
    public function methodTwo($param1);
}

注意事项与要求:

  1. 方法可见性:接口中的方法默认为public,不允许定义private或protected方法。
  2. 属性:接口不能包含属性(非常量),仅允许定义常量。
  3. 抽象方法:接口中的所有方法都是抽象的,实现接口的类必须提供这些方法的具体实现。
  4. 实现接口:使用 implements关键字让类实现接口:
    class MyClass implements MyInterface
    {
        public function methodOne()
        {
            // 实现MyInterface接口中的methodOne方法
        }
    
        public function methodTwo($param1)
        {
            // 实现MyInterface接口中的methodTwo方法
        }
    }
    
  5. 多继承:由于PHP类不能多继承,但一个类可以实现多个接口以获取不同接口中的方法集:
    interface InterfaceA {}
    interface InterfaceB {}
    
    class MyClass implements InterfaceA, InterfaceB
    {
        // 实现InterfaceA和InterfaceB中所有声明的方法
    }
    
  6. 接口继承:接口可以继承其他接口,从而扩展更多方法:
    interface InterfaceC extends InterfaceA
    {
        public function methodThree();
    }
    

是否有子类:
接口本身不能有子类,因为子类通常指的是类之间的继承关系,而接口与类不同,它是用来规定类应该如何行为的一种契约,而不是类的实际结构。然而,接口之间可以相互继承,形成一种接口层次结构。

总结起来,在PHP中,接口主要用于强制执行类的设计约定,确保遵循特定的API标准,并且可以作为多继承的一种替代方案,让类能够实现多种不同的功能规范

在PHP中,一个类可以同时继承一个父类并实现一个或多个接口。父类(超类、基类)使用接口并不影响子类的行为,子类仍然可以根据需要选择继承父类并实现额外的接口。

例如:

// 定义一个接口
interface AnimalInterface
{
    public function makeSound();
}

// 定义一个父类,它并没有实现AnimalInterface
class Creature
{
    public function move()
    {
        echo "Moving...";
    }
}

// 父类Creature的子类,同时实现AnimalInterface接口
class Dog extends Creature implements AnimalInterface
{
    public function makeSound()
    {
        echo "Woof!";
    }
  
    // 也可以重写父类的方法
    public function move()
    {
        echo "Running with four legs!";
    }
}

$dog = new Dog();
$dog->makeSound(); // 输出 "Woof!"
$dog->move(); // 输出 "Running with four legs!"

在这个例子中,Dog 类既继承了 Creature 类的方法,又实现了 AnimalInterface 接口的要求。因此,即使父类没有直接实现接口,子类依然可以实现接口,并根据需要进行扩展。

在PHP中,父类(如果它是一个普通类)实现了一个或多个接口,并不影响其子类的行为。子类既可以继承父类,也可以实现额外的接口,或者重复实现父类已经实现过的接口。

当父类实现了一个接口时,这意味着它提供了接口中声明的所有方法的实现。子类继承父类后,默认情况下也会继承父类对那些接口方法的实现。不过,子类可以选择覆盖(override)父类继承过来的方法,以提供新的实现。

以下是一个简单的示例:

// 定义一个接口
interface AnimalInterface
{
    public function makeSound();
}

// 定义一个实现了AnimalInterface接口的父类
class Mammal implements AnimalInterface
{
    public function makeSound()
    {
        echo "Generic mammal sound";
    }
}

// 定义一个继承Mammal类的子类
class Cat extends Mammal
{
    // 可以选择覆盖父类实现的接口方法
    public function makeSound()
    {
        echo "Meow!";
    }
}

// 创建Cat对象并调用makeSound方法
$cat = new Cat();
$cat->makeSound(); // 输出 "Meow!"

在这个例子中,尽管父类 Mammal实现了 AnimalInterface接口,子类 Cat依旧可以从 Mammal继承,并且可以选择重写 makeSound方法来提供猫叫声的实现。即使子类不重写此方法,由于继承关系,Cat类也将自动拥有 Mammal类提供的 makeSound方法的实现。


评论