php中的抽象类是什么? 哪里可以使用?
答案 0 :(得分:113)
抽象类是一个包含至少一个抽象方法的类,它是一个没有任何实际代码的方法,只是名称和参数,并且已被标记为“抽象”。
这样做的目的是提供一种模板来继承和强制继承类来实现抽象方法。
抽象类因此是常规类和纯接口之间的东西。接口也是抽象类的一个特例,其中ALL方法都是抽象的。
有关详细参考,请参阅PHP手册的this section。
答案 1 :(得分:96)
抽象类是包含一个或多个抽象方法的类。抽象方法是声明的方法,但不包含任何实现。抽象类可能无法实例化,并且需要子类来提供抽象方法的实现。
<强> 1。无法实例化抽象类:定义为抽象的类可能无法实例化,并且包含至少一个抽象方法的任何类也必须是抽象的。
以下示例:
abstract class AbstractClass
{
abstract protected function getValue();
abstract protected function prefixValue($prefix);
public function printOut() {
echo "Hello how are you?";
}
}
$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass
<强> 2。任何包含至少一个抽象方法的类也必须是抽象的:抽象类可以包含抽象和非抽象方法,但它必须至少包含一个抽象方法。如果一个类至少有一个抽象方法,那么该类必须被声明为abstract。
注意:Traits支持使用抽象方法,以便对参展类别施加要求。
以下示例:
class Non_Abstract_Class
{
abstract protected function getValue();
public function printOut() {
echo "Hello how are you?";
}
}
$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)
第3。抽象方法不能包含正文:定义为抽象的方法只是声明方法的签名 - 它们无法定义实现。但是非抽象方法可以定义实现。
abstract class AbstractClass
{
abstract protected function getValue(){
return "Hello how are you?";
}
public function printOut() {
echo $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body
<强> 4。从抽象类继承时,父类的声明中标记为abstract的所有方法都必须由子定义:如果继承了抽象类,则必须为其中的所有抽象方法提供实现。
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
// Common method
public function printOut() {
print $this->getValue() . "<br/>";
}
}
class ConcreteClass1 extends AbstractClass
{
public function printOut() {
echo "dhairya";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)
<强> 5。相同(或限制较少)的可见性:从抽象类继承时,父类的声明中标记为abstract的所有方法都必须由子类定义;此外,必须使用相同(或限制较少)的可见性来定义这些方法。例如,如果抽象方法被定义为protected,则必须将函数实现定义为protected或public,而不是private。
请注意,抽象方法不应该是私有的。
abstract class AbstractClass
{
abstract public function getValue();
abstract protected function prefixValue($prefix);
public function printOut() {
print $this->getValue();
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)
<强> 6。抽象方法的签名必须匹配:从抽象类继承时,父类的声明中标记为abstract的所有方法都必须由子类定义;方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,而抽象方法的签名没有,则签名中没有冲突。
abstract class AbstractClass
{
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
// Mrs. Pacwoman
<强> 7。抽象类不支持多重继承:抽象类可以扩展另一个抽象类,抽象类可以提供接口的实现。但它不支持多重继承。
interface MyInterface{
public function foo();
public function bar();
}
abstract class MyAbstract1{
abstract public function baz();
}
abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
public function foo(){ echo "foo"; }
public function bar(){ echo "bar"; }
public function baz(){ echo "baz"; }
}
class MyClass extends MyAbstract2{
}
$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz
注意:请注意代码中的类的顺序或定位会影响解释器,并可能导致致命错误。 因此,在使用多级抽象时,请注意源代码中类的定位。
以下示例将导致致命错误:类&#39;马&#39;找不到
class cart extends horse {
public function get_breed() { return "Wood"; }
}
abstract class horse extends animal {
public function get_breed() { return "Jersey"; }
}
abstract class animal {
public abstract function get_breed();
}
$cart = new cart();
print($cart->get_breed());
答案 2 :(得分:16)
抽象类是一个类 仅由部分实施 程序员。它可能包含一个或多个 抽象方法。一种抽象的方法 只是一个函数定义 用来告诉程序员 方法必须在孩子身上实施 类。
有很好的解释 here 。
答案 3 :(得分:10)
抽象类
1.包含抽象方法
2.不能直接初始化
3.无法创建抽象类的对象
4.仅用于继承目的
抽象方法
1.不能包含身体
2.不能定义为私人
3.子类必须定义在抽象类
中声明的方法
示例代码:
abstract class A {
public function test1() {
echo 'Hello World';
}
abstract protected function f1();
abstract public function f2();
protected function test2(){
echo 'Hello World test';
}
}
class B extends A {
public $a = 'India';
public function f1() {
echo "F1 Method Call";
}
public function f2() {
echo "F2 Method Call";
}
}
$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";
<强>输出:强>
Hello World
India
Hello World test
F1 Method Call
F2 Method Call
答案 4 :(得分:6)
答案 5 :(得分:0)
Abstract类是那些无法直接初始化的类。换句话说,我们可以说抽象类是那些不能直接创建对象的类。在PHP中,抽象类使用关键字 abstract 。
来定义同样要成为一个类抽象,一个类的一个方法必须是抽象的。
有关抽象类的详细信息,请参阅Abstract Class in PHP上的博客。
答案 6 :(得分:0)
抽象类就像普通类一样,它包含变量,包含受保护的变量函数,包含构造函数,只有一点不同,它包含抽象方法。
抽象方法意味着没有定义的空方法,因此抽象类中只有一个区别,我们不能创建抽象类的对象
摘要必须包含抽象方法,并且这些方法必须在其继承类中定义。