Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sens
IAmBoskiM
post 12.07.2016, 20:55:31
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 11
Dołączył: 8.05.2016

Ostrzeżenie: (0%)
-----


Witam.

Nie rozumiem paru rzeczy w programowaniu obiektowym, mianowicie sensu interfejsów i abstrakcji. Przecież taki interfejs w ogóle jest niepotrzebny i tylko zwiększa (nieznacznie) rozmiar naszego pliku, albowiem on tylko wymusza zdefiniowanie jakiejś metody. Ogólnie tą metodę możemy zdefiniować bez żadnego interfejsu - efekt ten sam.

  1. <?php
  2. //******************** kod 1
  3. interface intf {
  4. public function example();
  5. }
  6. class klasa implements intf {
  7. public function example() {
  8. echo 'Example function';
  9. }
  10. }
  11. //********************
  12. //******************** kod 2
  13. class klasa {
  14. public function example() {
  15. echo 'Example function';
  16. }
  17. }
  18. //********************
  19. // Efekt? Ten sam, a zatem po co te interfejsy??
  20. ?>


Abstrakcji też nie rozumiem. Przecież ów deklaracja jest absolutnie niepotrzebna; można to zrobić w klasie, która coś dziedziczy.

  1. <?php
  2. //*************** kod 1
  3. abstract class abstr {
  4. abstract public function absfunc ();
  5. public function example () {
  6. echo 'example';
  7. }
  8. }
  9. class klasa extends abstr {
  10. public function absfunc () {
  11. echo 'abstr';
  12. }
  13. }
  14. //***************
  15. //*************** kod 2
  16. class notabstr {
  17. public function example () {
  18. echo 'example';
  19. }
  20. }
  21. class klasa extends notabstr {
  22. public function absfunc () {
  23. echo 'abstr';
  24. }
  25. }
  26. //***************
  27. // Efekt? Ten sam...
  28. ?>


Ogólnie nie widzę sensu w użytku tego - jest to używane tylko do debugowania albo przejrzystości czy jak? Bo ogółem nie ma to innego sensu raczej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
viking
post 13.07.2016, 12:17:09
Post #2





Grupa: Zarejestrowani
Postów: 6 366
Pomógł: 1115
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Po pierwsze stosuje się PSR-4 http://www.php-fig.org/psr/psr-4/ i interface, trait oraz wszystkie klasy powinny być definiowane w osobnych plikach.
Po drugie implementacja interface w klasie wymusza własną implementację danej metody czyli w twoim pierwszym przykładzie intf::example(). Strukturyzuje też kod.
Załóżmy gdybyś miał:

UserStorageInterface.php
  1. interface UserStorageInterface {
  2. public function fetchById($id);
  3. public function fetchAll();
  4. }


DbUserStorage.php
  1. class DbUserStorage implements UserStorageInterface {
  2. }


ArrayUserStorage.php
  1. class ArrayUserStorage implements UserStorageInterface {
  2. }


ExternalServiceUserStorage.php - czyli dane pochodzące z obcych serwisów pobierane przez API
  1. class ExternalServiceUserStorage implements UserStorageInterface {
  2. }


W każdej z klas musiałbyś zaimplementować pobieranie danych o użytkownikach. Metoda na zrobienie tego byłaby różna w zależności od klasy (wybranie z bazy, pobranie z tablicy albo z zewnątrz) ale miałbyś pewność że klasy te posiadają daną metodę. I teraz jeszcze ważniejsze:

  1. $dbUserStorage = new DbUserStorage;
  2. var_dump($dbUserStorage instanceof UserStorageInterface);
  3. // bool(true)


Oraz co za tym idzie rzutowanie:

UserRepository.php
  1. class UserRepository {
  2. /**
  3.   * @var UserStorageInterface
  4.   */
  5. private $userStorage;
  6.  
  7. /**
  8.   * UserRepository constructor.
  9.   *
  10.   * @param UserStorageInterface $userStorage
  11.   */
  12. public function __construct(UserStorageInterface $userStorage)
  13. {
  14. $this->userStorage = $userStorage;
  15. }
  16. }


Dzięki temu do klasy UserRepository możesz przekazać dowolny obiekt który implementuje UserStorageInterface.

Jakiś czas temu pisałem też o klasach gdzie masz wytłumaczoną abstrakcję.

Ten post edytował viking 13.07.2016, 12:26:45


--------------------
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2024 - 02:07