PHP OOP-抽象类
PHP - 什么是抽象类和方法?
抽象类和方法是指父类具有命名方法,但需要其子类来完成任务。
抽象类是包含至少一个抽象方法的类。抽象方法是已声明但未在代码中实现的方法。
抽象类或方法的定义如下: abstract
关键词:
句法
<?php
抽象类 ParentClass {
抽象公共函数someMethod1();
抽象公共函数 someMethod2($name,$color);
抽象公共函数 someMethod3() : string;
}
?>
从抽象类继承时,子类方法必须使用相同的名称以及相同或限制较少的访问修饰符来定义。因此,如果抽象方法定义为受保护的,则子类方法必须定义为受保护的或公共的,但不能定义为私有的。此外,必需参数的类型和数量必须相同。但是,子类还可以有可选参数。
因此,当子类从抽象类继承时,我们有以下规则:
- 子类方法必须用相同的名称定义,并重新声明父类抽象方法
- 子类方法必须使用相同或限制较少的访问修饰符来定义
- 必需参数的数量必须相同。但是,子类可能还具有可选参数
让我们看一个例子:
例子
<?php
// 父类
抽象类汽车{
公共$名称;
公共函数 __construct($name) {
$this->名称 = $名称;
}
抽象公共函数 intro() : 字符串;
}
// 子类
奥迪类扩展了汽车{
公共函数 intro() : 字符串 {
return "选择德国品质!我是$this->name!";
}
}
沃尔沃类扩展了汽车{
公共函数 intro() : 字符串 {
返回“自豪成为瑞典人!我是$this->name!”;
}
}
雪铁龙类延伸汽车{
公共函数 intro() : 字符串 {
return "法式奢华!我是$this->name!";
}
}
// 从子类创建对象
$audi = new audi("奥迪");
回声$audi->intro();
回显<br> “;
$volvo = new volvo("沃尔沃");
回声 $volvo->intro();
回显<br> “;
$citroen = new citroen("雪铁龙");
回声$citroen->intro();
?>
亲自尝试 »
示例解释
Audi、Volvo 和 Citroen 类继承自 Car 类。这意味着 Audi、Volvo 和 Citroen 类由于继承关系可以使用 Car 类中的公共 $name 属性以及公共 __construct() 方法。
但是,intro() 是一个抽象方法,应该在所有子类中定义,并且它们应该返回一个字符串。
PHP - 更多抽象类示例
让我们看另一个抽象方法有一个参数的例子:
例子
<?php
抽象类 ParentClass {
// 带有参数的抽象方法
抽象保护函数前缀名称($name);
}
ChildClass 类扩展了 ParentClass 类 {
公共函数前缀名称($name){
如果 ($name == "John Doe") {
$prefix = "先生";
} elseif ($name == "Jane Doe") {
$prefix = "夫人";
} 别的 {
$前缀 = “”;
}
返回“{$prefix} {$name}”;
}
}
$class = 新的 ChildClass;
echo $class->prefixName("John Doe");
回显<br> “;
echo $class->prefixName("Jane Doe");
?>
亲自尝试 »
我们来看另一个例子,其中抽象方法有一个参数,并且子类有两个可选参数未在父类的抽象方法中定义:
例子
<?php
抽象类 ParentClass {
// 带有参数的抽象方法
抽象保护函数前缀名称($name);
}
ChildClass 类扩展了 ParentClass 类 {
// 子类可以定义父类抽象方法中没有的可选参数
公共函数前缀名称($name,$separator =“。”,$greet =“亲爱的”){
如果 ($name == "John Doe") {
$prefix = "先生";
} elseif ($name == "Jane Doe") {
$prefix = "夫人";
} 别的 {
$前缀 = “”;
}
返回“{$greet} {$prefix}{$separator} {$name}”;
}
}
$class = 新的 ChildClass;
echo $class->prefixName("John Doe");
回显<br> “;
echo $class->prefixName("Jane Doe");
?>
亲自尝试 »