21xrx.com
2024-11-05 19:29:09 Tuesday
登录
文章检索 我的文章 写文章
PHP OOP - 抽象类
2021-07-22 19:30:59 深夜i     --     --
P H P O P -


PHP - 什么是抽象类和方法?

抽象类和方法是父类有一个命名方法, 但 需要其子类来实现。

一个抽象类至少包含一个抽象方法。 一个 抽象方法是一种声明的方法,但在代码中未实现。

抽象类或方法是用abstract关键词定义的 :

<?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>

从抽象类继承时,必须是子类方法 用相同的名称定义,以及相同或更少的受限制修改器。 因此,如果抽象方法被定义为受保护,则必须使用子类方法 被定义为保护或公共,但不私密。 此外,类型和数量 所需的参数必须是相同的。 但是,子类可能有可选的 。

因此,当子类从抽象类继承时,我们有以下规则:

  • 必须使用相同的名称定义子类方法,并重新配置父抽象方法
  • 必须使用相同或更少限制的子类方法定义 访问修饰符
  • 所需参数的数量必须是相同的。 但是,子类可能有可选参数

让我们来看看一个例子:

<?php
// Parent class
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// Child classes
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!";
  }
}

// Create objects from the child classes
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>

示例说明

奥迪,沃尔沃和雪铁龙类从car类继承。 这意味着 奥迪,沃尔沃和雪铁龙类可以使用公共name属性以及公共__construct()方法。

但是,intro()是一种抽象方法,应该在所有子类中定义,它们应该返回一个字符串。



PHP - 更多抽象类示例

让我们来看看抽象方法具有参数的另一个例子:

<?php
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  public function prefixName($name) {
    if ($name == "John Doe") {
      $prefix = "Mr.";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs.";
    } else {
      $prefix = "";
    }
    return "{$prefix} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>

让我们看一下抽象方法具有争论的另一个例子 子类有两个未在父级定义的选项参数 摘要方法:

<?php
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  // The child class may define optional arguments that are not in the parent's abstract method
  public function prefixName($name, $separator = ".", $greet = "Dear") {
    if ($name == "John Doe") {
      $prefix = "Mr";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$greet} {$prefix}{$separator} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>

 

 

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复