Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блог на ООП, Учебная задача, как подступится 
V
    Опции темы
zero50x
Дата 8.6.2014, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 13.4.2007
Где: Нижний Новгород

Репутация: нет
Всего: 0



Изучаю PHP написал свой блог на обычном PHP сейчас его хочу переписать на ООП исключительно с целью изучения этого самого ООП (в дальнейшем планирую пойти на фреймворки а там знание ООП я так понимаю необходимо). Да я знаю что такие маленькие блоги на ООП не пишут.

В общем смысл ООП понятен - есть классы, внутри них объекты, ещё есть методы которые определяют что может делать класс. Наследование что бы код не плодить, сокрытие реализации тоже вроде понятно...

Как дохожу до дела нифига не понятно что писать.

Функционал блога: разделы (темы), каждая запись может принадлежать только одной теме. На странице темы выводится анонс записи, а если это поле не заполнено - первые 200 символов.
Комментариев нет, тегов нет, регистрации нет, единственный юзер-админ заносится через БД.
В админке функции: добавление темы, записи, их редактирование, удаление.

Не знаю даже с чего начать.
Какие должны быть классы? Класс "записи" и класс "темы" а методы этих классов это как раз добавление, редактирование, удаление? Класс CRUD для работы с БД надо свой писать?

На процедурном php я помню что начал с добавления записи в БД, потом страница авторизации, потом защитил страницу добавления статьи проверкой сессии, потом сделал вывод статей списком, вывод разделов, затем вывод статей по разделам и в конце пагинатор прикрутил.
PM MAIL   Вверх
ksnk
Дата 9.6.2014, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(zero50x @  8.6.2014,  17:05 Найти цитируемый пост)
Да я знаю что такие маленькие блоги на ООП не пишут.

Даже hello world пишут на ооп.  smile 

Сначала нужно понять - зачем оно нужно. Правильно организованная система позволяет выдергивать из себя части и вставлять в себя новые без модификации остального кода.
Части блога 
  •  работа с базой данных. Нужно подумать, в каком месте поменяется код, если сделать базу блога на файлах, например. 
  •  система авторизации. Что нужно поменять, если внезапно появятся пользователи с разным набором прав?
Первый, imho, кандидат на переписывание - система авторизации с правами и группами.

Вообще-то, если есть какие то представления об ООП - понять зачем оно действительно нужно можно на примере серьезных фреймворков. Yii, например. В качестве более практичного, imho, примера - можно смотреть на joomla и разобраться как действуют плагины в ней.
С одной стороны - на собственных шишках учиться проще, быстрее доходит, а с другой - так можно смастерить собственный мирок и жить в нем, не понимая что происходит снаружи. Лучше сначала познакомиться с хорошими приемами программирования, чтобы собственный "мир" не слишком радикально отличался от внешнего  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 9.6.2014, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



zero50x, не совсем верно высказывание
Цитата(zero50x @  8.6.2014,  18:05 Найти цитируемый пост)
 есть классы, внутри них объекты, ещё есть методы

класс - это конструкция вида
Код

// класс className
class className {
    // ...
}

тогда как объект - это инстанс этого класса:
Код

// объект класса className
$o = new className();


Вообще ООП можно легко перевести на реальную жизнь. Например класс - это вообще "человек" в целом, а Иван - это объект класса человек.

Если говорить про наследование - то все люди в среднем умеют говорить. Это может быть абстрактный метод интерфейса. Но у каждого конкретного класса своя реализация: например у подкласса "Русские" язык русский, а у подкласса Французы - французский smile

Если задача именно изучение, я например немного не согласен с ksnk в том, что нужно лезть в возможно еще сложные для понимания фреймворки. Кому-то проще начинать с малого, главное делать это по хорошим урокам или советам, и тогда "собственный мирок" не будет отличаться от того, что происходит снаружи smile

Класс темы наверное не нужен будет. Это все же сущность чисто группирующая. А вот класс поста (записи) будет нужен. Так же можно сделать класс пользователя, если думать на будущее.

Не совсем ясна фраза:
Цитата(zero50x @  8.6.2014,  18:05 Найти цитируемый пост)
Класс CRUD для работы с БД надо свой писать?

CRUD это концепция, но никак не класс. Можно написать свой класс-обертку для работы с хранилищем, а в нем реализовать концепцию CRUD, создав четыре соотв. метода.
PM MAIL WWW ICQ Skype   Вверх
zero50x
Дата 9.6.2014, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 13.4.2007
Где: Нижний Новгород

Репутация: нет
Всего: 0



Спасибо всё понял из фреймворков покопал CodeIgniter в целом понравился, но работать в слепую с фреймворком не зная ООП мне кажется некорректно, надо всё же разобраться что бы иметь представление что происходит-то тут вообще ))
PM MAIL   Вверх
Gold Dragon
Дата 21.6.2014, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



zero50x, самое главное не верить "умным дядькам", а делать самому.. А к тому что не обязательно следовать логике исключительно MVC или чему-то подобному. Пиши то что сам считаешь нужным и удобным..  smile 

А вообще, чтобы начать я начинаю с тетрадки и ручки.. Для начала нужно понять что будет и "сколько и какие классы это будут делать".

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

Цитата(zero50x @  8.6.2014,  18:05 Найти цитируемый пост)
Не знаю даже с чего начать.

если практично подходить к вопросу.. то я начинаю с файла index.php Может это и банально, но он у меня формирует мысли проекта smile

Вот из чего он состоит

1. Так как у меня будет только один вход в систему и через этот файл, то необходимо опредеить "родительский флаг". Можно так
Код

// Установка флага родительского файла
define('_INDEX', 1);

При этом все остальные файлы проекта будут начинаться с
Код

defined('_INDEX') or die('STOP in file ' . __FILE__);

Это для того, чтобы исключить прямой загрузки файлов проекта

2. Иногда важно иногда нет, но всё же
Код

// Устанавливам внутреннюю кодировку символов
mb_internal_encoding("UTF-8");

3. Есть смысл определить константу абсолютного пути сайта. Она нам очень как пригодится и не один раз
Код

// Абсолютный путь до "корня" сайта
define('_PATH_ROOT', __DIR__);

4. Так как у нас будут и другие глобальные и важные переменные, то мы их конечно же поместили в отдельный файл и соответсвенно подключем их
Код

require_once _PATH_ROOT . '/api/defines.php';

Основных констант много, например, пути до основных папок, форматы данных и т.п. и т.д.

Ну и если есть (а это практически всегда бывает), то подключаем файл настроек
Код

// подключение файла конфигурации
require_once (_PATH_ROOT . '/configuration.php');

Некоторые вещи иногда лучше хранить в PHP-файлах и в переменных.. например, настройки для подключения к БД

5. Лично я начал использовать обработку исключений и поэтому далее идёт блок обработки исключений.
Код

try {
    // тут мы продолжим формировать наш сайт
} catch (Exception $e) {
    // А вот тут будем обрабатывать и выводить ошибки
     echo '<i>Ошибка:</i> ' . $e->getMessage() . '<br>';
     echo '<i>Файл:</i> ' . $e->getFile() . '<br>';
     echo '<i>Строка:</i> ' . $e->getLine();
     print_r($e->getTraceAsString());
 }

Хотя обработка исключений вообще спорна.. Она хороша для отладки, а дальше она не нужна.. С другой стороны если есть ошибка, то и так всё будет видно.. ну да ладно..

6. Далее я бы подключил "обёртку для работы с базой данных. Могу посоветовать свою "обёртку" (не в качестве рекламы, а дружбы ради). Основана на MySQLi, использует подготовленные выражения, кеширование запросов.
Код

require_once _PATH_API . '/database.php';

(как видно, я уже беру пути из [4]

7. Современные проекты не обходятся без автозагрузчиков классов, а значит подключаем то, что будет их обрабатывать
Код

require_once(_PATH_API . '/autoloader.php');


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

// Подключение дополнительных функций
require_once(_PATH_API . '/function.php');

9. Ну и далее делаем уже управление всем проектом. Так как у нас только один вход, то URL будет примерно такого вида

Конечно, я делаю адреса с ЧПУ, но на данном этапе это пока рано обсуждать smile 
И соответсвенно нам нужно получить страницу куда идти. Делаем что-то типа такого
Код

// Получаем страницу сайта
$page = Fnc::getParam($_GET, 'page', '', 's');

ну и далее само управление
Код

switch ($page) {
    case 'news': // Новости
        Core::News();
        break;
    case 'article': // Статьи
        Core::Article();
        break;
    default: // Главная страница (по умолчанию)
        Core::Index();
}


А вот теперь можно и считать что нам нужно.
1. Класс для работы с базой данных
2. Класс автозагрузчика классов
3. Класс для общих и частовостребованных функций
4. Класс управления страницами
Соответственно к нему в данном примере:
5. Класс для управления новостями
6. Класс для управления статьями
7. Класс для управления Главной страницей
8. Соответсвенно не помешало бы иметь класс для управления шаблонами. Если проект маленький то можно и один иметь. Если большой или большой функционал, то для каздой "странице" свой (в принципе что-то подобное MVC)
9. Конечно нам понадобятся библиотеки. И опять же, если маленький проект, то можно всё закинуть в function.php.
Но лучше всё же  сделать всё отдельно
- Класс для работы с датами
- Класс для работы с UL
- Класс для работы с языковыми файлами
- Класс для работы с кешем
- Класс для работы с картинками
- Класс для работы с текстом
и т.д. и т.п.
10. Можно ещё расширить класс для обработки исключений..

Вот где-то так для начала  smile  надеюсь чуть помог

Это сообщение отредактировал(а) Gold Dragon - 21.6.2014, 19:59


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 21.6.2014, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  21.6.2014,  19:45 Найти цитируемый пост)
// Установка флага родительского файла
define('_INDEX', 1);

При этом все остальные файлы проекта будут начинаться с

defined('_INDEX') or die('STOP in file ' . __FILE__);
Это для того, чтобы исключить прямой загрузки файлов проекта

А что плохого в "прямой загрузке файлов проекта", если в таком файле есть только описание функций и классов?

Добавлено через 7 минут и 37 секунд
При использовании регистрируемого автолодера, строка с его собственный подключением обязаны быть ЕДИНСТВЕННЫМ на весь проект использованием include'а. Иначе это неправильное использование автолодера  smile 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 22.6.2014, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  21.6.2014,  23:48 Найти цитируемый пост)
А что плохого в "прямой загрузке файлов проекта", если в таком файле есть только описание функций и классов?

Если я правильно понял, то ты говоришь об этом?

Абсолютно ничего плохого!  smile  но абсолютно не удобно..  вот только будет много избыточного кода, нет единой инициализации проекта (сессии, база данных, ядро, логирование....), будет отсутствовать контроль за подключаемыми модулями. Опять же если использовать ЧПУ, то единый вход более динамичен и настраиваемый... Да и я себе трудно представляю как можно это реализовать на достаточно большом проекте, например том же фреймворке  smile 

Это удобно применять на чём-то маленьком.. том же блоге или форуме
Цитата(ksnk @  21.6.2014,  23:48 Найти цитируемый пост)
При использовании регистрируемого автолодера, строка с его собственный подключением обязаны быть ЕДИНСТВЕННЫМ на весь проект использованием include'а. Иначе это неправильное использование автолодера 
Так у меня это именно так и есть   smile

Добавлено через 2 минуты и 41 секунду
кстати, это проблема может быть если используется не единая точка входа  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 22.6.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  22.6.2014,  09:12 Найти цитируемый пост)
Если я правильно понял, то ты говоришь об этом?

Нет, не об этом. Для одной точки входа, index.php выведет что-то осмысленное, а остальные файлы содержать только описания классов.
Если вызвать такой файл - пользователь все равно ничего не увидит, и кроме факта наличия такого файла в системе, никакой дополнительной информации не получит. Так что  "защита" не нужна. А вот с конкретно такой защитой, потенциальный злоумышленник получит еще и абсолютный путь до файла. Обычно, он содержит имя учетной записи хостинга, что, конечно, не особенно секретно  smile 




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1100 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.