2011-01-13 2 views
5

Я пытаюсь улучшить свои знания ООП в PHP и изучать абстрактные классы и интерфейсы.Real World Примеры расширенных возможностей OOP для PHP

То, что я узнал

  • Они оба класса, которые не могут быть воплощенные себя, но Olny может быть расширен (реализован в случае интерфейсов)
  • Абстрактные классы обеспечивают методы и свойства для других классов которые расширяют их.
  • Если класс использует абстрактный метод, то сам класс также должен быть абстрактным.
  • Если абстрактный метод определен в абстрактном классе, все дочерние классы должны определять детали этого метода. Методы, не определенные как абстрактные, могут использоваться так же, как и обычные методы.
  • Интерфейсы определяют, какие методы должен выполнять класс, который его реализует. Функциональность методов не определена в интерфейсе, интерфейс просто предлагает список методов, которые должны быть включены в дочерний класс.
  • Интерфейс не задает никаких свойств.
  • Классы могут реализовать столько интерфейсов, сколько они хотят, но они должны определить метод для каждого из интерфейсов, которые они реализуют

Я думаю, что охватывает основы. Не стесняйтесь добавлять к этому, если вы считаете, что я что-то пропустил.

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

ответ

1

Не настоящий мир как таковой, но один шаблон проектирования, где обычно встречаются интерфейсы и абстрактные классы, является Command Pattern. См. Ссылку, например, код.

В целом, «программирование против интерфейса» считается хорошей практикой OO, поскольку оно отделяет конкретные реализации и позволяет вам более легко изменять их для других реализаций, например.вместо того, чтобы просить для определенного класса

public function fn(ConcreteClass $obj) 
{ 
    $obj->doSomething() 
} 

вы просто спросите, что она предоставляет определенный набор методов

public function fn(MyInterface $obj) 
{ 
    $obj->doSomething() 
} 

Интерфейсы также помогают дразнить друг от друга крупных структур наследования. Поскольку PHP поддерживает только одиночное наследование, вы часто будете видеть иерархий, как это:

BaseClass -> Logger -> Auth -> User 

, где каждый из них содержит специфические аспекты, используемые внутри этих классов. С интерфейсом, вы просто делаете

User implements Loggable, Authenticable 

, а затем включить этот конкретный код с помощью шаблонов стратегии или композиции/Aggregation, которая в конечном счете гораздо более ремонтопригодны.

Список предопределенных интерфейсов в PHP см мой ответ:

2

PHP поставляется с несколькими интерфейсами predefinded по умолчанию: http://www.php.net/manual/en/reserved.interfaces.php

PHP также содержит стандартный PHP библиотеки (SPL), который определяет больше:

Zend Framework также является очень хорошим примером, когда такие понятия используемый. http://framework.zend.com/

+0

Кроме того, ZF2 работает в процессе wiki: http://framework.zend.com/wiki/display/ZFDEV2 – joksnet

+0

@ Gordon: посмотрите пример: http://www.php.net/manual/en /class.splheap.php – vartec

+1

@Gordon, отредактировал ответ – vartec

0

Мы можем сказать, что интерфейс является чисто абстрактным классом на 100%, но абстрактным не является. Потому что много раз мы определяем функцию в абстрактном классе. Но в классе интерфейса мы всегда объявляем функцию.

1

Окончательное ключевое слово препятствует класс расширяется другими классами, например:

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

final class Brother extends Mother /* - This class cannot be extended - */ 
{ 
} 

class Pet extends Brother 
{ 
} 

Класс Pet выдаст сообщение об ошибке с указанием: Fatal error: Class Pet may not inherit from final class (Brother)

Это также доступен для методов, так что если вы не хотят, чтобы методы были наследованы, заставляя дочерний класс иметь тот же самый метод, который выступает в качестве переопределения.

http://php.net/manual/en/language.oop5.final.php

Yo используется, что вы хотели бы некоторые реальные примеры мира, какие интерфейсы могут быть использованы для, а абстракции базы данных

У вас есть 1 базовый класс, который обеспечивает основные методы для перебора базы данных данных, но это будет использовать подкласс для типа базы данных, такой как MySql, MsSql и т. д., каждый тип базы данных будет иметь свой собственный класс, но для базового класса, чтобы убедиться, что он имеет эти методы, все они будут реализовывать одинаковые интерфейс.

Пример

interface IDatabaseLayer 
{ 
    public function connect(); 
    public function query(); 
    public function sanitize(); 
    //... 
} 

Таким образом, базовый класс знает, что MySql и MSSQL имеют указанные выше способы, таким образом, уменьшая количество ошибок и быть более организованным.

При передаче объектов в классы вы хотите быть уверенными, что объект имеет определенный тип, PHP5 позволяет определить, какой тип объекта должен быть передан методам в качестве параметров.

позволяет сказать, что у вас есть 3 класса

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

вы можете конкретно определить в constructuin из DatabaseConnection, что вам требуется в DatabaseCredentials класс следующим образом:

class DatabaseConnection implements Connectable 
{ 
    public function __construct(DatabaseCredentials $ConnectionDetails) 
    { 
     $this->Connect($ConnectionDetails->BuildDSN()); 
    } 
} 

Хороший способ по-настоящему начать, читая здесь:


Еще одна особенность PHP5 вы можете посмотреть на это пространство имен, это позволит вы должны сохранить свой код организованным, иметь несколько объектов с тем же именем, более эффективную загрузку

Маленький пример:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

И вы можете просто использовать как:

use Database; 
$Database = new MySql\Database(); 
+0

Я читал, что символ пространства имен \. Я как бы потерялся, это/или \? – Aif

+0

Нет, ваше право, просто псевдокод – RobertPitt

1

Вы можете следить за "PHP patterns" series Джорджио Сирони в DZone или непосредственно в his blog, на самом деле интересно, если вы заинтересованы шаблоны и ООП.

Также вы можете взглянуть на Best PHP programming book в stackoverflow, если вам нужна хорошая книга PHP.

Смежные вопросы