【问题标题】:How to declare Abstract Class?如何声明抽象类?
【发布时间】:2014-02-26 13:54:04
【问题描述】:

我试图让抽象方法对我来说很清楚,所以我编写了这段代码并对其进行了测试。但是当我运行它时出现以下错误:

Fatal error: Class Book contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Book::ClassName) in C:\AppServ\www\index2.php on line 5

那么问题出在哪里,为什么?

<?php
  class Book
{
     abstract public function ClassName();
}

 class firstBook extends Book{
    public function ClassName()
    {
        echo "Called form class firstBook";
    }

}

 class secondBook extends Book{
    public function ClassName() 
    {
        echo "Called from class secondBook";
    }
}
$o = new firstBook();
$o2 = new secondBook();
$o->Classname();
$o2->Classname();
?>

【问题讨论】:

  • 抽象方法只允许在抽象类中。
  • 你必须将类抽象化才能将函数声明为抽象

标签: php abstract-function


【解决方案1】:

类也必须使用abstract关键字

<?php
  abstract  class Book
{
     abstract public function ClassName();
}

 class firstBook extends Book{
    public function ClassName()
    {
        echo "Called form class firstBook";
    }

}

 class secondBook extends Book{
    public function ClassName() 
    {
        echo "Called from class secondBook";
    }
}

【讨论】:

  • hmm ,那么如果我必须从 Book 类中调用变量或函数怎么办?如果它变得抽象,我不能这样做吗?
  • 不,如果你在class Book 中创建一个函数(method),它不会变成抽象的。但是最好在abstract 类中声明您将要使用的所有函数并遵守合同
【解决方案2】:

您不能在具体类中声明abstract 函数。将您的 Book 类更新为抽象类。

abstract class Book
{
     abstract public function ClassName();
}

【讨论】:

    【解决方案3】:

    你的类必须是抽象的。

    改变

    class Book
    

    到

    abstract class Book
    

    另外,你错误地调用了函数。

    替换

    $o->Classname;
    $o2->Classname;
    

    到

    $o->ClassName();
    $o2->ClassName();
    

    把它们放在一起

    <?php
    abstract class Book
    {
        abstract public function ClassName();
    }
    
    class firstBook extends Book{
        public function ClassName()
        {
            echo "Called form class firstBook";
        }
    
    }
    
    class secondBook extends Book{
        public function ClassName()
        {
            echo "Called from class secondBook";
        }
    }
    $o = new firstBook;
    $o2 = new secondBook;
    $o->ClassName();
    $o2->ClassName();
    ?>
    

    OUTPUT :

    Called form class firstBookCalled from class secondBook
    

    【讨论】:

      猜你喜欢
      • 2016-05-10
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2011-01-23
      • 2021-06-10
      • 2016-05-10
      • 2010-10-25
      • 2020-04-12
      相关资源
      最近更新 更多