如果我在php中使用抽象类有什么好处?

时间:2011-06-16 14:06:15

标签: php oop abstract-class

  

可能重复:
  interface vs abstract class

如果我使用有什么好处  php中的抽象类?

如果我使用摘要是什么目的  类或接口?

两者都只是创造了捍卫  没有身体的名字

4 个答案:

答案 0 :(得分:68)

  

如果我在php中使用抽象类有什么好处?我找不到任何好的东西。我想我可以轻松地完成所有工作而不使用抽象类?

你自然可以。但是,如果有许多对象具有几乎相同的类型,则可能有助于将常用功能提取到“基础”类中,这意味着您不必复制该逻辑。

实际上有两个原因。对我来说,第一个原因是,抽象类的所有后代都具有相同类型,并且两者都遵循完全相同的接口。这意味着例如PDF文档将具有与docx文档相同的接口,并且客户端代码不必关心它正在处理哪个对象。简短的例子(在PHP中)。

<?php
abstract class Document {
    protected $author;

    public function __construct( $author ) {
        $this->author = $author;
    }

    abstract public function render( );

    public function author( ) {
        return $this->author;
    }
}

class PdfDocument extends Document {
    public function render( ) {
        // do something PDF specific here.
    }
}

class DocxDocument extends Document {
    public function render( ) {
        // do something DOCX specific here.
    }
}


class DocumentHandler {
    public function handle( Document $document ) {
        $this->log( 'Author has been read ' . $document->author( ) );
        return $document->render( );
    }
}

首先;请注意,DocumentHandler类不知道它实际处理的是哪种类型的Document。它甚至不关心。它是无知的。但是, 知道可以调用哪些方法,因为两种类型的文档之间的接口是相同的。这称为多态,可以通过Document接口的实现轻松实现。

第二部分是;如果每个文档都有一个作者,并且总是请求该作者,则可以将该方法复制到PdfDocument以及DocxDocument,但是您要复制自己。例如,如果您决定要让作者用大写字母书写,并且您将$ this-&gt;作者的回报更改为ucwords($ this-&gt; author),那么您必须多次执行此操作。你复制了那个方法。使用抽象类,您可以定义行为,同时将类本身标记为不完整。这非常方便。

希望有所帮助。

答案 1 :(得分:10)

当你有许多具有相同方法的类时,抽象类可以帮助你。

示例:

abstract class Foo {
  public function foo1() {
    //Do something
  }

  public abstract class foo2();
}

class Bar extends Foo {
  public class foo2() {
    //Do something
  }
}

class Baz extends Foo {
}

会发生什么:

  • 您无法使用new Foo();Foo是抽象的。
  • 您可以使用Bar.foo1()Baz.foo1(),他们会做同样的事情。
  • 您将遇到错误,因为Baz未实施抽象方法foo2

有用的示例:

abstract class Shape {
  public function display() { /* ... */ }
  //...
}

class Circle extends Shape {
  //...
}

class Rectangle extends Shape {
  //...
}

//...

你希望每个班级能够display(),但没有&#34; Shape&#34;本身。

答案 2 :(得分:2)

并非所有抽象类的方法都必须为空,可能有一些基本的方法(和属性)可以使用。例如 - 您拥有并购买电子商店并开发一个抽象类来导入产品。该类有一个方法,用于将产品保存到db,生成产品的url和从某个地方检索产品的抽象方法(因此必须在扩展类中实现)。 接口只有空白方法而没有属性(虽然可以有常量),所以tere可能不是实际逻辑,只是方法常量,方法名称及其访问修饰符。

答案 3 :(得分:1)

顾名思义,接口的目的是显式声明类和实例提供的数据和方法的接口,而无需立即编写这些方法。典型的例子是几何形状。这样的界面可以定义产生这种形状的区域的方法:

interface Shape {
    public function getArea();
}

可能有许多不同的类实现此接口,如CircleSquare,它们将为方法getArea()提供不同的实现。然后,您可以实现一个显示任何几何形状信息的函数:

function displayInformation(Shape $shape) {
    echo "The area of this shape is: " . $shape->getArea();
}

您可以将实现Shape接口的任何对象传递给此函数,并且接口可以保证getArea()方法存在。

当然,这些概念在编程比PHP更强类型的语言中可能更有用。