抽象类方法声明

时间:2016-10-02 05:21:13

标签: php oop

我刚刚编写了这样的代码:

<?php
class test
{
// Force Extending class to define this method
abstract protected function getValue();
abstract protected function prefixValue($prefix);

// Common method
public function printOut() {
    print $this->getValue() . "\n";
}
}
class testabs extends test{

public function getValue()
{

}
public function prefixValue($f)
{

}
}
$obj = new testabs();
?>

当我运行此代码时,我收到以下错误:

  

致命错误:类测试包含2个抽象方法,因此必须在C:\ wamp64 \ www \ study中声明为abstract 或实现其余方法(test :: getValue,test :: prefixValue)第12行的\ abstract.php

我理解这个错误的第一部分。我将类测试更改为抽象,错误消失,但or部分我无法理解。

4 个答案:

答案 0 :(得分:8)

如果您要添加抽象方法,那么您还需要创建类abstract。这样,该类无法实例化 - 只有非抽象子类才可以。

visibility(参见第二小节Method Visiblilty)在子类中并不相同。根据您是否希望通过子类之外的代码调用方法,您可以在类test public中创建(抽象)方法,或者也可以创建子类方法{{ 1}}。

请注意Class Abstraction page中的第二段,其中解释了这一点:

  

当从抽象类继承时,父类的声明中标记为abstract的所有方法都必须由子类定义;此外,必须使用相同(或限制较少)的可见性来定义这些方法。例如,如果抽象方法被定义为protected,则必须将函数实现定义为protected或public,而不是private

protected

答案 1 :(得分:3)

抽象类界面之间的主要技术差异是:

  • 抽象类可以有常量,成员,方法存根(没有主体的方法)和定义的方法,而接口只能有常量和方法存根。
  • 可以使用任何可见性定义抽象类的方法和成员,而接口的所有方法都必须定义为public(默认情况下将它们定义为public)。
  • 继承抽象类时,具体子类必须定义抽象方法,而抽象类可以扩展另一个抽象类,而不必定义父类中的抽象方法。
  • 同样,扩展另一个接口的接口不负责从父接口实现方法。这是因为接口无法定义任何实现。
  • 子类只能扩展单个类(抽象或具体),而接口可以扩展,或者类可以实现多个其他接口。
  • 子类可以定义具有相同或更少限制性可见性的抽象方法,而实现接口的类必须定义具有完全相同可见性的方法(公共)。

答案 2 :(得分:2)

您的类具有抽象函数但未声明为抽象,因此您有两个选择。将类声明为abstract或提供抽象函数的实现。

第一个选项(您尝试过)允许该类存在并由实现该函数的具体子类使用。第二个选项意味着该类是完全定义的,可以按原样使用。

答案 3 :(得分:0)

当您的class具有abstract方法时,必须将其声明为abstract。 所以以下是正确的:

<?php
abstract class test
{
  // Force Extending class to define this method
  abstract protected function getValue();
  abstract protected function prefixValue($prefix);

  // Common method
  public function printOut() {
    print $this->getValue() . "\n";
  }
}