php基础oop(二)多态

  • Post category:other

PHP基础OOP(二)多态

在PHP中,多态是面向对象编程(OOP)的一个重要概念。多态允许不同的对象对同一消息做出不同的响应。在PHP中,多态可以通过继承和接口实现。

继承实现多态

在PHP中,可以通过继承来实现多态。子类可以重写父类的方法,从而实现不同的行为。以下是一个示例:

class Animal {
  public function makeSound() {
    echo "Animal makes a sound";
  }
}

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

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

$animal = new Animal();
$cat = new Cat();
$dog = new Dog();

$animal->makeSound(); // 输出 "Animal makes a sound"
$cat->makeSound(); // 输出 "Meow"
$dog->makeSound(); // 输出 "Woof"

在上述示例中,Animal类是一个基类,Cat和Dog类是Animal类的子类。Cat和Dog类重写了makeSound()方法,从而实现了不同的行为。

接口实现多态

在PHP中,可以通过接口来实现多态。不同的类可以实现同一个接口,并对接口中的方法做出不同的实现。以下是一个示例:

interface Shape {
  public function getArea();
}

class Circle implements Shape {
  private $radius;

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

  public function getArea() {
    return pi() * pow($this->radius, 2);
  }
}

class Rectangle implements Shape {
  private $width;
  private $height;

  public function __construct($width, $height) {
    $this->width = $width;
    $this->height = $height;
  }

  public function getArea() {
    return $this->width * $this->height;
  }
}

$circle = new Circle(5);
$rectangle = new Rectangle(10, 5);

echo $circle->getArea(); // 输出 "78.539816339745"
echo $rectangle->getArea(); // 输出 "50"

在上述示例中,Shape是一个接口,Circle和Rectangle类都实现了Shape接口,并对getArea()方法做出了不同的实现。通过这种方式,我们可以实现多态。

示例1:多态的参数类型

在PHP中,可以使用多态来实现灵活的参数类型。以下是一个示例:

class Animal {
  public function makeSound() {
    echo "Animal makes a sound";
  }
}

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

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

function makeAnimalSound(Animal $animal) {
  $animal->makeSound();
}

$animal = new Animal();
$cat = new Cat();
$dog = new Dog();

makeAnimalSound($animal); // 输出 "Animal makes a sound"
makeAnimalSound($cat); // 输出 "Meow"
makeAnimalSound($dog); // 输出 "Woof"

在上述示例中,makeAnimalSound()函数接受一个Animal类型的参数。由于Cat和Dog类都是Animal类的子类,因此它们也可以作为参数传递给makeAnimalSound()函数。

示例2:多态的返回类型

在PHP中,可以使用多态来实现灵活的返回类型。以下是一个示例:

interface Shape {
  public function getArea();
}

class Circle implements Shape {
  private $radius;

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

  public function getArea() {
    return pi() * pow($this->radius, 2);
  }
}

class Rectangle implements Shape {
  private $width;
  private $height;

  public function __construct($width, $height) {
    $this->width = $width;
    $this->height = $height;
  }

  public function getArea() {
    return $this->width * $this->height;
  }
}

function getShapeArea(Shape $shape) {
  return $shape->getArea();
}

$circle = new Circle(5);
$rectangle = new Rectangle(10, 5);

echo getShapeArea($circle); // 输出 "78.539816339745"
echo getShapeArea($rectangle); // 输出 "50"

在上述示例中,getShapeArea()函数接受一个Shape的参数,并返回一个浮点数。由于Circle和Rectangle类都实现了Shape接口,并对getArea()方法做出了不同的实现,因此它们也可以作为参数传递给getShapeArea()函数。

通过以上示例,您可以了解如何在PHP中使用多态。请注意,在使用多态时,应仔细检查数据类型,并遵循最佳实践。