Php/php oop classes abstract

来自菜鸟教程
跳转至:导航、​搜索

PHP OOP-抽象类

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

抽象类和方法是父类具有命名方法但需要其子类来填写任务的时间。

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

抽象类或方法是使用 abstract 关键词:

句法

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

从抽象类继承时,子类方法必须使用相同的名称,相同或较少限制的访问修饰符进行定义。因此,如果抽象方法定义为protected,则子类方法必须定义为protected或public,但不能定义为private。另外,必需参数的类型和数量必须相同。但是,子类可能还具有可选参数。

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

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

我们来看一个例子:

    <?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();
?>

示例说明

Audi,Volvo和Citroen类是从Car类继承的。这意味着由于继承,Audi,Volvo和Citroen类可以使用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");
?>

让我们看另一个示例,其中abstract方法有一个参数,而子类有两个可选参数,而这些参数在父类的abstract方法中没有定义:

    <?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");
?>