Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 4

Не могу разобраться с ООП

07.05.2014, 22:55. Показов 3227. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане, в общем такая проблема, не могу осилить ооп, прочитал пару книг, просмотрел все курсы специалиста, вроде все понял,а на практике не знаю как использовать, да и пишу не в стиле ооп,а гавнокод получается!(

Посоветуйте пожалуйста какую нибуть книжку по пхп ооп с упражнениями, или может курс, или возможно у кого есть время и желание помочь мне разобраться,в любом случае буду очень благодарен за любой совет или помощь,ибо у меня уже отчаяние, что не могу поднять свой уровень! Заранее спасибо за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2014, 22:55
Ответы с готовыми решениями:

Не могу разобраться с ООП в js
Здравствуйте. Просьба специфическая конечно)) но никак не могу понять и освоить ООП на js... если не считать обращение к дом... оно то...

Не могу разобраться с ООП
Начал изучать ООП в FreePascal.Завис на конструкторах и идентификаторах в наследовании.Помогите! Программа: program project1; uses...

Не могу разобраться с ООП
Помогите разобраться с ошибками. Что не так делаю? public class Points { Points(double initial_x, double initial_y, double...

11
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
08.05.2014, 12:06
Книжек и курсов посоветовать не могу, но могу посоветовать взять какой-нибудь фреймворк (например Yii) и попробовать покодить на нем.

ООП не получится понять по щелчку пальцев. Здесь нужно много практики. Писать, писать и еще раз писать.

Цитата Сообщение от qwer123 Посмотреть сообщение
да и пишу не в стиле ооп
В смысле? Так пишите в стиле ООП) Возьмите за правило писать логику только в классах. Сначала будет получаться говно, потом все лучше и лучше. Я когда немного освоился, начал писать свою CMS. Один раз в тупик зашел, понял ошибки, начал писать второй раз, опять в тупик зашел, и снова начал писать сначала)
0
7 / 8 / 1
Регистрация: 08.08.2012
Сообщений: 63
15.05.2014, 10:52
Почитайте книгу "Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования". Думаю многое прояснится...
0
4 / 4 / 1
Регистрация: 03.12.2013
Сообщений: 57
15.05.2014, 17:44
На теории можно понять не более, чем синтаксис ООП в пхп. Для того, чтобы понять, когда и как нужно его применять нужно много практики и желательно ручками - с нуля. Не соглашусь с тем, что разработка на YII или другом фреймворке поможет в освоении. Для того, чтобы пользоваться фреймворком нужно понимание ООП и MVC, которое само по себе не придёт.
Я бы посоветовал, для начала, написать систему регистрации.
Примерная структура:
есть папка с классами - db_class, user_class и authorize_class.
db_class отвечает за взаимодействие с БД. Размести там возможные функции - select, update, insert, delete и пр. Они принимают в качестве параметра SQL запрос, в случае селекта - возвращают массив, в случае инсерта - id.
Пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class DB {
    public $sql;
    public $result;
 
    public function __construct(/*Тут параметры для подключения к БД по умолчанию*/) {
        //Тут коннект к БД с указанием дефолтных параметров или указанных при создании объекта.
    }
//Выборка данных из БД.
    public function select($col, $table, $where) {
        $this->sql = "SELECT $col FROM $table WHERE $where";
        $resurs= mysql_query($this->sql);
        while ($row = mysql_fetch_assoc($resurs)) {
            array_push($this->result, $row);
        }
        return $this->result;
    }
//Подсчёт столбцов в выборке. 
    public function num_rows($sql = NULL) {
        if ($sql != NULL) {
            $this->sql = $sql;
        }
        return mysql_num_rows(mysql_query($this->sql));
    }
//Далее аналогичным образом методы update() insert() delete() 
}
Таким образом, если тебе нужно в какой то части твоей программы забрать данные из БД ты делаешь следующее:

PHP
1
2
3
4
5
6
7
8
9
10
$db = new DB;
//Создаёшь объект класса DB и в конструкторе автоматически коннектишся к базе данных. Объект не нужно 
//создавать каждый раз. Создал и пользуйся его возможностями.
 
$users = $db->select('email, login_time, cash', 'users', 'cash > 10');
//Делаешь выборку из БД  - возвращается двумерный массив с данными юзеров, у которых на счету больше 10 р.
// Заметь, что свойства $sql и $result остались внутри объекта. Ими можно повторно пользоваться. Например:
$users_count = $db->num_rows();
//Посчитает, сколько строк ты выбрал. Таким образом можно писать механизмы кэширования и повторного 
//использования  кода. Это, конечно, не лучший пример, но всё постепенно...
Теперь по аналогии дополни класс ДБ.
Теперь напиши класс users
Подсказка: теперь тебе не нужно каждый раз писать отдельные запросы и разбирать их. Ты можешь включить класс баз данных в класс юзеров и пользоваться его методами там.

Пример простенького класса users.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class User {
    //propertys...
//Конструктор принимает массив свойств пользователя и создаёт их.
    public function __construct($data) {
        foreach ($data as $key => $value) {
        $this->$key = $value;
    }
    }
//Сохраняем данные юзера.
    public function save($new_user = false) {
        $db = new DB;//создаём объект класса ДБ
    $data = get_object_vars($this);//Преобразуем свойства, которые мы создали в конструкторе в массив для обработки.
//Это простенькая валидация входных данных.
        foreach ($data as $k => $v) {
            
            if       (is_int($v)) {
//Какие то манипуляции с целочисленными данными.
            } elseif (is_string($v)) {
                $data[$k] = '\''.mysql_real_escape_string($data[$k]).'\'';//Валидация строк. Защищаемся от инъекций.
            } elseif (is_array($v)) {
                $data[$k] = '\''.json_encode($data[$k]).'\'';//Какие то данные у тебя могут быть в массиве. Его нужно сереализовать перед занесением в базу.
            }
        }
        unset($data['id']);//ИД в базу заносить не надо. И апдейтить тоже. 
        print_r($data);
        if ($new_user) {//Если действие над новым пользователем- создаём новое поле в БД для него. 
            $this->id = $db->insert($data, '`users`');//Надеюсь, ты уже написал эти методы =)
            return $this->id;//Возвращаем id для дальнейшей работы.
        } else { // Иначе - обновляем данные пользователя.
            $db->update($data, '`users`', '`id` = '.$this->id);
            return true;
        }
    }
}
Вот такой вот класс. Его, конечно, дополнять и дополнять... Но для примера пойдёт.

Вот пример работы с таким классом. Простая регистрация - по сути занесение пользователя в БД.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Не забудь подключить в начале все эти классы, иначе экземпляры не создадутся.
//Получи данные из формы и проведи валидацию. Допустим, ты это сделал.
 
//Получается как то так. Формируем массив.
$data = array();
$data['username'] = $_POST['username'];
$data['email'] = $_POST['email'];
//И любые другие данные, на которые рассчитана БД.
//Создаём объект юзера и передаём ему этот массив.
$user = new User($data); // Данные передались в конструктор и обработались  -создались свойства.
//Нужно сохранить.
$user->save(true); //сохраняем данные методом save говоря, что это новый пользователь, передавай true.
 
//Теперь этот юзер зареган. Можно дальше вывести что то типа: 
echo "Привет, ".$user->username."! Ваш мейл - ".$user->email."! Вы зарегистрированы.";
Далее нужно писать авторизацию. Полностью расписывать не буду, просто дам подсказку.
Создай отдельный класс, в котором будут методы для авторизации и выхода из профиля.
Метод авторизации принимает параметры логина и пароля. Проверяет, есть ли такой пользователь и такой ли у него пароль. Если да - заносит его ID в сессию. Для того, чтобы этого не делать на каждой странице, в главный файл, который ты везде подключаешь, пиши проверку на сессию. Что то типа

PHP
1
2
3
4
5
6
7
8
9
10
11
if (isset($_SESSION['id'])) {
    $data = $db->select("*", "users", "id = ". $_SESSION['id']);//Выбрал из БД пользователя с таким ИД. 
    //А теперь, как в регистрации, создаёшь его объект.
    $user = new User($data[0]); //Кстати, select возвращает всегда двумерный массив. Обрати внимание и модернизируй.
}
//Теперь в любой точке программы доступен объект авторизованного юзера. $user->username и прочее.
//Чтобы изменить, к примеру, email, делаешь следующее:
$user->email = 'new_email@gmail.com';
$user->save(false);
//Фолс передавать не нужно, просто обрати внимание, 
//что юзер не новый и данные его не нужно заново сохранять, а только обновить.
--------------
И в заключении:
Это просто совет для практики, чтобы улучшить понимание ООП и понять, почему это удобно.
Прошу прощения за возможные не точности или опечатки, писал, практически на коленке и вслепую=)
Но уверен, что всё работает.
Конечно, это не лучшая структура для классов, много чего можно сделать продуктивнее, много чего можно (и нужно) добавить. Да и вообще, пхп позволяет делать намного более интересные вещи. не стоит воспринимать это, как какую то хорошую методику или стандарт.. Хотя по похожей системе я когда то делал довольно сложный ресурс с большими нагрузками.
После освоения материала советую приступить к написанию чего то более серьезного. Магазин или форум, к примеру.
Суть в том, что сначала ты поймешь, что это очень удобный подход. Потом ты поймешь, что многое можно сделать удобней. И наконец ты поймешь, что это не лучший подход и ВСЁ можно сделать иначе, ведь уже хватает практического опыта и понимания. Тогда тебе нужно будет изучать, к примеру, модель MVC и HMVC, советую статью на хабре - http://habrahabr.ru/post/150267/
В своё время очень помогла.
А только потом уже можешь преступить к изучению фреймворков - советую YII.
УДАЧИ!
1
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
16.05.2014, 08:56
Цитата Сообщение от Dit81 Посмотреть сообщение
Почитайте книгу "Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования". Думаю многое прояснится...
нужна практика и только практика, а зандстра это уже для тех кто понимает ООП
0
7 / 8 / 1
Регистрация: 08.08.2012
Сообщений: 63
16.05.2014, 09:31
Цитата Сообщение от panicwassano Посмотреть сообщение
Цитата Сообщение от Dit81 Посмотреть сообщение
Почитайте книгу "Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования". Думаю многое прояснится...
нужна практика и только практика, а зандстра это уже для тех кто понимает ООП
Практика без теории это вообще глупое занятие... Нужно основы понимать ООП, что бы что-то делать сложнее 2-3-ех классов

Добавлено через 6 минут
Вот еще книга, отличное введение в ООП и пример разработки реального приложения "календаря событий":
"Джейсон Ленгсторф. PHP и jQuery для профессионалов".
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
17.05.2014, 23:29
Цитата Сообщение от Dit81 Посмотреть сообщение
Практика без теории это вообще глупое занятие...
теория само собой, сложность не в количестве классов, а в том, что вы пишите (принципы SOLID, шаблоны проектирования)
0
17.05.2014, 23:40

Не по теме:

Цитата Сообщение от olijen Посмотреть сообщение
db_class отвечает за взаимодействие с БД
исходя из кода класса, неверно отвечает. Хотя бы то, что $sql и $result вдруг открытые. Забыли про инкапсуляцию? Получается, что разработчик, который не знает структуры, может задать свой запрос не через ваш класс и ваши методы, а тупо через обычное присваивание. А смысл тогда с этого класса, если с тем же успехом это можно сделать "вручную" и никакой разницы? ООП предназначен, в том числе, и для уменьшения вероятности ошибок - у вас этого нет.

0
4 / 4 / 1
Регистрация: 03.12.2013
Сообщений: 57
19.05.2014, 16:07
Согласен с замечанием, но, как я уже говорил, это просто пример для человека, показывающий удобство и наглядность ООП. Странно, что вы только на это обратили внимание, ведь в этом коде можно многое сделать лучше. А в реальном проекте, если у человека есть опыт, он сделает ВСЁ по другому. Говоря о классе БД, как минимум нужно делать обработку вводимых данных, пользоваться плейсхолдерами, делать обработку исключительных ситуаций и прочее-прочее. Это всё понятно, но не всем. Я просто хочу помочь человеку, указывая с чего стоило бы начать, т.к сам когда то пытался понять ООП и не мог понять для чего оно нужно вообще. Понял только со временем, когда начал разрабатывать серьезные проекты. А по поводу того, что $sql и $result публичные: вполне можно предположить ситуации, когда можно их использовать через екземпляр класса для повторного использования кода. Допустим к БД проводится ряд запросов, у которых схожий шаблон, но есть незначительные различия. Или запросы условны и не всегда должны использоваться. В таком случае, можно использовать какой то шаблон для запросов и менять только динамичные части запроса. Если писать простенький сайт, это врядли понадобится. Но я разрабатывал проект, важная часть которого - взаимодействие клиента и сервера посредством технологий comet и мне очень пригодился такой подход.
Так что тут нельзя сказать однозначно, всё зависит от ситуации. Пусть человек сам выбирает, стоит ли эти свойства инкапсулировать, или есть надобность пользоваться ими через объект...
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
19.05.2014, 16:12

Не по теме:

я обратил внимание на многое. Просто лень было писать про все, я и написал "хотя бы то, что ..."



Добавлено через 2 минуты
Цитата Сообщение от olijen Посмотреть сообщение
Допустим к БД проводится ряд запросов, у которых схожий шаблон, но есть незначительные различия
В таких случаях делают отдельный метод, позволяющий задать запрос "вручную", а не открывают свойство. Посмотрите любой фреймворк. Разница огромная - это исключает возможность случайного изменения сформированного текста запроса.
0
4 / 4 / 1
Регистрация: 03.12.2013
Сообщений: 57
19.05.2014, 16:43
Мне кажется, что именно из за разницы в уровне опыта программисты не могут обучать начинающих. Многое кажется очевидно и очень важно, в итоге информация не усваивается. Понимание таких понятий, как инкапсуляция и полиморфизм приходя со временем и только на больших проектах. Человек в принципе не может понять, зачем ему скрывать какие то данные, для чего нужна абстракция и интерфейсы. Да и вообще, почему нужно писать какие о там классы, если можно пользоваться функциями и не парить мозг. В своём примере я показал в чём заключается удобство ООП и то, на сколько понятный получается код как таковой. Сделать обзор на всё, (а из этого "всё" большую часть можно назвать очень важной) просто не имею времени, да и это сделано до меня многими авторами.
0
2 / 2 / 1
Регистрация: 18.10.2013
Сообщений: 9
21.05.2014, 10:49
В приведенном примере вы создаете экземпляр класса DB в классе User.
Вопрос: Зачем?
Когда его можно просто наследовать...
PHP
1
2
3
4
5
6
7
8
class DB{
public function connect_mysql(){...}
}
class User extends DB{
public $status_user;
public function init_user(){
   $this->status_user = (!$this->connect_mysql) : false ? true;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2014, 10:49
Помогаю со студенческими работами здесь

Никак не могу разобраться с ООП
В общем товарищи не могу сделать простого(наверное) Нужно привести в красивый вид, избавится от switch/case есть очень много методов...

Не могу разобраться, в ООП с MS Office (word, excel). Именно для VB
Всем привет) Я ток начал разбираться в Visual Basic. До этого, активно юзал VBA. Создавал, формачи, кнопачки всякие прикольные штуки...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива и сумму элементов массива,...

ООП - не получается разобраться в задании
Добрый день! Не могу понять некоторые моменты в задании по ООП. Вот само задание: Собственно, не понятно то, что выделено...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru