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

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

Вот почему вы видите так много примеров, основанных на «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 } } 

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

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

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

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

Купите книгу, такую ​​как «ежедневные приложения PHP и Mysql для чайников».

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

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

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

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

БАЗА ДАННЫХ КЛАССА
КЛАССНЫЕ СЕССИИ
КЛАССОВЫЕ ВЕБФОРМЫ
КЛАССИЧЕСКАЯ ПОЧТА

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

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

Удачи!

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

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

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

PHP OOP перестает смеяться … например, ха-ха смешно, потому что он поддерживается, но 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, не являются чистыми ООП! но вы также можете делать наследование и другие классы OOP в PHP.

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

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

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

Я не верю, что вы должны использовать PHP в качестве языка программирования для изучения ООП. Если вы хотите изучить ООП для веб-приложений, вы действительно должны смотреть на C # или 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 объект new Model в методах контроллера. По мере того как вы начнете больше узнавать, вы начнете изучать, как вводить зависимости в контроллер, а затем изучать, как сбрасывать ваши модели и создавать репозитории и программы для интерфейсов.

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

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

  • Единый принцип ответственности
  • Открытый закрытый принцип
  • Принцип замены Лискова
  • Принцип Сеграграции Интерфейса
  • Принцип инверсии зависимостей

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