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