我刚刚编写了这样的代码:
<?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
部分我无法理解。
答案 0 :(得分:8)
如果您要添加抽象方法,那么您还需要创建类abstract
。这样,该类无法实例化 - 只有非抽象子类才可以。
visibility(参见第二小节Method Visiblilty)在子类中并不相同。根据您是否希望通过子类之外的代码调用方法,您可以在类test
public
中创建(抽象)方法,或者也可以创建子类方法{{ 1}}。
请注意Class Abstraction page中的第二段,其中解释了这一点:
当从抽象类继承时,父类的声明中标记为abstract的所有方法都必须由子类定义;此外,必须使用相同(或限制较少)的可见性来定义这些方法。例如,如果抽象方法被定义为protected,则必须将函数实现定义为protected或public,而不是private
protected
答案 1 :(得分:3)
抽象类与界面之间的主要技术差异是:
答案 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";
}
}