Подтвердить что ты не робот

В чем преимущество, если я использую абстрактный класс в php?

Возможный дубликат:
интерфейс vs абстрактный класс

В чем преимущество, если я использую  абстрактный класс в php?

Какова цель, если я использую абстрактный  класса или интерфейсов?

Оба просто создают defenition  имена без тела

4b9b3361

Ответ 1

В чем преимущество, если я использую абстрактный класс в 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 не знает, какой тип документа он фактически обрабатывает. Это даже не волнует. Это невежественно. Однако он знает, какие методы могут быть вызваны, поскольку интерфейс между двумя типами Документов одинаковый. Это называется полиморфизмом и может быть так же легко достигнуто при реализации интерфейса документа.

Вторая часть; если у каждого документа есть автор, и этот автор всегда запрашивается, вы можете скопировать метод в PdfDocument, а также в DocxDocument, но вы будете дублировать себя. Например, если вы решите, что вы хотите, чтобы автор писал с капителями, и вы изменили бы возврат $this- > author к ucwords ($ this- > author), вам придется делать это столько раз, ve скопировал этот метод. Используя абстрактный класс, вы можете определить поведение, отметив, что сам класс является неполным. Это очень удобно.

Надеюсь, что это поможет.

Ответ 2

Абстрактные классы помогают вам, когда у вас много классов, которые имеют одинаковые методы.

Пример:

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 не реализует метод abstact foo2.

Пример, где это полезно:

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

class Circle extends Shape {
  //...
}

class Rectangle extends Shape {
  //...
}

//...

Вы хотите, чтобы каждый класс имел возможность display(), но не существует такой вещи, как "Shape".

Ответ 3

Не все методы абстрактного класса должны быть пустыми, могут быть некоторые базовые методы (и свойства) для работы. Например, у вас есть и интернет-магазин, и вы разрабатываете абстрактный класс для импорта продуктов. Класс имеет метод для сохранения продуктов в db, для генерации URL-адреса продукта и абстрактного метода для извлечения продуктов из какого-либо (что поэтому должно быть реализовано в расширенном классе). Интерфейс имеет только пустые методы и никаких свойств (может иметь константы, хотя), поэтому может быть не фактическая логика, просто константы метода, имена методов и их модификаторы доступа.

Ответ 4

Как следует из названия, целью интерфейса является явное объявление интерфейса для данных и методов, предоставляемых классом и экземплярами, без необходимости сразу же закодировать эти методы. Классический пример - геометрические фигуры. Такой интерфейс может определять способ, который создает область такой формы:

interface Shape {
    public function getArea();
}

В этом интерфейсе может быть несколько различных классов, таких как Circle и Square, которые предоставили бы различные реализации для метода getArea(). Затем вы можете реализовать функцию, которая отображает информацию о любой геометрической форме:

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

Вы можете передать любой объект, реализованный с интерфейсом Shape для этой функции, а интерфейс гарантирует, что существует метод getArea().

Конечно, эти понятия могут быть более полезными в языках программирования, которые более строго типизированы, чем PHP.