Помогите освоить ООП

Статус
В этой теме нельзя размещать новые ответы.

malina95

Дракула кода:)
Мне тут сказали что для каждого класса если в нём предусмотрено подключение к бд нужно делать отдельный класс, потому что если реквайрить один и тот же класс во все файлы это будет настоящая куча мусора
 

radioheaded

PHP нуб
Мне тут сказали что для каждого класса если в нём предусмотрено подключение к бд нужно делать отдельный класс, потому что если реквайрить один и тот же класс во все файлы это будет настоящая куча мусора
Точнее и не скажешь: действительно, для каждого класса нужно делать отдельный класс.
 
  • Like
Реакции: craz

malina95

Дракула кода:)
В этом ясно, но почемуто мне написать класс для работы с бд для этого класса ооочень сложно
 

craz

Нестандартное звание
блин прям как фантастический детектив читается... В следующей главе, наверное, появиться инопланетяне запрещающие читать книги...
 

AmdY

Пью пиво
Команда форума
malina95
ты используешь mysqli это как раз класс для работы с бд, тебе больше заморачиваться пока не стоит. Занимайся дальше рефакторингом.

Тебе сейчас нужно почистить код от валидаций, после этого останутся запросы к базе данных. ты их вынесешь в отдельный слой как ранее делал $user->mysqli = $mysqli; будет $user->model = new ModelUser(); В этот момент ты узнаешь что уже пользуешься моделями и контроллерами. Потом будешь заниматься либо определением правильного места для валидации, либо перейдёшь ко вьюхе. Но пока это рано. Чисть код от мусора.
 

malina95

Дракула кода:)
завтра поправлю и покажу, надеюсь будет меньше претензий от PHP нуба
 

malina95

Дракула кода:)
Немного модифицировал
PHP:
<?php
	class User {
		public $mysqli;
		private $error;
		private function validData($data) {
			if(is_array($data)) {
				return $this->getError('Мы массив пока не обрабатываем');
			}
			else {
				$data = trim(htmlspecialchars(stripslashes($data)));
			}
			return $data;
		}
		private function getError($error) {
			return $this->error = $error;
		}
		public function connectDB() {
			return $this->mysqli;
		}
		public function registerUser ($login, $password) {
			$login = $this->validData($login);
			$password = $this->validData($password);
			if (empty($login) AND strlen($login) > 3) {
				unset($login);
				return $this->getError('Вы не ввели Логин');
			}
			if (empty($password) AND strlen($password) > 6) {
				unset($password);
				return $this->getError('Вы не ввели Пароль');
			}
			if (isset($login) AND isset($password)) {
				//$mysqli = new mysqli("localhost", "Admin", "udiram04", "oop");
				$mysqli = $this->connectDB();
				$isset_login = $mysqli->query("SELECT `login` FROM `reg` WHERE `login` = '".$login."'");
				$arr_isset = $isset_login->fetch_assoc();
				if (!$arr_isset['login'] == "") { 
					return $this->getError("Такой логин существует");
				}
				$mysqli->query("INSERT INTO `reg` (`login`, `password`, `date`) VALUES ('".$login."', '".$password."', UNIX_TIMESTAMP())");
				$id = $mysqli->insert_id;
				$result = $mysqli->query("SELECT * FROM `reg` WHERE `id` = '$id'");
				$arr = $result->fetch_assoc();
				return "Ваш логин: ".$arr['login']."<br />Ваш пароль: ".$arr['password']."<br />Дата регистрации: ".date("d:m:y h:s", $arr['date']);
			}
		}
		public function deleteUser($id_user) {
			$mysqli = $this->connectDB();
			$delete_user = $mysqli->query("SELECT `id` FROM `reg` WHERE `id` = '$id_user'");
			$arr_del_user = $delete_user->fetch_assoc();
			if (empty($arr_del_user['id'])) {
				return $this->getError("Такого пользователя нет");
			}
			else {
				$del_user = $mysqli->query("DELETE FROM `reg` WHERE `id` = '$id_user' LIMIT 1");
				if ($del_user === true) {
					return $this->getError("Пользователь успешно удалён");
				}
			}
		}
	}
?>
PHP:
<?php
	require_once "register.php";
	if (isset($_POST['submit'])) {
		$mysqli = new mysqli("localhost", "Admin", "udiram04", "oop");
		$user = new User($mysqli);
		$user->mysqli = $mysqli;
		echo $user->registerUser($_POST['login'], $_POST['password']);
	}
	echo <<<TXT
	<form action = "" method = "post">
	<input type = "text" name = "login" />
	<input type = "password" name = "password" />
	<input type = "submit" name = "submit" />
	</form>
TXT;
?>
 

AmdY

Пью пиво
Команда форума
unset($password);
return $this->getError('Вы не ввели Пароль');
какой сокральный смысл ансетить локальные данные, когда ты всё равно выходишь из функции.
ещё из смыслового. get - берём что-то, set - устанавливаем, соотвественно
$this->setError('ошибка');
echo $this->getError();

плюс подумай, что ошибок может быть несколько и их стоит проверить за раз, а потом все вместе вывести пользователю.

пока всё хорошо, но слишком много необдуманных моторных движений, которые лишние и бессмысленные.
 

malina95

Дракула кода:)
Так лучше?
PHP:
class User {
		public $mysqli;
		private $error;
		private $yes;
		private function validData($data) {
			if(is_array($data)) {
				return $this->getError('Мы массив пока не обрабатываем');
			}
			else {
				$data = trim(htmlspecialchars(stripslashes($data)));
			}
			return $data;
		}
		private function setError($error) {
			if(empty($this->error)) {
				$this->error = $error;
			}
			else {
				$this->error .= "<br />".$error;
			}
		}
		public function setUser($yes) {
			if(empty($this->yes)) {
				$this->yes = $yes;
			}
			else {
				$this->yes .= "<br />".$yes;
			}
		}
		public function __construct() {
				return $user->error."<br />".$user->yes;
		}
		public function connectDB() {
			return $this->mysqli;
		}
		public function registerUser ($login, $password) {
			$login = $this->validData($login);
			$password = $this->validData($password);
			if (empty($login) AND strlen($login) < 4) {
				$this->setError('Вы не ввели Логин');
			}
			if (empty($password) AND strlen($password) < 6) {
				$this->setError('Вы не ввели Пароль');
			}
			if (!empty($login) AND !empty($password)) {
				//$mysqli = new mysqli("localhost", "Admin", "udiram04", "oop");
				$mysqli = $this->connectDB();
				$isset_login = $mysqli->query("SELECT `login` FROM `reg` WHERE `login` = '".$login."'");
				$arr_isset = $isset_login->fetch_assoc();
				if (!$arr_isset['login'] == "") { 
					$this->setError("Такой логин существует");
				}
				$mysqli->query("INSERT INTO `reg` (`login`, `password`, `date`) VALUES ('".$login."', '".$password."', UNIX_TIMESTAMP())");
				$id = $mysqli->insert_id;
				$result = $mysqli->query("SELECT * FROM `reg` WHERE `id` = '$id'");
				$arr = $result->fetch_assoc();
				$this->setUser("Ваш логин: ".$arr['login']."<br />Ваш пароль: ".$arr['password']."<br />Дата регистрации: ".date("d:m:y h:s", $arr['date']));
			}
		}
		public function deleteUser($id_user) {
			$mysqli = $this->connectDB();
			$delete_user = $mysqli->query("SELECT `id` FROM `reg` WHERE `id` = '$id_user'");
			$arr_del_user = $delete_user->fetch_assoc();
			if (empty($arr_del_user['id'])) {
				$this->setError("Такого пользователя нет");
			}
			else {
				$del_user = $mysqli->query("DELETE FROM `reg` WHERE `id` = '$id_user' LIMIT 1");
				if ($del_user === true) {
					$this->setUser("Пользователь успешно удалён");
				}
			}
		}
	}
 

radioheaded

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

Но вообще, честно, ты занимаешься фигней. Ты пытаешься создать сферического коня в вакууме. Один и тот же класс для работы с пользователем может выглядеть совершенно по-разному в разных системах. Потому что цели разные. Ты не знаешь, где, а главное — как будешь применять этот класс, поэтому просто тыкаешь пальцем в небо и спрашиваешь других, «ну щас-то я попал или нет?».

Остановись на одном варианте и начни использовать. Ты сразу увидишь, в каких местах твой класс неудобен. И вот тут главное не тупо латать дыры, а сесть и проанализировать. Анализируй, почему это неудобно, в чем истинная причина, а как удобно, а что сделать, чтобы было удобно.
 

craz

Нестандартное звание
Да и предметная область выбрана для изучения ООП очень абстрактная, почему никто не обращает на это внимание не понятно.
Ты почему вообще решил класс User`a писать? Начни может со зверушек, или с геометрических фигур. Это менее абстрактные области в которых очень просто найти соответствие реально объекта и виртуального. И понять соответствует ли поведение виртуального объекта поведению виртуального.
 

malina95

Дракула кода:)
Я пробовал работать с фреймворком, но так и не смог понять самой простой вещи... как там обработчиком является один индекс файл? Я всё время делаю с множеством файлов и получается быстро и легко, а с индексным файлом проблемка получается. Вроде уже и не дурак а до сих пор туплю сижу
 

malina95

Дракула кода:)
Я класс решил написать чтобы познакомится с ооп. он мне потом врядли пригодится
 

radioheaded

PHP нуб
Ну вот видишь, вот сразу теперь все ясно стало. Ты просто не умеешь учиться (ну или очень сильно не хочешь). Хочется как в Матрице, да? Подключили кабель, залили знания и чпок — I know kung-fu.

Ты не читаешь то, что тебе советуют. Попробуй еще раз перечитать. Внимательно.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху