php 无法实例化抽象类,如何在PHP的非抽象类中声明抽象方法?

抽象类不能直接实例化,但可以包含抽象和非抽象方法。

如果扩展抽象类,则必须实现其所有抽象功能,或者使子类抽象。

您不能覆盖常规方法并将其抽象,但是您必须(最终)覆盖所有抽象方法并使它们抽象。

abstract class Dog {

private $name = null;

private $gender = null;

public function __construct($name, $gender) {

$this->name = $name;

$this->gender = $gender;

}

public function getName() {return $this->name;}

public function setName($name) {$this->name = $name;}

public function getGender() {return $this->gender;}

public function setGender($gender) {$this->gender = $gender;}

abstract public function bark();

}

// non-abstract class inheritting from an abstract class - this one has to implement all inherited abstract methods.

class Daschund extends Dog {

public function bark() {

print "bowowwaoar" . PHP_EOL;

}

}

// this class causes a compilation error, because it fails to implement bark().

class BadDog extends Dog {

// boom! where's bark() ?

}

// this one succeeds in compiling,

// it's passing the buck of implementing it's inheritted abstract methods on to sub classes.

abstract class PassTheBuckDog extends Dog {

// no boom. only non-abstract subclasses have to bark().

}

$dog = new Daschund('Fred', 'male');

$dog->setGender('female');

print "name: " . $dog->getName() . PHP_EOL;

print "gender: ". $dog->getGender() . PHP_EOL;

$dog->bark();

?>

该程序炸弹炸弹:

PHP致命错误:类BadDog   包含1个抽象方法,必须   因此被声明为抽象或   实施其余方法   (狗::树皮)

如果注释掉BadDog类,则输出为:

name: Fred

gender: female

bowowwaoar

如果尝试直接实例化Dog或PassTheBuckDog,如下所示:

$wrong = new Dog('somma','it');

$bad = new PassTheBuckDog('phamous','monster');

..炸弹炸弹具有:

PHP致命错误:无法实例化   抽象类狗

或(如果您注释掉$错误行)

PHP致命错误:无法实例化   抽象类PassTheBuckDog

但是,您可以调用抽象类的静态函数:

abstract class Dog {

..

public static function getBarker($classname, $name, $gender) {

return new $classname($name, $gender);

}

..

}

..

$other_dog = Dog::getBarker('Daschund', 'Wilma', 'female');

$other_dog->bark();

那很好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值