PHP: Real world OOP example

Próbuję się nauczyć OOP. Tak zwane "prawdziwe" przykłady w książkach, które czytam, nie pomagają.

Wszystkie przykłady jak Pet, Car, Human już mi nie pomagają. Potrzebuję prawdziwych przykładów, takich jak rejestracja, strony profilu użytkownika itp.

Przykład:

$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database

Widziałem też:

$user->user = (array) $_POST;

Gdzie:

private $user = array();

Przechowuje wszystkie informacje w tablicy.

I w obrębie tej samej klasy leży

$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id.

Czy istnieje jakiś prawdziwy świat przykłady implementacji OOP w wielu różnych aplikacjach php (rejestracja, logowanie, konto użytkownika itp.)?

 43
Author: Eric Leschinski, 2009-08-28

7 answers

OOP nie polega tylko na tym, jak pojedyncza Klasa wygląda i działa. Chodzi również o to, jak instancje jednej lub więcej klas współpracują ze sobą.

Dlatego widzisz tak wiele przykładów opartych na" samochodach "i" ludziach", ponieważ faktycznie wykonują one naprawdę dobrą robotę ilustrowania tej zasady.

Moim zdaniem najważniejszymi lekcjami w OOP są enkapsulacja i polimorfizm .

Enkapsulacja: łączenie danych i logika, która działa na te dane razem w zwięzły, logiczny sposób polimorfizm: zdolność jednego obiektu do wyglądu i/lub zachowania się jak drugi.

Dobrym tego przykładem może być iterator katalogów. Gdzie jest ten katalog? Może to folder lokalny, może zdalny jak serwer FTP. Kto wie!

Oto podstawowe drzewo klas, które demonstruje enkapsulację:

<?php

interface DirectoryIteratorInterface
{
    /**
     * @return \Traversable|array
     */
    public function listDirs();
}

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface
{
    protected $root;

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

class LocalDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

class FtpDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

Każda klasa / obiekt odpowiada za własną metodę pobierania katalogu listing. Dane (zmienne) są sprzężone z logiką (funkcje klas tj. metody), która korzysta z danych.

Ale historia nie jest skończona - pamiętasz, jak mówiłem OOP mówi o tym, jak instancje klas współpracują ze sobą, a nie jakakolwiek pojedyncza klasa lub obiekt?

OK, więc zróbmy coś z tymi danymi-wydrukuj je na ekranie? Jasne. Ale jak? HTML? Zwykły tekst? RSS? Zajmijmy się tym.

<?php

interface DirectoryRendererInterface
{
    public function render();
}

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface
{
    protected $iterator;

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

    public function render()
    {
        $dirs = $this->iterator->listDirs();
        foreach ($dirs as $dir) {
            $this->renderDirectory($dir);
        }
    }

    abstract protected function renderDirectory($directory);
}

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "\n";
    }
}

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "<br>";
    }
}

Ok, teraz mamy kilka drzew klas do trawersowania i renderowania list katalogów. Jak używamy ich?

// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer(
  new FtpDirectoryIterator('ftp://example.com/path')
);
$data->render();

// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer(
  new LocalDirectoryIterator('/home/pbailey')
);
$data->render();
Wiem, co sobie myślisz, ale Peter, Nie potrzebuję do tego tych wielkich klasowych drzew!"ale jeśli myślisz, że to przeoczyłeś punkt, podobnie jak podejrzewam, że byłeś z przykładami "samochodu" i "ludzi". Nie skupiaj się na drobiazgach przykładu - zamiast tego staraj się zrozumieć, co się tutaj dzieje.

Stworzyliśmy dwa drzewa klas, w których jedna (*DirectoryRenderer) używa drugiej (*DirectoryIterator) w oczekiwany sposób - jest to często określane jako kontrakt . Instancja *DirectoryRenderer nie obchodzi, jaki typ instancji *DirectoryIterator otrzymuje, ani instancje *DirectoryIterator nie dbają o to, jak są renderowane.

Dlaczego? Bo tak je zaprojektowaliśmy. Po prostu podłączają się do siebie i działają. to jest OOP w akcji .
 77
Author: Peter Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 13:49:13

Kup książkę typu "PHP i Mysql codzienne aplikacje dla manekinów".

Its old I know [2005] but it shows concepts of User Logins, Forum, Shopping Carts, etc in both in Procedural and Object Oriented with Mysqli.

To pomogło mi nauczyć się PHP zorientowanego obiektowo, studiowałem go dużo. Warte swojej ceny.

OOP jest jak grupowanie bitów programu w kawałki wielokrotnego użytku. Nie jest tak trudno być z Tobą szczerym, to po prostu pomysł pakowania swoich funkcji w klasy.

Real world mini przykład OOP stuff poniżej:

BAZA KLAS
SESJE KLASOWE
CLASS WEBFORMS
CLASS EMAIL

Konta klas (przykładowe funkcje poniżej)
FUNCTION SELECTACCOUNT
FUNCTION CHECKPASSWORD
FUNCTION CHECKUSERNAME
FUNCTION CREATEACCOUNT

Mam nadzieję, że będziesz przy tym, PHP 6 zostanie przeprojektowany, aby wspierać OOP bardziej niż kiedykolwiek.

Powodzenia!

 7
Author: RockyBalboa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-03 12:24:41

Jak powiedział astropanic, możesz spojrzeć na kod źródłowy dobrego frameworka PHP lub biblioteki. Polecam Zend Framework , jest bardzo modułowy i ma świetny, profesjonalny design. Powiedziałbym, że jest to bardzo dobry kawałek zorientowanego obiektowo kodu PHP.

Mimo to, myślę, że nie jest tak łatwo nauczyć się od ogromnego kawałka kodu produkcyjnego, ponieważ tak naprawdę nie został stworzony, aby cię niczego nauczyć. Ale jeśli chcesz mieć rzeczywisty obiektowy kod PHP, Zend Framework (lub Symfony, lub być może CakePHP) jest to prawdopodobnie sposób, aby przejść.

 1
Author: mooware,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-27 20:46:26

Radzę ci trzymać się z dala od jakichkolwiek frameworków w tej chwili, jeśli nie znasz OOP, kopanie w zend lub jakikolwiek inny framework byłoby zbyt wiele.

PHP OOP is quit funny... jak ha ha śmieszne, bo jest obsługiwane, ale PHP nie jest językiem OOP jak java czy c#.

Krótki przykład dla podkreślenia mojej wypowiedzi:

// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;

Ale jeśli chcesz zrobić OOP "w locie"możesz zrobić:

$user = (object) array('name' => 'Peter');

A następnie

$user->name;

Ale możesz używać OOP jak ty czy w Javie lub c#, ale nie do tego samego rozszerzenia - i mieć na uwadze, popularne systemy, takie jak WordPress i drupal nie są czyste OOP! ale można zrobić dziedziczenie i inne rzeczy klasy OOP w PHP, jak również.

 1
Author: kristian nissen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-27 21:01:52

Nie posunąłem się daleko w PHP OOP, ale im bardziej się w to angażuję, tym staje się to łatwiejsze. Przykłady obiektów są po prostu tam, aby zrozumieć, jak działa OOP. Rozumiem i byłem przez to wcześniej, OOP jest tylko o właściwości i metody (normalne zmienne i funkcje). Sam programowałem w real OOP, stosując przykłady z moich samouczków i niekoniecznie musiałem być w prawdziwym świecie. To jest tak jak było karmione łyżką i nigdy nie zrozumiesz OOP i byłoby łatwe do zapomnij. Moja rada naucz się rozumieć. Jeśli rozumiesz, możesz zrobić wszystko i zdasz sobie sprawę z mocy OOP. Ściągnąłem tę książkę i myślę, że ty też powinieneś. Ale to tak, jakby ktoś budował Twoje aplikacje dla Ciebie...

Tutaj link do książki PHP i Mysql codzienne aplikacje dla manekinów

 1
Author: blakroku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-24 12:17:38

Chociaż wiem, że na to pytanie już udzielono odpowiedzi, czuję, że mogę tutaj dodać wartość.

Nie wierzę, że powinieneś używać PHP jako języka programowania do nauki OOP. Jeśli chcesz nauczyć się OOP dla aplikacji internetowych, powinieneś naprawdę patrzeć na C # lub Java. Gdy nauczysz się OOP, możesz zastosować tę wiedzę do PHP. Jednym z przykładów książki, której uczyłem się OOP było Big Java by Cay S. Horstmann

Dlaczego to mówię??? Bo na PHP są dosłownie miliony przykładów jak robić rzeczy, jednak niewiele jest przykładów, jak poprawnie programować. Co więcej, PHP pozwala na wykonywanie wielu skrótów, które nie byłyby akceptowalne w przypadku Javy. Jako takie, jeśli programujesz PHP z głową Javy, to wierzę, że będziesz silniejszym programistą. OOP nie jest specyficzny dla języka, jest paradygmatem programowania.

Jeśli musisz nauczyć się OOP używać PHP, to polecam, abyś spojrzał na jakiś prawdziwy kod źródłowy w publicznych repozytoriach Githuba. Możesz je wyszukać w packagist.org. jeśli są porządnym publicznym repozytorium, będą zawierać readme.md plik, który pokaże Ci jak używać pakietów composera. e. g https://github.com/moltin/laravel-cart to przykład pakietu koszyka, który można wykorzystać w swojej aplikacji. Zauważ, że nie musisz patrzeć na kod źródłowy pakietu, aby zrozumieć, co robią Pakiety. Pakiet został napisany i nie zależy ci na tym, jak działają, ale korzystasz z nich więc musisz tylko wiedzieć, jak z nich korzystać. O to właśnie chodzi w OOP.

Nie obchodzi mnie, jak Klasa koszyka dodaje przedmiot do koszyka, chcę tylko utworzyć nowy koszyk i dodać coś do niego.

To, co robisz, to zanurzenie się w kodzie źródłowym jako narzędzie do zrozumienia, jak działa OOP.

Dalej, i chyba ważniejsze, dla tworzenia aplikacji internetowych, chciałbym zbadać wzór projektowy MVC.

Projekt MVC Pattern oznacza Model, widok, kontroler. Gdzie w przypadku aplikacji webowej Model odpowiada za modelowanie bazy danych, widok odpowiada za wyświetlanie treści użytkownikowi. Kontroler jest odpowiedzialny za interakcję z modelem i obsługę danych wejściowych użytkownika.

Myślę, że powinieneś spróbować zainstalować Laravel Framework lub inny "przyzwoity nowoczesny framework" na lokalnym komputerze. Dlaczego mówię nowoczesne, bo nowoczesne frameworki wymagają minumum PHP Wersja 5.3+ co oznacza, że PHP na twoim komputerze będzie obsługiwać prawdziwe OOP podobne do tego, które można uzyskać z takich jak Java.

Istnieje wiele samouczków, które pokażą Ci, jak budować aplikacje internetowe w laravel. Natychmiast zobaczysz, że podczas tworzenia kontrolera rozszerzasz BaseController. Podczas tworzenia modelu, można rozszerzyć elokwentny. Oznacza to, że będziesz już używał polimorfizmu w swoim kodzie. Zobaczysz, że korzystając z klas, są one zamknięte, a zobaczysz, że każda klasa ma określoną rolę.

Gdy chcesz wejść w interakcję z bazą danych, najpierw utworzysz obiekt new Model wewnątrz metod kontrolera. Gdy zaczniesz uczyć się więcej, zaczniesz uczyć się, jak wstrzykiwać zależności do kontrolera, a następnie uczyć się, jak zrzucać modele i tworzyć repozytoria i programy do interfejsów.

Przyzwoita książka o nauce Laravel dla początkujących byłaby https://leanpub.com/codebright By Dale Rees. Poznałem Dale ' a na spotkaniu Laravel jakieś 2 tygodnie temu.

Dalej, w miarę jak będziesz bardziej biegły w budowaniu aplikacji internetowych, zaczniesz uczyć się, jak stosować następujące zasady do swojego programowania:

  • Zasada Jednej Odpowiedzialności
  • Zasada Otwartego Zamknięcia
  • Zasada Substytucji Liskowa
  • Zasada Segregacji Interfejsu
  • Inwersja Zależności Zasada
 1
Author: Gravy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-11 08:25:56

Proponuję również zobaczyć mój wrapper Arrayzy . Jest to natywna biblioteka tablic PHP łatwa do manipulacji w sposób OOP.

Więc jeśli pracujesz z natywnymi funkcjami tablicy PHP-możesz zrobić to samo w OOP i arrayzy Ci w tym pomaga, na przykład:

// Functional programming:
$array = ['a', 'b', 'c'];
$resultArray = array_merge($array, ['c', 'd']);

I

// Object-oriented programming:
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']);
$obj->mergeWith(['c', 'd']);
$resultArray = $obj->toArray();

W obu przypadkach tablica wyników będzie:

Array(
    0 => 'a'
    1 => 'b'
    2 => 'c'
    3 => 'c'
    4 => 'd'
)

Sprawdź jak ta metoda (lub inna) działa pod maską.

Myślę, że jest to dobry przykład, który pokazuje że prawie wszystko funkcjonalne kod można zastąpić OOP Kod jak w tej bibliotece. Ale z OOP dostajesz znacznie więcej i możesz również sprawdzić Programowanie funkcyjne vs OOP pytanie, aby dowiedzieć się więcej szczegółów co to jest minusy i rekwizyty tego.

 0
Author: Victor Bocharsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:10