【问题标题】:what is use of public function with body in abstract class of php?在 php 的抽象类中使用带有 body 的公共函数有什么用?
【发布时间】:2017-08-20 12:21:03
【问题描述】:

我创建了一个抽象类并声明了两个公共函数和一个抽象函数。 之后,我在抽象类中为公共函数创建了主体,但是当我将此类扩展到另一个类时,方法主体没有调用,那么我想知道公共方法与主体类的用途。

<?php
         //declare abstract class
        abstract class Test {

    // declare method 1 with body
             public function method1()
             {
                 echo "hello"; //what is use of this code here
             }

             public function method2()
             {
                 $this->method3();
             }

            abstract public function method3();
         }

         //extended abstract class to another class
         class AnotherTest extends Test{

             public function method1(){
                 echo "5+9"/2;
             }

            public function method3(){
                 echo 2+9;
             }

             public function method2()
             {
                 echo "just for testing";
             }
         }

         $obj = new AnotherTest();

         $obj->method1(); 
         echo nl2br("\n");
         $obj->method3(9,10);
          echo nl2br("\n");
         $obj->method2();
        ?>

【问题讨论】:

  • 好吧,如果你不重写它们,它会调用你在Test.. 中声明的方法。但你应该多阅读一些关于 OO 的内容,以完全理解它为什么以及如何工作。

标签: php methods abstract-class abstract


【解决方案1】:

为基类的方法编写方法体可以在不覆盖该方法的任何子类上为该方法提供“默认”行为。

对于基类的任何(非finalpublicprotected 方法,您可以执行以下操作之一:

  • 通过不在子类中定义具有相同名称的方法来接受默认行为而不进行修改
  • 通过定义一个同名的新方法来覆盖并包装该行为,该方法在子类中调用 parent::methodName()
  • 通过定义一个同名的新方法来覆盖和替换该行为,该方法不在子类中调用parent::methodName()

这样编写代码的主要好处是它利用Polymorphism 将通用方法调用分派给特定实现。 定义方法体而不是抽象的只是提供了一种默认行为。由于这是一个非常抽象的面向对象编程概念,因此很难建立一个既简单又不平凡的示例。最好查看流行的代码库,例如 Laravel Framework 或各种 Symfony components 之一,以了解此概念的实际应用。

【讨论】:

    【解决方案2】:

    一般来说,您通常不会override 每个抽象方法。如果你是,那么你做错了什么,需要重构。

    此外,拥有抽象(或任何扩展类)使您能够调用parent::function(),这将使父方法运行,然后您可以执行当前类的附加逻辑。

    最后,这是 Polymorphism 的简单解释的基础,子类可以扩展父类,但通过改变方法的行为方式会有所不同。

    坦率地说,你的“测试”只是不好的例子,因为在那些情况下你是对的,抽象的身体几乎毫无意义。

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 2010-12-13
      • 2015-07-08
      • 1970-01-01
      • 2020-03-16
      • 2015-09-26
      • 2011-03-11
      • 2011-02-21
      相关资源
      最近更新 更多