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

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

Mr.Nobody

Новичок
Класс лучше назвать User, у этого класса должны быть методы, например - Delete($idUser)-метод удаляет пользователя из бд по его ID, getID($loginUser) - метод возвращает id пользователя по его логину ну и так далее.И делать публичными эти поля
PHP:
        public $login;
        public $password;
        public $error;
это нарушение принципов ООП. Эти поля $login;
$password;
тут совершенно не нужны,поле $error; должно быть скрыто, и доступ можно получить полю $error через get метод к примеру
PHP:
 getError()
 {
    return $this->error;
 }
Вообще тема ООП настолько огромна, что лучше прочитать несколько книг, посмотреть примеры классов http://pear.php.net/. Потом уже браться за этого монстра - ООП.
 

malina95

Дракула кода:)
Скаижте пожалуйста так лучше или нет?
PHP:
<?php
	require_once "register.php";
	if (isset($_POST['submit'])) {
		$mysqli = new mysqli("localhost", "Admin", "udiram04", "oop");
		$user = new User();
		$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;
?>
PHP:
<?php
	class User {
		public $mysqli;
		public $error;
		public function getError($error) {
			return $this->error = $error;
		}
		public function connectDB() {
			return $this->mysqli;
		}
		public function registerUser ($login, $password) {
			$login = trim(htmlspecialchars($login));
			$password = trim(htmlspecialchars($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("Пользователь успешно удалён");
				}
			}
		}
	}
?>
 

craz

Нестандартное звание
public function connectDB() {
return $this->mysqli;
}
public function deleteUser($id_user) {
$mysqli = $this->connectDB();

Ты можешь объяснить зачем ты так делаешь?
 

malina95

Дракула кода:)
А как правильно? Я просто пробовал по разному сделать функцию подключения но получилось только так
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
malina95
ты положил класс User в файл register.php? Нет ли тут странности?

Зачем это?
PHP:
$login = trim(htmlspecialchars($login));
$password = trim(htmlspecialchars($password));
Это вообще как?
PHP:
if (empty($login) AND strlen($login) > 3) {
      unset($login);
      return $this->getError('Вы не ввели Логин');
}
Метод, который называется connectDB, на самом деле не соединяет тебя с БД, а возвращает линк на соединение, это разные вещи, и называть методы надо сообразно тому, что метод делает.
 

craz

Нестандартное звание
А как правильно? Я просто пробовал по разному сделать функцию подключения но получилось только так
Подожди, я спросил что: "ЗАЧЕМ ты так делаешь"?. Ты мне дословно сказал, как из того анекдота: "Я и лежа пробовал дрова рубить, но не получается, поэтому вот сидя рублю."

Зачем ты это делаешь? В программировании всегда есть этот главный вопрос. Зачастую он важнее "почему", и "как".
 

malina95

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

malina95

Дракула кода:)
Я не знаю почему я именно так делаю, может привычка работы с библиотеками функций...
 

craz

Нестандартное звание
Я просто пытаюсь научиться писать на ооп, я всё равно этот класс или удалю или если всё получиться напишу на нём регистрацию... Мне нужно разобраться как правильно писать эти функции и как с ними работать
Может ты сначала книжки почитаешь? Прежде чем вообще, что либо писать? Пофиг пишешь ты ООП или функционально или процедурно или как либо еще. Ты не понимаешь вообще, что ты пишешь, главное зачем!!
 

malina95

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

Mr.Nobody

Новичок
Это что такое?
PHP:
        public $mysqli;
        public $error;
        public function getError($error) {
            return $this->error = $error;
        }
$mysqli; $error; должны иметь тип доступа private,
PHP:
            public function getError() {
               return $this->error ;
            }
getError()- это свойство класса User - оно хранит ошибку, а не присваивает полю $error значение.Сделаны get методы для того что бы нельзя бы в не класса менять значение поля $error, так как в твоем варианте я могу сделать так
PHP:
$user=new User();
$user->getError("Ошибка");
 

malina95

Дракула кода:)
error исправил, но mysqli не могу понять как потом сделать подключение в индекс файле если там стоит private
 

Mr.Nobody

Новичок
Ок.
PHP:
$user=new User();
unset($user->mysqli);
И тебе приейдеться работать на новогодние праздники и выходные.Подключение к бд обычно делают по этому шаблону Wiki
 

С.

Продвинутый новичок
Ок.
PHP:
$user=new User();
unset($user->mysqli);
И тебе приейдеться работать на новогодние праздники и выходные.
А по каким дням придется работать в таком случае? Как объявлять, чтобы от этого защититься?
PHP:
$user=new User();
unset($user);
 

Mr.Nobody

Новичок
Честно скажу не знаю, первое что приходит в голову это перехватить деструктор, но там проблема нельзя выбросить Exeption.У тебя есть решение?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ребят, прекращайте оффтопить, автору и того, что ему написали не осилить сразу.)
 

AmdY

Пью пиво
Команда форума
malina95
вобщем продолжай модифицировать свой класс и будешь улавливать смысл ООП, главный из которых - УДОБСТВО.

Mr.Nobody
это нарушение принципов ООП. Эти поля $login;
$password; тут совершенно не нужны,поле $error; должно быть скрыто, и доступ можно получить полю $error через get метод к примеру
Публичные поля ничего не нарушают, инкапсуляция это "скрытие реализации", а не про модификаторы доступа как многие заблуждаются.
а вот делать для них сеттор имеет смысл чтобы избавиться от дублирования
PHP:
$login = trim(htmlspecialchars($login));
 $password = trim(htmlspecialchars($password));

// будет
function foo($login, $password) {
    $this->setLogin($login); 
    $this->setPassword($password);
    echo $this->login, ' ', $this->password;
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху