Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
#1

правильно ли я понимаю работу ООП

18.03.2018, 23:23. Просмотров 896. Ответов 15
Метки нет (Все метки)

Начал осваивать ООП , подскажите пожалуйста правильно ли я понимаю работу ООП
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
session_start();
class UserFilter{
    PUBLIC function pattern($pattern,$var) {
        return !empty($var) && preg_match_all($pattern,$var);
    }
    
    PUBLIC function passHash() {
        $salt = ''; $lsalt = 8;
        for($i=0;$i<$lsalt;$i++) {
            $salt.= chr(mt_rand(9,134));
        }
        return $salt;
    }
    
    PUBLIC function Names($var) {
        setlocale(LC_ALL, "ru_RU.UTF-8");
        return !empty($var) && preg_match('/^[A-Za-z0-9а-яА-Я]+$/u', $var);
    }
}
 
class User extends UserFilter{
    PROTECTED $mai,$pass,$pass_c,$name;
    
    PUBLIC function __construct() {
        if(count($_POST)>0)
        {
            foreach($_POST as $name => $value) {
                switch($name) {
                    case "mail":
                    if($this->pattern("/^[a-zA-Z0-9]+[\w\.\_]*@[a-zA-Z]+[\w\.]*\.[a-zA-Z]{2,4}$/", $value))
                    { $this->mai = $value; }
                    else { $error[] = "Некоректный E-Mail \n";}
                    break;
                    case "pass":
                    if($this->pattern("/^[\w]+$/", $value))
                    { $this->pass = $value; }
                    else { $error[] = "Некоректный пароль \n"; }
                    break;
                    case "pass_c";
                     if($this->pattern("/^[\w]+$/", $value))
                    { $this->pass_c = $value; }
                     else { $error[] = "Некоректный пароль \n"; }
                    break;
                    case "name":
                    if($this->Names($value))
                    { $this->name = $value; }
                    else { $error[] = "Некоректное имя \n"; }
                }
            }
            if($this->pass == $this->pass_c) {
                if(!is_array(@$error) && empty(@$error))
                {
                    $this->pass = md5($this->pass.$this->passHash());
                    require 'base.php';
                    $base = new Base();
                    echo $base->insert("INSERT INTO user (login,mail,password) 
                    VALUES (?,?,?)", $this->name,$this->mai, $this->pass);
                } else {
                    foreach($error as $error_list) { throw new Exception($error_list);}
                }
            } else {
                throw new Exception('Пароли не совпадают');
            }
        }
    } // __construct
}
 
 
 
 
 
 
?>
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2018, 23:23
Ответы с готовыми решениями:

Правильно ли понимаю назначение ORM?
В сети есть множество построителей MySQL-запросов. Пример: ...

Как правильно писать на ООП?
Здравствуйте. Стоит задача переписать кое что с процедурного в ООП, но в ООП,...

Правильно ли со стороны ООП составлен сайт?
Всем доброе время суток. Недавно начал учить ООП, хотел бы узнать мнение...

Что здесь не правильно с точки зрения ООП
Делаю себе классы для авторизация через разные соц.сети (в сети есть решения)Но...

Оцените код пожалуйста - правильно ли я понял ООП и MVC?
Здравствуйте! php изучаю уже три месяца, когда есть возможность. С ООП в php...

15
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
19.03.2018, 15:26 #2
Нет.

Добавлено через 42 минуты
Ты просто завернул свой императивный код в класс, объектно-ориентированный он от этого не станет.

Чтобы написать объектно-ориентированный код тебе нужно выкинуть текущий и начать все заново. Причем начать лучше с рисования схемы на бумаге. Представь, какие сущности есть в твоем приложении и как они взаимодействуют. Нарисуй это в виде произвольных кружочков/квадратиков и стрелочек. И когда поймешь, как оно взаимодействует на бумаге - опиши каждый из них в виде класса.
0
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
19.03.2018, 17:50  [ТС] #3
andr-xw, Но по моим схемам оно так и получилось.
Я использую отдельный класс для работы с БД,
Отдельный класс для приема данных.
Отдельный класс которая наследует данные приема данных для фильтрации.
Отдельный класс для работы с файлами.
0
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
19.03.2018, 19:03 #4
Лучший ответ Сообщение было отмечено maxoun как решение

Решение

У тебя классы и их методы делают слишком много. Классы должны быть маленькими, и методы в них тоже, и каждый из них должен делать что-то одно.

На примере логики регистрации:
Допустим, тебе нужна класс, авторизующий пользователя. Назовем его AuthService. Что он должен делать:
1) Проверять, есть ли пользователь
2) Возвращать сущность пользователя
3) Создает сущность нового пользователя
Что нужно для всех трех методов? Коннекшн в БД. Без него они не могут работать. Его мы передаем в конструктор и записываем в свойство класса AuthService, назовем его connection. Это называется внедрением зависимостей (AuthService зависит от DBConnection, то есть обращается внутри себя к нему).

Теперь разберем, что нужно для работы конкретных методов. Начнем с метода проверки пользователя. Назовем его exist() Чтобы проверить, есть ли он в бд, нам потребуется некоторый идентификатор. Это может быть логин или емейл, я предпочитаю емейл. Емейл мы передаем в аргумент метода exist($email). Возвращать метод будет true, если пользователь есть, или false, если его нет. Коннекшн в бд уже есть внутри класса.

Второй метод - авторизация. В аргументы он помимо емейла принимает пароль, будет примерно так login($email, $password). Аргументы всегда нужно передавать по одному, ни в коем случае нельзя передавать их в виде массива. Тут можно добавить приватный методля расчета хеша или создать отдельный класс с этим методом, и передать его экземпляр в конструктор, вместе с коннекшном. Второй вариант гибче, потому что ты сможешь изменить реализацию расчета хеша, не изменяя класс AuthService , а просто передав в конструктор другой объект, реализующий другой алгоритм.

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

Ну и метод регистрации. В принципе то же самое, только эксепшн бросать когда пользователь уже есть.

Теперь про валидацию. Все предыдущие методы не должны проверять валидность данных. Это не их зона ответственности. Валидацию стоит произвести зарание, а в методы AuthService пихать уже провалидированные данные.

Валидаторы можно делать по разному, но важный момент - они должны принимать на вход исходные данные. То есть внутри класса валидатора недопустимо обращаться к глобальным переменным типа $_POST. Проверить существование и пустоту источника данных (в данном случае $_POST) нужно проверить до отправки их в валидатор. Сам валидатор должен только валидировать, то есть сравнить переданные данные с ожидаемыми и сказать валидны они или нет. Никаких дополнительных проверок или преобразований, все это, если оно требуется, должно быть вне валидатора (до или после будет уже от твоей логики зависить).

Скомпоновать эти компоненты в единую логику можно в контроллере. В конструктор которого нужно передать экземпляр класса AuthService (внедрить зависимость, да да), а в экшне (каком-либо из методов, обрабатывающим запрос) принять данные из поста, возможно как-то преобразовать, пихнуть в валидатор, если они валидны - вызвать нужное действие у объекта AuthService, а если нет получить у валидатора список ошибок и вывести их пользователю.

Ну и конечно AuthService - это итерактор, он не должен содержать в себе данные о пользователе. Для этого нужно создать отдельный класс, например User, и передать в его конструктор все данные, которые ты получил из бд, а там распихать по свойствам этого класса. Именно экземпляр класса User должны возвращать метода AuthService (кроме exist, конечно).

После того, как ты авторизуешь или зарегистрируешь пользователя - тебе в экшн контроллера вернется объект пользователя, у которого ты можешь запросить id и положить его в куку или сессию, а так же уведомить пользователя об успешной авторизации/регистрации.
1
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
19.03.2018, 21:25  [ТС] #5
andr-xw, Спасибо, я как то понял чуть маленько. Не смог бы дать сайты где это подробно описывается именно на ООП.
Или написать свои классы.
0
Jewbacabra
Эксперт PHP
3368 / 2808 / 1266
Регистрация: 24.04.2014
Сообщений: 8,509
19.03.2018, 21:34 #6
Цитата Сообщение от maxoun Посмотреть сообщение
Не смог бы дать сайты где это подробно описывается именно на ООП.
https://www.ozon.ru/context/detail/id/33506422/
0
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
19.03.2018, 21:37  [ТС] #7
Jewbacabra, На счет кода что можешь сказать?
Это книга для начинающих в сфере ООП?
0
Jewbacabra
Эксперт PHP
3368 / 2808 / 1266
Регистрация: 24.04.2014
Сообщений: 8,509
19.03.2018, 21:45 #8
Цитата Сообщение от maxoun Посмотреть сообщение
На счет кода что можешь сказать?
Впринципе andr-xw уже все сказал. Использование ключевых слов class, public, new и т.д само по себе не делает код объектно ориентированным, ООП это определенная идеология.
0
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
19.03.2018, 21:51  [ТС] #9
Jewbacabra, Блин цена на эту книгу повышенная. Блин поможет ли она мне? Эта книга точно для меня?
Вот объясни мне.
Каждый класс отвечает за что то?
То есть в каждом классе определяется что либо?
Подробно на пальцах если не слоожно можешь написать мне что да как и привести пример.
Я задолбался понимать этот ООП, а книгу купить денег нет
0
Jewbacabra
Эксперт PHP
3368 / 2808 / 1266
Регистрация: 24.04.2014
Сообщений: 8,509
19.03.2018, 22:03 #10
Цитата Сообщение от maxoun Посмотреть сообщение
Подробно на пальцах если не слоожно можешь написать мне что да как и привести пример.
Это достаточно объемно и сложно чтобы уместить в формате сообщения форума. Не зря на эту тему целые книги пишут
Цитата Сообщение от maxoun Посмотреть сообщение
а книгу купить денег нет
Я ни к чему не призываю, особенно к действиям противоречащим законам РФ, но
правильно ли я понимаю работу ООП
0
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
19.03.2018, 22:08  [ТС] #11
Jewbacabra, Но мой код хотябы что нибудь дает , есть общее понимание?
Можно я напишу скрипт для регитрации на ООП, а ты проверишь?
0
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
20.03.2018, 00:55 #12
maxoun, попробуй реализовать в коде то, что я описал. Я там тебе даже подсказки в виде названий классов и методов оставил.

На почитать советую это
Эрик Эванс - Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем

Мартин Фаулер - Архитектура корпоративных программных приложений
0
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
20.03.2018, 10:55  [ТС] #13
andr-xw, Можно я напишу код, а ты проверишь его?
0
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
20.03.2018, 12:05 #14
maxoun, можно.
0
maxoun
-41 / 44 / 9
Регистрация: 08.02.2018
Сообщений: 355
20.03.2018, 17:26  [ТС] #15
andr-xw, Jewbacabra, Пожалуйста посмотрите и исправьте ели что не так, PHP программисты исправьте меня

Добавлено через 3 часа 24 минуты
Jewbacabra, ООП как я понял используется в основном где фильтрует данные с работой БД.

Где еще применяется ООП, например как он может примениться при работе с файлами, изображениями????

Не могу представить ООП без работы БД и форм. Может мне стоит прочесть книгу про ООП?
0
Jewbacabra
Эксперт PHP
3368 / 2808 / 1266
Регистрация: 24.04.2014
Сообщений: 8,509
20.03.2018, 21:36 #16
Цитата Сообщение от maxoun Посмотреть сообщение
ООП как я понял используется в основном где фильтрует данные с работой БД.
Нет. ООП и БД ортогональные понятия.
0
20.03.2018, 21:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2018, 21:36

Как правильно организовать параметры подключения к БД при использовании ООП?
Добрый день! Подскажите, пожалуйста, как правильно организовать параметры...

Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
#pragma once namespace Casper { class Cat { private: unsigned int...

Правильно ли я понимаю работу этого кода?
#include &lt;iostream&gt; #include &lt;cctype&gt; using namespace std; int main () { ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru