c语言编程笔录

首页 >   > 笔记大全

笔记大全

PHP中的abstract关键字的用法和作用

更新时间:2023-07-16

1. abstract关键字的基本用法

在PHP中,abstract关键字用于指示一个类或者其中的一个方法是抽象的。如果一个类被定义为抽象的,那么它不能被实例化,只能被其他类继承。抽象类中可以定义抽象方法,这些方法没有实现代码,必须在子类中实现。

abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    abstract public function makeSound();
}

class Dog extends Animal {
    public function makeSound() {
        echo "汪汪汪!";
    }
}

$dog = new Dog("小白");
$dog->makeSound(); // output: 汪汪汪!

2. 抽象方法的规定

抽象方法没有具体的实现代码,必须在子类中实现。使用abstract关键字标记抽象方法,不能在普通类中定义抽象方法。一个类如果至少拥有一个抽象方法,那么这个类必须也是抽象类。当子类继承一个抽象类时,必须实现父类中所有的抽象方法,或者把子类也定义为抽象类。

abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    abstract public function makeSound();
}

class Dog extends Animal {
    public function makeSound() {
        echo "汪汪汪!";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "喵喵喵!";
    }
}

$animals = array(new Dog("小白"), new Cat("小黑"));
foreach ($animals as $animal) {
    $animal->makeSound(); // output: 汪汪汪!喵喵喵!
}

3. 抽象类的继承和重载

抽象类可以被继承,子类可以拥有父类的属性和方法,也可以在子类中重载或扩展父类的方法。如果子类不完全实现父类中的抽象方法,那么这个子类也必须是抽象类。

abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    abstract public function makeSound();
}

abstract class Bird extends Animal {
    abstract public function fly();
}

class Dove extends Bird {
    public function makeSound() {
        echo "咕咕咕!";
    }

    public function fly() {
        echo "羽翼翱翔!";
    }
}

$dove = new Dove("小白鸽");
$dove->makeSound(); // output: 咕咕咕!
$dove->fly(); // output: 羽翼翱翔!

4. 抽象类的注意事项

在使用抽象类时,有以下几个注意事项:

  • 抽象类不能被实例化。
  • 抽象类中可以包含普通方法,但是子类不需要实现这些普通方法。
  • 抽象方法不能为空,在子类中必须实现抽象方法。
  • 一个类如果继承了一个抽象类,必须实现抽象类中所有的抽象方法或者把自己也定义为抽象类。
  • 抽象类中定义的属性和方法可以有各种可见性修饰符(public、protected、private),但是抽象方法不能有方法体和方法定义。
总结:abstract关键字在PHP中用于指示一个类或方法是抽象的,抽象类不能被实例化,抽象方法没有具体实现代码,必须在子类中实现。一个类如果至少拥有一个抽象方法,那么这个类必须也是抽象类。抽象类可以被继承,子类可以拥有父类的属性和方法,也可以在子类中重载或扩展父类的方法。在使用抽象类时需要注意抽象方法不能为空,在子类中必须实现抽象方法。