Нужен совет пофессионалов своего дела

boko

Новичок
Нужен совет пофессионалов своего дела

Я недавно начал изучать ООП соответственно появляются вопросы.

Вот выкладываю вам вопрос:

Создался целью написать класс для Регистрации и Аутентификации всё в одном, пока только регистрация описана.

Хотелось бы узнать мнение, -

код работает, но правильно ли я его написал с точки зрения функциональности,

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

Выкладываю код:

PHP:
<?php

/**
 * @author 
 * @copyright 2010
 */

class Auth {
        var $login;
        var $pass;
        var $salt;
 
     function __construct(){
         $this->salt = '356h73567l';
     }
     
     //Получаем с $_POST логин и пароль
     function GetLoginAndPass($login,$pass){
        $this->login = $login;
        $this->pass = $pass;
       
     }
     //Проверяем если логин есть
     function Check(){
        $ulogin = 'vasia'; 
        
        if($this->login == $ulogin){
            return 1;
        }else{
            return 0;
        }
      }
      
      //Тут обработка регистрации
       function Register(){
      
       $crypt_pass = md5($this->pass + $this->salt);
       $out = 'User: '.$this->login.'<br/> Password: '.$crypt_pass;
       return $out;
       }
 
     
}
     
   


$test = new Auth;

$test->GetLoginAndPass('petya','123456');
if($test->Check() == 0){
   print $test->Register();
}else{
    echo 'User sushestvuet';
}
 

baev

‹°°¬•
Команда форума
Автор оригинала: boko
Создался целью
Автор оригинала: boko подведите меня к цели, а дальше я сам попробую
— сами-то поняли, чего написали?

Как аутентификация происходит — непонятно.
Видно только, что если логин — не 'vasia', он регистрируется как новый (?!)…
 

boko

Новичок
тут пока без базы данных, просто тестовый вариант
 

baev

‹°°¬•
Команда форума
Какая разница: с базой или без?
Как у Вас «отлуп» при аутентификации происходит?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Беда с логикой.
Почему, если $test->Check() == 0, то мы выводим print $test->Register(); ?
Это же fail аторизации по идее?

Зачем шаманство $test->GetLoginAndPass('petya','123456');?
Функция ничего не возвращает и почему-то не вызывается внутри $test->Check().
Это было бы логичнее как мне кажется.
 

phpnewbie

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

Smarti

Новичок
Почему бы вот это
$this->login = $login;
$this->pass = $pass;
не перенести в конструктор?
Кстати, почему метод называется Get а не set? В целом юзабилити кода очень плохое. Ну и логики, как уже сказали, нет.
 

Духовность™

Продвинутый новичок
класс для Регистрации и Аутентификации
регистрация никак не связана с аутентификацией. а классы надо проектировать так, что бы каждый класс отвечал за что-то одно. чем меньше на класс возложено разных по своей сути обязанностей, тем лучше. Пример: ведь изготовление пропуска на предприятии мало чем связано с проходной, так? а ты именно это пытаешься сделать - совместить производство пропусков с занесением человека в журнал с электронной системой на проходной. бред? бред.
 

fixxxer

К.О.
Партнер клуба
Давай-ка отбросим реализацию и рассмотрим только роли и интерфейсы.

Что у нас есть.

У нас есть, очевидно, пользователь сайта (так?). Есть некоторое хранилище аутентификационной информации (где?). Есть источники авторизационных данных (форма, где ввели логин и пароль? а при следующих запросах? видимо, сессия. а если пользователь поставил галочку "запомнить меня? видимо, кука). Вот уже куча сущностей возникла :) Теперь попробуй расписать, что каждая из них должна уметь делать и как они друг с другом взаимодействуют. То есть интерфейсы ([m]Interface[/m]) и прототипы классов (то есть пока только объявления методов, без реализации).

Чтобы не косячить, пользуйся простым правилом:
1)имя интерфейса/имя класса - это существительное. User, например. или Session. Имя метода - это глагол + возможно уточнения. например, loadById($id). Имена следует давать так, чтобы было понятно, что происходит, не читая реализацию.
2)если у класса есть переменная инстанса $foo, то обращаемся туда только через $this->foo. При этом добавления методов getFoo()/setFoo() следует избегать. В случае с set - кроме случаев, когда Foo - это инстанс нужного нам для работы объекта (а не скалярные данные), и мы явно указываем нужный нам интерфейс в объявлении списка параметров метода.
 

boko

Новичок
fixxxer mega респект

шас рисую на бумаге что мне сообстна нужно,
спасибо огромное.

да вот ещё подумал обработку ошибок и валидацию впихивать в класс?
или делать отдельный класс обработчик? или уже при вызове класса шаманить7
 

fixxxer

К.О.
Партнер клуба
Смотря к чему эта обработка относится, а именно, кто именно за проверку отвечает. давай с более простого примера начнем. Например, ты пытаешься загрузить пользователя по id, которого в базе нет, он вполне вправе броситься исключением или вернуть код ошибки (но не его дело, например, отдавать редирект - а вдруг на самом деле мы работем в cron-скрипте, или по какому-нибудь XML RPC? он и догадываться не должен об этом). Если id взяли из url типа /users/123123, то, видимо, контроллер Users должен на это и среагировать, выдав, например, 404-ю.
 

Sigorma

Новичок
Re: Нужен совет пофессионалов своего дела

Автор оригинала: boko
Создался целью написать класс для Регистрации и Аутентификации всё в одном, пока только регистрация описана.
может стоит для начала написать работающие функции под конкретные задачи, а уже потом разбираться с классами, ООП и прочей нечестью?
 

boko

Новичок
Re: Re: Нужен совет пофессионалов своего дела

Ребята, вот по пробовал с регистрацией:
Скажите честно БРЕД?

PHP:
<?php
include_once('db_connect.php');
/**
 * @author 
 * @copyright 2010
 */

class UserRegister {
   
    var $RegUserName;
	var $RegUserPass;
	var $RegSalt;
	
	function __construct($login,$pass){
		$this->RegUserName = $login;
		$this->RegUserPass = $pass;
		$this->RegSalt = '3k4j7g3khg567';
	}

    function CheckUser(){
		$sql = 'SELCT * FROM users WHRE username =\'' .$this->RegUserName. '\' LIMIT 1'; 
		$q = mysql_query($sql);
		$res = mysql_num_rows($q);
	
		if($res > 0){
			return 1;
		}else{
			return 0;	
		}
	
   }
   
   function RegisterUser(){
	   $crypt = md5($this->RegUserPass.$this->RegSalt);
	   $sql = 'INSERT INTO users (username) VALUES username =\'' .$this->RegUserName. '\' AND pass =\'' .$crypt. '\' '; 
	   $q = mysql_query($sql);
	   return 1; // это допустим для SMARTY
   }
}

$reg = new UserRegister('Vasia','123456');
if($reg->CheckUser() == '0'){
	$reg->RegisterUser();
}else{
 echo "Ошибка: Юзер существует!";	
}

?>
 

Духовность™

Продвинутый новичок
'SELCT * FROM users WHRE username =\'' .$this->RegUserName. '\' LIMIT 1'
ты когда-нить слышал, что переменные поступающие в SQL запрос нужно пропускать через функции экранирования спец. символов?

-~{}~ 13.02.10 12:22:

Скажите честно БРЕД?
ООП как такового тут нет. Всё это можно было бы сделать и обычными функциями. Т.е. польза от ООП не очевидна.

if($reg->CheckUser() == '0'){
$reg->RegisterUser();
}
зачем так сложно?

PHP:
if($reg->CheckUser()){
    $reg->RegisterUser();
}
А вообще, я считаю, что ты выбрал очень "тяжелую" задачу для изучения ООП. Я бы на твоем месте начал бы с простого.
 

AmdY

Пью пиво
Команда форума
boko
у тебя должна быть модель User, в которой хранятся-сохраняются данные
$user = new User();
$user->setData($_POST);
$user->save(); - так ты создашь пользователя.
теперь это и доп действия, типо отсылки письма нужно засунуть в регистрацию, которая ничего не должна знать, что пользователь находится в бд и никаких sql запросов не должен делать.

а для CheckUser есть несколько вариантов, хотя этот метод вовсе из другой песочницы нежели регистрация
$user->getByLoginAndPass($login, $pass); -- так ты его проверишь
$user->getByEmailAndPass($email, $pass) - а в другом проекте,
возможно проверка будет через мэйл.
 

Духовность™

Продвинутый новичок
А вообще, я считаю, что ты выбрал очень "тяжелую" задачу для изучения ООП. Я бы на твоем месте начал бы с простого.
Так вот, продолжу. Напиши класс автомобиль и класс телега и заставь их ехать. Эти классы должны иметь одного предка - класс транспортное средство, а управлять телегой и авто должен человек, который, естественно должен сидеть внутри этих транспортных средств. Напиши эти классы без всяких баз данных, пусть они работают чисто в оперативной памяти. Т.е. потренируйся на объектах реального мира, посмотри как одно соотносится с другим. Представь, как в твоем организме объект сердце взаимодействует с другими объектами, составляя одно целое. Это и будет хорошим началом для ОО-мышления.

Как AmdY хорошо расписал, данный клас регистрации не имеет большого смысла без модели пользователя User (т.е. класса User). Т.е. тебе сначала нужно создать класс User, а потом от него и плясать. А что бы создать класс User, нужно иметь представление о том, как обычно взаимодействуют классы и БД - это очень трудная тема, т.к. реляционные типы структур не очень дружат с объектным представлением. Почитай в интернете про http://ru.wikipedia.org/wiki/ActiveRecord и попробуй создать класс User на основе этого паттерна. Потом класс регистрация будет более понятен в реализации.
 
Сверху