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