Правильно ли построен код на OOP

126
30 июля 2021, 01:30

Начал учить ООП php и вроде написал код который работает, но на 100% уверен что с ним что-то не так, но что именно не пойму. Это мини система авторизации и регистрации.

Класс регистрации

    class Registeret{
    private $serverhost;
    private $servername;
    private $serverpass;
    private $serverdb;
    private $name;
    private $pass;
    public $submit;
    private $error;
    private $errorIsNan;
    function __construct($name,$pass,$submit)
    {
        $this->name = $name;
        $this->pass = $pass;
        $this->submit = $submit;
    }
    function getInfoPersion()
    {
        $this->serverhost = 'localhost';
        $this->servername = 'root';
        $this->serverpass = '';
        $this->serverdb = 'marlincraft';
        $this->error = "Такой пользователь уже найден, поменяйте свой логин!";
        $this->errorIsNan = "Введите данные в поле!";
        $this->newLogin();
    }
    function newLogin()
    {
        if (isset($this->submit)){
            if ((strlen($this->name) < 5 || strlen($this->pass) < 8) || (strlen($this->name) < 5 & strlen($this->pass) < 8))
            {
                $_SESSION['error'] = $this->errorIsNan;
            }
            else
            {
                $this->checkingname();
            }
        }
    }
    function checkingname()
    {
        $connect = new mysqli("$this->serverhost", "$this->servername", "$this->serverpass", "$this->serverdb");
        $result = $connect->query("SELECT login FROM users WHERE login = '$this->name'");
        $user = $result->fetch_assoc();
        if (count($user) == 0){
            $this->verefySend();
        }
            $_SESSION['error'] = $this->error;
    }
    function verefySend()
    {
        $connect = new mysqli("$this->serverhost", "$this->servername", "$this->serverpass", "$this->serverdb");
        if ($connect->query("INSERT INTO `users` (login,password,email,age) VALUE ('$this->name','$this->pass','asdsd','42')"))
        {
            header("Location: /");
        }
    }
}

А вот код авторизации

    class SignIn{
    private $login;
    private $password;
    private $submit;
    private $errorIsNan;
    function __construct($login,$password,$submit)
    {
        $this->login = $login;
        $this->password = $password;
        $this->submit = $submit;
    }
    function getInfoPersionSign()
    {
        $this->serverhost = 'localhost';
        $this->servername = 'root';
        $this->serverpass = '';
        $this->serverdb = 'marlincraft';
        $this->errors = "Такой пользователь не найден!";
        $this->errorIsNan = "Введите данные в поле!";
        $this->verefyInfoSign();
    }
    function verefyInfoSign()
    {
        if (isset($this->submit)) {
            if ($this->login == "" || $this->password == "") {
                $_SESSION['errors'] = $this->errorIsNan;
            }
        }
        $this->signIntoSystem();
    }
    function signIntoSystem()
    {
        if (isset($this->submit)) {
            $connect = new mysqli("$this->serverhost", "$this->servername", "$this->serverpass", "$this->serverdb");
            $result = $connect->query( "SELECT * FROM `users` WHERE login = '$this->login' AND password = '$this->password'");
            if ($result->num_rows == 1){
                $row_auth = $result->fetch_assoc();
                $_SESSION['persen'] = array($row_auth['id'], $row_auth['login'], $row_auth['password'], $row_auth['email'],$row_auth['age']);
                header("location: /");
            }
            $_SESSION['errors'] = $this->errors;
        }
    }
}

и создание экземпляров

    $conect = new Registeret($_POST['name'],$_POST['pass'],$_POST['sign-in']);
    $conect->getInfoPersion();
    $signIn = new SignIn($_POST['login'],$_POST['password'],$_POST['submit']);
    $signIn->getInfoPersionSign();
Answer 1

Ну. Хорошо что атрибуты объявлены как private, но почему public $submit ? :)

Главная Ваша ошибка в том что Вы по-прежнему думаете в терминах действий, поэтому даже класс назвали SignIn, например, что является действием, а не объектом. У классов должны быть названия существительные. Например, User. Как с вещами в реальном мире, стол, стул, кружка, кнопка и т.п.

Вот я немного набросал более ООП кода. Я не PHP-программист, мог где-то ошибиться в чисто PHP-шных вещах

class User {
    private $connection;
    private $login;
    private $row;
    function __construct($c, $login, $row) {
        $this->connection = $c;
        $this->login = $login;
        $this->row = $row;
    }
    function attrs() {
        if (!isset($this->attrs)) {
            $result = $this->connection->query( "SELECT * FROM `users` WHERE login = '$this->login'");
            if ($result->num_rows == 0)
                throw new UserNotFound($this->login);
            $this->row = $result->fetch_assoc();
        }
        return array($this->row['id'], $this->row['login'], $this->row['password'], $this->row['email'],$this->row['age'])
    }
}
class UsersStorage {
    private $connection;
    function __construct($c) {
        $this->connection = $c;
    }
    function user($login) {
        $result = $this->connection->query( "SELECT * FROM `users` WHERE login = '$login'");
        if ($result->num_rows == 0)
            return array();
        return array(new User(#this->connection, $login, $result->fetch_assoc()));
    }
    function add($login, $attrs) {
        $this->connection->query("INSERT INTO `users` (login,password,email,age) VALUE ('$login','$attrs[2]','$attrs[3]','$attrs[4]')");
    }
}
// login handler
$c = new mysqli("localhost", "root", "", "db");
$storage = new UsersStorage($c);
$user = $storage.user($_POST['login'])
if (count($user) == 0) {
   // user not found, register first
}
else {
    $_SESSION['person'] = $user->attrs();
}
// register handler
$c = new mysqli("localhost", "root", "", "db");
$storage = new UsersStorage($c);
$user = $storage.user($_POST['login'])
if (count($user) == 0) {
   $storage->add($_POST['login'], array($_POST['login'], $_POST['password'], $_POST['email'], $_POST['age']))
    $_SESSION['person'] = $storage->user($_POST['login']);
}
else {
    // already exists case, choose another login
}
Answer 2

Все плохо... Дублирование, смешивание, инъекции...

  1. Работу с БД (подключение, получение данных, обновление, удаление) - в отдельный класс, с которым будете взаимодействовать в любых других.
  2. Регистрация, авторизация, подтверждение пароля, обновление данных пользователя (через ЛК), удаление ЛК - в единый класс
READ ALSO
Как реализовать авторизацию по ролям?

Как реализовать авторизацию по ролям?

Имеется страница авторизации и база данных с таблицей пользователей и таблицей ролей этих пользователейТаблицы связаны внешним ключом

291
Помогите мерцание блока диалогов

Помогите мерцание блока диалогов

Есть система диалогов пользователей (картинка 1) и в ней список диалогов переобновляется каждую сек AjaxомДело в том что при наведении на блок...

118
Вывод данных из mysql с помощью php

Вывод данных из mysql с помощью php

Есть база данных db_cars Запрос к базе данных должен выводить марку и модель автомобиля, свойства которого укажет пользовательЕсли запрос забить...

119