2011-01-13 8 views
5

Próbuję poprawić moją wiedzę o OOP w PHP i badam abstrakcyjne klasy i interfejsy.Real World Przykłady zaawansowanych funkcji OOP dla PHP

Czego nauczyłem

  • Obaj są zajęcia, które nie mogą być instancja siebie, ale może być olny Extended (realizowany w przypadku interfejsów)
  • Klasy abstrakcyjne dostarczenie metod i właściwości dla innych klas które je przedłużają.
  • Jeśli klasa używa metody abstrakcyjnej, wówczas sama klasa musi również być abstrakcyjna.
  • Jeśli w klasie abstrakcyjnej zdefiniowana jest metoda abstrakcyjna, wszystkie klasy potomne muszą zdefiniować szczegóły tej metody. Metody niezdefiniowane jako abstrakcyjne można stosować w taki sam sposób, jak metody normalne.
  • Interfejsy określają, jakie metody musi posiadać klasa, która ją implementuje. Funkcjonalność metod nie jest zdefiniowana w interfejsie, interfejs po prostu oferuje listę metod, które muszą być zawarte w klasie potomnej.
  • Interfejs nie definiuje żadnych właściwości.
  • Klasy mogą realizować dowolną liczbę interfejsów, jak chcą, ale muszą zdefiniować metodę dla każdego z interfejsów realizują one

myślę, że obejmuje podstawy. Dodaj do tego, jeśli uważasz, że jest coś, co przegapiłem.

Chciałbym wiedzieć, czy istnieją rzeczywiste przykłady implementacji tych klas, zwłaszcza klasy interfejsu. Czy ktoś wie o jakichkolwiek aplikacjach open source, które go używają, które mogę przeglądać, aby lepiej je zrozumieć i zobaczyć, gdzie i kiedy są one efektywnie wykorzystywane? Natknąłem się na przykłady książek, które wykorzystują zwierzęta, które nie udowadniają wagi tych klas.

Odpowiedz

1

Nie jest to prawdziwy przykład światowy, ale jeden wzór, w którym zwykle spotykane są interfejsy i klasy abstrakcyjne, to Command Pattern. Zobacz link, na przykład kod.

Ogólnie "programowanie z interfejsem" jest uważane za dobrą praktykę OO, ponieważ oddziela konkretne implementacje i umożliwia łatwiejszą ich zmianę w przypadku innych implementacji, np.zamiast pytać o określonej klasie

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

po prostu zapytać, że stanowi pewien zbiór metod

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

Interfejsy pomagają również teasing oprócz dużych struktur dziedziczenia. Ponieważ PHP obsługuje tylko pojedynczy dziedziczenia, będziesz często zobaczyć hierarchie tak:

BaseClass -> Logger -> Auth -> User 

gdzie każdy z nich zawiera szczegółowe aspekty używane wewnątrz tych klas. Z interfejsem, po prostu zrobić

User implements Loggable, Authenticable 

a następnie uwzględnić specyficzny kod poprzez Patterns strategia lub Skład/agregację, która jest ostatecznie znacznie bardziej linkujących.

Listę zdefiniowanych interfejsów w PHP zobaczyć moją odpowiedź:

2

PHP jest wyposażony w kilka interfejsów predefinded domyślnie: http://www.php.net/manual/en/reserved.interfaces.php

PHP zawiera również standardowe PHP Library (SPL), która definiuje więcej:

Zend Framework to również bardzo dobry przykład, w którym takie koncepcje są używany. http://framework.zend.com/

+0

Ponadto, strona wiki ZF2 w toku: http://framework.zend.com/wiki/display/ZFDEV2 – joksnet

+0

@Gordon: szukaj na przykład tego: http://www.php.net/manual/en /class.splheap.php – vartec

+1

@Gordon, zredagowano odpowiedź – vartec

0

Można powiedzieć, że interfejs to czysto 100% klasa abstrakcyjna, ale abstrakcja nie jest. Ponieważ wiele czasu definiujemy funkcję w klasie abstrakcyjnej. Ale w klasie interfejsu zawsze deklarujemy funkcję.

1

Ostateczne słowo kluczowe zapobiega klasę zostanie przedłużone przez innych klasach, np:

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

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

class Pet extends Brother 
{ 
} 

Klasa Pet wygeneruje błąd stwierdzając: Fatal error: Class Pet may not inherit from final class (Brother)

ta jest także dostępna dla metod, więc jeśli robisz nie chce pozwolić, aby metody były dziedziczone, powodując, że klasa podrzędna ma tę samą metodę działającą jak nadpisanie.

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

Yo wykorzystywane że chcesz jakieś prawdziwe przykłady światowe co interfejsy mogą być wykorzystane do, oraz warstwę abstrakcji bazy danych

Masz 1 klasę bazową, która zapewnia podstawowe metody iteracyjne bazy danych danych, ale użyłoby to klasy podrzędnej dla typu bazy danych, na przykład MySql, MsSql itd., każdy typ bazy danych miałby swoją własną klasę, ale dla klasy bazowej, aby upewnić się, że ma te metody, wszyscy oni zaimplementują to samo berło.

Przykład

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

Więc klasa bazowa wie, że MySQL i MSSQL mają powyższe metody, redukując błędy i są bardziej zorganizowane.

Podczas przekazywania obiektów do klas, które chcesz mieć pewność, że obiekt jest określonego typu, PHP5 pozwala ci określić, jaki typ obiektu powinien zostać przekazany do metod jako parametry.

powiedzmy masz 3 klas

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

można szczegółowo określić w constructuin z DatabaseConnection które wymagają klasę DatabaseCredentials tak:

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

Dobrym sposobem, aby naprawdę zacząć się poprzez czytanie tutaj:


Inną cechą PHP5 możesz patrzeć na to przestrzenie nazw, pozwoli to aby zachować porządek w kodzie, mieć wiele obiektów o tej samej nazwie, sprawniej ładować automatycznie

Mały przykład:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

A może po prostu użyć jak:

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

Przeczytałem, że znak przestrzeni nazw jest \. Jestem trochę zagubiony, czy to jest/lub \? – Aif

+0

Nie mam prawa, tylko pseudo kod – RobertPitt