PHP: пример ООП реального мира

Я пытаюсь изучить ООП. Так называемые "реальные" примеры в книгах, которые я читаю, не помогают.

Все примеры вроде Pet, Car, Human больше не помогают мне. Мне нужны примеры REAL LIFE, такие как регистрация, страницы профиля пользователя и т.д.

Пример:

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

Я также видел:

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

где:

private $user = array();

Сохраняет всю информацию в массиве.

И внутри этого же класса лежит

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

Есть ли примеры реального мира, реализующие ООП во многих разных php-приложениях (регистрация, вход в систему, учетная запись пользователя и т.д.)?

Ответы

Ответ 1

ООП - это не только то, как выглядит и работает один класс. Это также о том, как работают экземпляры одного или нескольких классов.

Вот почему вы видите так много примеров, основанных на "Cars" и "People", потому что на самом деле они действительно хорошо иллюстрируют этот принцип.

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

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

Хорошим примером для реального мира было бы что-то вроде итератора каталогов. Где находится этот каталог? Возможно, это локальная папка, возможно, она удалена, как FTP-сервер. Кто знает!

Вот базовое дерево классов, которое демонстрирует инкапсуляцию:

<?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
    }
}

Каждый класс/объект отвечает за собственный метод извлечения списка каталогов. Данные (переменные) связаны с логикой (функции класса i.e, методы), которые используют данные.

Но история не закончилась - вспомните, как я сказал, что ООП - это то, как экземпляры классов работают вместе, а не какой-либо один класс или объект?

Хорошо, давайте сделаем что-нибудь с этими данными - распечатайте его на экране? Конечно. Но как? HTML? Простой текст? RSS? Позвольте адресовать это.

<?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>";
    }
}

Хорошо, теперь у нас есть несколько деревьев классов для перемещения и отображения списков каталогов. Как мы их используем?

// 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();

Теперь я знаю, о чем вы думаете: "Но Питер, мне не нужны эти большие деревья классов, чтобы это сделать!" но если вы думаете, что тогда вам не хватает смысла, похоже, я подозреваю, что вы были с примерами "Автомобиль" и "Люди". Не сосредотачивайтесь на мелочах примера - вместо этого попытайтесь понять, что происходит здесь.

Мы создали два дерева классов, в которых один (*DirectoryRenderer) использует другой (*DirectoryIterator) ожидаемым образом - это часто называют контрактом. Экземпляр *DirectoryRenderer не заботится о том, какой тип экземпляра *DirectoryIterator он получает, а также экземпляры *DirectoryIterator заботятся о том, как они отображаются.

Почему? Потому что мы разработали их таким образом. Они просто подключаются друг к другу и работают. Это ООП в действии.

Ответ 2

Приобретите книгу, например "Быстрые приложения PHP и Mysql для чайников".

Его старый я знаю [2005], но он показывает концепции пользовательских логинов, форума, тележек для покупок и т.д. как в процедурных, так и в объектно-ориентированных системах с помощью Mysqli.

Это помогло мне изучить объектно-ориентированный PHP, я много изучил его. Хорошо стоит денег.

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

Настоящий мировой мини-пример материала ООП ниже:

БАЗА ДАННЫХ КЛАССА
КЛАССНЫЕ СЕССИИ
КЛАССОВЫЕ ВЕБФОРМЫ
КЛАСС EMAIL

СЧЕТА КЛАССА (примеры функций ниже)
ФУНКЦИЯ SELECTACCOUNT
ФУНКЦИЯ CHECKPASSWORD
ФУНКЦИЯ CHECKUSERNAME
ФУНКЦИЯ CREATEACCOUNT

Надеюсь, вы останетесь в этом, PHP 6 будет реконструирован, чтобы поддерживать ООП больше, чем когда-либо.

Удачи!

Ответ 3

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

Тем не менее, я думаю, что это не так легко учиться из огромного фрагмента производственного кода, поскольку на самом деле не было ничего научить вас чему-либо. Но если вам нужен объектно-ориентированный PHP-код для реального мира, возможно, Zend Framework (или Symfony, или, возможно, CakePHP).

Ответ 4

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

PHP OOP перестает смеяться... например, ха-ха смешно, потому что он поддерживается, но PHP не является языком OOP, например java или С#.

Короткий пример, чтобы подчеркнуть мое утверждение:

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

но если вы хотите сделать ООП "на лету", вы можете сделать следующее:

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

а затем

$user->name;

но вы можете использовать ООП, как в java или С#, но не в том же объеме - и имейте в виду, что популярные системы, такие как wordpress и drupal, не являются чистыми ООП! но вы также можете делать наследование и другие классы OOP в PHP.

Ответ 5

Я не зашел далеко в PHP OOP, но чем больше я становлюсь, тем легче становится. Примеры объектов просто для вас, чтобы понять, как работает ООП. Я понимаю и был до этого, ООП - это просто свойства и методы (обычные переменные и функции). Я запрограммировал в реальном ООП самостоятельно применение примеров из моих учебников и не обязательно должен был быть в реальном мире. Это точно так же, как и ложка, и вы никогда не поймете ООП и легко забыть. Мой совет научиться понимать. Если вы понимаете, вы можете сделать все и реализовать силу ООП. Я загрузил эту книгу, и я думаю, что вам тоже нужно. Но это похоже на то, что кто-то строит ваши приложения для вас...

Здесь ссылка на книгу Ежедневные приложения PHP и Mysql для чайников

Ответ 6

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

Я не считаю, что вы должны использовать PHP в качестве языка программирования для изучения ООП. Если вы хотите изучить ООП для веб-приложений, вы действительно должны смотреть на С# или Java. После того, как вы изучили ООП, вы можете применить это знание к PHP. Одним из примеров книги, которую я изучал ООП, был Big Java by Cay S. Horstmann

Почему я говорю это??? Поскольку на PHP есть буквально миллионы примеров того, как делать вещи, однако не многие из них - примеры того, как правильно программировать. Кроме того, PHP позволяет вам принимать множество ярлыков, что неприемлемо для подобных Java. Таким образом, если вы программируете PHP с головой Java, то я считаю, что вы будете более сильным программистом. ООП не зависит от языка, это парадигма программирования.

Если вы должны изучить ООП с помощью PHP, я бы рекомендовал вам взглянуть на какой-либо реальный исходный код в публичных хранилищах github. Вы можете искать их в packagist.org. Если они являются достойным публичным репозиторием, они будут содержать файл readme.md, в котором будет показано, как использовать пакеты композиторов. например https://github.com/moltin/laravel-cart является примером пакета корзины покупок, который вы сможете использовать в своем приложении. Обратите внимание, как вам не нужно смотреть исходный код пакета, чтобы понять, что делают пакеты. Пакет написан, и вам все равно, как они работают, но вы используете их, поэтому вам нужно только знать, как их использовать. Это именно то, о чем идет ООП.

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

Однако вы делаете погружение в исходный код как инструмент для понимания того, как работает ООП.

В дополнение к этому и, что еще важнее, для разработки веб-приложений, я бы исследовал шаблон проектирования MVC.

Шаблон проектирования MVC обозначает модель, представление, контроллер. Где в случае веб-приложения The Model отвечает за моделирование базы данных, представление отвечает за отображение содержимого пользователю. Контроллер отвечает за взаимодействие с моделью и обработку пользовательского ввода.

Затем я подумал, что вы должны попытаться установить Laravel Framework или другую "приличную современную структуру" на вашей локальной машине. Почему я говорю современный, потому что для современных фреймворков требуется минимальная PHP-версия 5.3+, которая означает, что PHP на вашем компьютере будет поддерживать реальный ООП, подобный тому, который вы получите от подобных Java.

Есть много учебников, которые покажут вам, как создавать веб-приложения в laravel. Сразу же вы увидите, что при создании контроллера вы расширяете BaseController. Когда вы создаете модель, вы расширяете Eloquent. Это означает, что вы уже будете использовать полиморфизм в своем коде. Вы увидите, что с помощью классов они инкапсулируются, и вы увидите, что каждый класс имеет определенную роль.

Если вы хотите взаимодействовать с базой данных, вы сначала создадите объект new Model в методах контроллера. По мере того как вы начнете больше узнавать, вы начнете изучать, как вводить зависимости в контроллер, а затем изучать, как сбрасывать ваши модели и создавать репозитории и программные интерфейсы.

Достойная книга по изучению Laravel для начинающих была бы https://leanpub.com/codebright от Dale Rees. Я встретил Дейла на встрече в Laravel около 2 недель назад.

Кроме того, по мере того, как вы становитесь более опытными веб-приложениями, вы начнете изучать, как применять следующие принципы к вашему программированию:

  • Принцип единой ответственности
  • Открытый закрытый принцип
  • Принцип замены Лискова
  • Принцип взаимодействия segragation
  • Принцип инверсии зависимостей

Ответ 7

Я также предлагаю посмотреть мою обертку Arrayzy. Это родная библиотека PHP-массивов с простой библиотекой манипуляций по ООП.

Итак, если вы работаете с собственными функциями массива PHP, вы можете сделать то же самое в ООП, и Arrayzy поможет вам в этом, например:

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

и

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

В обоих случаях массив результатов будет:

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

Проверьте, как этот метод mergeWith (или другой) работает под капотом.

Я думаю, что это хороший пример, который показывает, что почти все функциональный код можно заменить кодом OOP, как в этой библиотеке. Но с ООП вы получаете гораздо больше, и вы также можете проверить вопрос о функциональном программировании против ООП, чтобы узнать более подробную информацию о том, что такое минусы и опоры.