class absclass {

abstract public function fuc();

}

报告:

PHP Fatal error: Class absclass

contains 1 abstract method and must

therefore be declared abstract or

implement the remaining methods

(absclass::fuc)

我想知道实现剩余方法意味着什么,如何实现?

它已经在继承但未实现的抽象祖先类中声明。现在您需要实现它,而不是声明。一旦实现了所有抽象(没有实现的声明)方法,类就变为非抽象的,并且可以有实例。

参见PHP手册中有关类抽象的章节:

PHP 5 introduces abstract classes and methods. Classes defined as abstract may not be instantiated, and any class that contains at least one abstract method must also be abstract. Methods defined as abstract simply declare the method's signature - they cannot define the implementation.

这意味着你要么必须

abstract class absclass { // mark the entire class as abstract

abstract public function fuc();

}

class absclass {

public function fuc() { // implement the method body

// which means it won't be abstract anymore

};

}

"任何包含至少一个抽象方法的类也必须是抽象的"是PHP特有的还是OO语言中相当常见的?

例如,在F中也是如此

@卡尔特,你的意思是"还必须明确声明为抽象"?那么C也是一个例子。

我假定剩余的方法实际上是指您试图定义的抽象方法(在本例中是fuc()),因为可能存在的非抽象方法无论如何都是可以的。这可能是一个错误消息,可以使用更好的措辞:在它说"保留"的地方,应该说"抽象"。

修复非常简单(错误消息的那部分很好):您需要更改:

abstract public function fuc();

…正确实施:

public function fuc(){

// Code comes here

}

…或者,根据您的需要,将整个类抽象化:

abstract class absclass {

abstract public function fuc();

}

我同意错误的信息

这怎么可能是答案呢?本例中的"剩余方法"指的是"fuc",正如错误消息所说,因为您已经将其声明为抽象的,但没有将类本身声明为抽象的。错误信息的措辞似乎很完美。

@罗伯特格兰特-如果信息措辞完美,这个问题一开始就不会被问到。

呵呵…错误消息是混乱的,正如上面罗伯特的推理一样(因为在本例中,"剩余方法"指的是"fuc",这就是导致错误的原因。味精。令人困惑……),但他毕竟还是对的:被接受的答案似乎无法回答问题。:)这是"循环误解"的一个很好的例子吗?在这种情况下,伪答案解决的不是伪问题(见这里为什么),而是提问者实际存在的问题,大概是,但表达错误?)

@戈登的回答是正确的。

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

如果扩展抽象类,则必须实现其所有抽象函数,或者使子类成为抽象类。

不能重写常规方法并使其成为抽象方法,但必须(最终)重写所有抽象方法并使其成为非抽象方法。

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 Fatal error: Class BadDog

contains 1 abstract method and must

therefore be declared abstract or

implement the remaining methods

(Dog::bark)

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

name: Fred

gender: female

bowowwaoar

如果您试图直接实例化一只狗或一只passthebuckdog,如下所示:

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

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

…它的炸弹有:

PHP Fatal error: Cannot instantiate

abstract class Dog

或者(如果你的评论是错的)

PHP Fatal error: Cannot instantiate

abstract class 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();

那就行了。

EDOCX1?0?

哦,谢谢你指出这一点。编辑并修复。

抽象关键字用于将类或方法标记为模式。它类似于接口,但可以包含变量和方法的实现。

关于抽象类有很多误解。下面是一个抽象狗类的例子。如果一个开发人员想要为其他开发人员或者自己创建一些基本的dog类来扩展,他就声明这个类是抽象的。您不能直接实例化dog类(没有人可以),但您可以通过自己的类扩展dog。聪明的狗伸出狗等。

Dog类声明为抽象的所有方法必须在扩展Dog的每个类中手动实现。

例如,抽象类dog有一个抽象方法dog::bark()。但所有的狗叫声都不一样。因此,在每个dog子类中,您必须描述狗是如何具体地吠叫的,所以您必须定义例如smartdog::bark()。

你被这个错误信息稍微误导了。在这种情况下,由于fuc是在这个类中定义的,所以在这个类中实现它是没有意义的。错误试图告诉您的是,非抽象类不能有抽象方法。一旦将抽象方法放入类的定义中,还必须将类本身标记为抽象。

这意味着抽象类的主体至少有一个抽象方法。所以类要么实现方法(非抽象的),要么声明为抽象的。

我想在非抽象类(普通类?)中使用抽象方法。发现我可以用get_parent_class()将方法的内容包装在"if"语句中,如下所示:

if (get_parent_class($this) !== false) {

或者,在实际操作中(在命令行php-f"abstractu methodu normalu classu test.php"上的文件中测试):

class dad {

function dad() {

if (get_parent_class($this) !== false) {

// implements some logic

echo"I'm" , get_class($this) ,"

";

} else {

echo"I'm" , get_class($this) ,"

";

}

}

}

class child extends dad {

function child() {

parent::dad();

}

}

$foo = new dad();

$bar = new child();

?>

Output:

I'm dad

I'm child

php get_parent_class()文档

php声明一个抽象类,如何在PHP中的非抽象类中声明抽象方法?相关推荐

  1. TypeScript 中的非基础类型声明

    前言 在使用 TypeScript 进行类型声明时,除了使用到 boolean .number.string.Array 等基础类型,还会使用到 DOM 元素的声明,或者 setInterval 等常 ...

  2. 以一个通俗易懂的方式解释一下写程序为什么要声明接口和类,面向对象的编程思想,字数不多,主要通过代码理解

    首先我通过代码模仿了一下java中System.out.print函数,如何输出一个覆盖了toString()方法的类. 我先来解释一个为什么java程序要写接口interface. 比如我们有一个圆 ...

  3. 是否可以在Gradle中声明一个可用于Java的变量?

    本文翻译自:Is it possible to declare a variable in Gradle usable in Java? Is it possible to declare a var ...

  4. java异常在哪一层捕获_当在一个方法的代码中抛出一个检测异常时,该异常或被方法中的 ( )结构 捕获,或者在方法的 ( ) 中声明_学小易找答案...

    [填空题]当异常已经被定义时,必须通过( ) 语句来处理它. [填空题]Catch 子句包含( )的程序段 [单选题]下列java语言的常用异常类中,属于检测异常的是() [单选题]自定义异常类时,可 ...

  5. php声明一个类的关键字,php中怎么实例化一个类

    php中怎么实例化一个类 发布时间:2021-03-05 10:15:50 来源:亿速云 阅读:87 作者:小新 这篇文章主要介绍php中怎么实例化一个类,文中介绍的非常详细,具有一定的参考价值,感兴 ...

  6. Java中可以声明一个类为Static吗?

    答案可以是Yes或No,取决于这个类的是最外层类还是内部类. 编译器不允许最外层的类声明为Static,但是可以声明内部类为Static. 概念 嵌套类指被定义在另一个类的内部.嵌套类存在的目的应该只 ...

  7. NET面试题:在C#中如何声明一个类不能被继承

    NET面试题:在C#中如何声明一个类不能被继承 这个问题相对比较简单,应聘者对于这类问题应该不会感到什么难度,但读者更应该掌握的是,为什么要把类型申明为不可继承,这样做的原因是什么.   所涉及的知识 ...

  8. 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...

    如何在C语言中定义一个函数?小编很想在你面前流泪最后却还是选择装作打个哈欠 为什么小编怎么定义函数都不正确呢? 总是说小编 表达语法错误在main函数中 小编们可以在头文件与main函数之间定义,并编 ...

  9. 设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法

    设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类.长方形类.正方形类.三角形类来继承图形类,并实现上述两个方法 设计抽象类 就要使用abstract关键字,抽象类中的 ...

最新文章

  1. 编码小记(未整理-持续更新)
  2. 【收集】常用网络上的Webservice地址
  3. NSString的比较专栏
  4. 【2018-2019-1】20165223-20165218 实验二 固件程序设计
  5. 用oracle的sqlload导入文件到数据库
  6. html视频透明背景怎么设置,微信透明背景图怎么设置 微信透明动态背景图设置方法...
  7. 2023年中南大学资源与环境考研考情与难度、参考书及上岸前辈备考经验
  8. Java: null是什么??
  9. 深度定制游戏引擎实现云服务器的非线性增长
  10. 虚拟仿真实训教学管理及资源共享平台虚拟实训开发对接文档
  11. 2021年全球专业油田化学品收入大约34600百万美元,预计2028年达到41640百万美元
  12. linux怎么用命令上传本地文件,Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件...
  13. apt-get 提示 无法解析域名“cn.archive.ubuntu.com” 的解决
  14. 手机python编程软件 turtle,安卓手机python编程软件
  15. idea热部署插件JRebel激活(强烈推荐,试试就离不开了)
  16. 【python】pygame实现植物大战僵尸小游戏(附源码 有注释)
  17. springboot生成PDF文件返回给前台
  18. B - Blurred Pictures 二分+小细节(眼睛大)
  19. 常见的光纤连接器有哪些?光纤连接器的种类科普
  20. x210开发板linux嵌入式,X210开发板刷机方法

热门文章

  1. java键盘有时失效_Java-摆动键盘无响应
  2. 电子邮箱账号怎么申请,怎样申请邮箱账号呢
  3. State 和 Status 傻傻分不清
  4. 《黑客与设计:剖析设计之美的秘密》
  5. Wordpress【ripro美化】moban-child模板子主题原创美化包(适用于各类资源下载站)
  6. OM1、OM2、OM3和OM4光纤区别
  7. 玩吃鸡台式计算机配置,2019年吃鸡电脑配置推荐,玩吃鸡的电脑要什么配置
  8. 前端超链接下载文件和iframe下载文件
  9. 用matlab画烟火_用烟花制作拼贴
  10. 递归算法(兔子产仔问题)