PHP: пример реального мира ООП - PullRequest
45 голосов
/ 28 августа 2009

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

Все примеры типа Pet, Car, Human мне больше не помогают. Мне нужны примеры РЕАЛЬНОЙ ЖИЗНИ, такие как регистрация, страницы профиля пользователя и т. Д.

Пример:

$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 (регистрация, вход в систему, учетная запись пользователя и т. Д.)?

Ответы [ 7 ]

80 голосов
/ 28 августа 2009

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

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

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

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

Хорошим реальным примером этого может быть что-то вроде итератора каталога. Где этот каталог? Может быть, это локальная папка, может быть, это удаленно, как 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
    }
}

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

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

Хорошо, давайте сделаем что-нибудь с этими данными - напечатать это на экране? Конечно. Но как? 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 не заботятся о том, как они отображаются.

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

9 голосов
/ 03 февраля 2011

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

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

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

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

Реальный мини-пример ООП, представленный ниже:

БАЗА ДАННЫХ КЛАССАКЛАССНЫЕ СЕССИИКЛАССНЫЕ ВЕБФОРМЫКласс электронная почта

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

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

Удачи!

2 голосов
/ 11 декабря 2013

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Принцип единой ответственности
  • Открытый Закрытый Принцип
  • Принцип замещения Лискова
  • Принцип сегрегации интерфейса
  • Принцип обращения зависимостей
1 голос
/ 31 июля 2013

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

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

1 голос
/ 28 августа 2009

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

PHP ООП довольно забавный ... как-то смешно, потому что он поддерживается, но PHP не такой язык ООП, как java или c #.

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

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

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

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

, а затем

$user->name;

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

1 голос
/ 28 августа 2009

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

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

0 голосов
/ 07 октября 2015

Предлагаю также посмотреть мою обертку 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 код, как в этой библиотеке. Но с ООП вы получаете намного больше , и вы также можете проверить Функциональное программирование против вопроса ООП , чтобы узнать больше подробностей о его плюсах и минусах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...