в общем учу ооп ,жду здоровой критики , какие есть большие недочеты? PHP: <?php class User { public $lastError; function __construct() { $sql -> query("CREATE TABLE IF NOT EXISTS Users (PRIMARY KEY(userID), Login varchar(25), Password varchar(25), Email varchar(45) )"); } function search($field,$fieldname='Login') { if ($sql -> query("select * from Users where ".$fieldname."='". addslashes($field) ."' ") <> 0) return true; else $this -> $lastError = $field." Not found"; return false; } //эту функцию я позаимствовал function TrueEmail($email){ $email_arr=explode('@',$email); $email_arr2=@explode('.',$email_arr[1]); switch (true){ case count($email_arr)!=2: return false; case strlen($email_arr[1])<4: return false; case preg_replace("/[0-9A-zА-я._-]/",null,$email_arr[0])!=false: return false; case preg_replace("/[0-9A-zА-я._-]/",null,$email_arr[1])!=false: return false; case count($email_arr2)<2: return false; case strlen($email_arr2[0])<2: return false; case strlen($email_arr2[1])<2: return false; default: return true; } } function edit($login,$password,$email,$userID) { $login = trim ($login); $password = trim ($password); $email = trim ($email); if (!$this->TrueEmail($email)) { $this -> $lastError = $email." is bad e-mail"; return false; } $sql -> query("update Users SET Login='". addslashes($login) ."' , Password = '". addslashes($password) ."' , Email = '". addslashes($email) ."' WHERE userID = '". addslashes($userID) ."'"); return true; } function delete($field,$fieldname='userID',$limit=1) { $sql -> query("DELETE FROM Users where ".$fieldname."='". addslashes($field) ."' LIMIT ".$limit." "); } function add($login,$password,$email) { $login = trim ($login); $password = trim ($password); $email = trim ($email); if (!$this->TrueEmail($email)) { $this -> $lastError = $email." is bad e-mail"; return false; } if ($this->search($login)) { $this -> $lastError = $login." already exists"; return false; } if ($this->search($email,'Email')) { $this -> $lastError = $email." already exists"; return false; } $sql -> query("INSERT INTO Users(Login,Email,Password) values ( '".$login."', '".$email."','".$password."') "); return true; } } ?>
crautcher 1. не ответ 2. нет, если в вашем коде убрать слово class по-сути программа нисколько не изменится. Вполне нормальный процедурный подход... Достаточно сомнительно создавать таблицу бд в конструкторе класса Откуда берётся переменная $sql? Со стандартами оформления как-то не очень: http://www.opennet.ru/docs/RUS/php_code_standart/ UPD по стилю кодирования лучше сюда: http://framework.zend.com/manual/ru/cod ... style.html Возьмите книгу что ли
crautcher ООП подразумевает немного другое. Класс - это описание какого-либо объекта, у тебя же класс - это просто набор функций. например, возьмём класс пользователя, каким его представляю я: PHP: <?php class User { private $user = array( 'user_id' => 0, 'name' => '', 'pass' => '' ); // инициализация пользователя public function __construct($user_id = 0){ if(self::exists($user_id)){ $db = DatabaseClass::getInstance(); $this->user['user_id'] = $user_id; $query = "SELECT `user_id`, `name`, `pass` FROM `users` WHERE `user_id`={user_id}"; $this->user = $db->first($query, $this->user); } } // установка имени и пароля пользователя public function set_data($name, $pass){ $this->user['name'] = $name; $this->user['pass'] = $pass; } // сохранение изменений пользователя public function save(){ $db = DatabaseClass::getInstance(); $query = "UPDATE `users` SET `name`={name}, `pass`=md5({pass}) WHERE `user_id`={user_id}"; $db->query($query, $this->user); } // удаление текущего пользователя public function delete(){ $db = DatabaseClass::getInstance(); $query = "DELETE FROM `users` WHERE `user_id`={user_id}"; $db->query($query, $this->user); } /* СТАТИЧНЫЕ ФУНКЦИИ */ // проверка существования пользователя по айди private static function exists($user_id){ $db = DatabaseClass::getInstance(); $query = "SELECT COUNT(*) as `count` FROM `users` WHERE `user_id`={user_id}"; $count = $db->first($query, array('user_id'=>$user_id)); return $count['count']; } } ?> в итоге я могу работать с пользователями как с объектами - создать объект нового пользователя, либо получить объект уже существующего пользователя по айди PHP: <?php $new_user = new User(); $new_user->set_data('Gromo', '1234'); $new_user->save(); $old_user = new User(1); $old_user->delete();
вот теперь я не совсем понял , но класс и есть набор методов(функций) , возможно мне теории нихватает
Gromo Улыбнуло)) PHP: <?php if(self::exists($user_id)){ $db = DatabaseClass::getInstance(); //................... private static function exists($user_id){ $db = DatabaseClass::getInstance(); И зачем все эти телодвижения с инстансом DatabaseClass, есло можно один раз в конструкторе вызвать
Он прав, $this->db = .. в конструкторе лучше, а еще лучше $this->setDb() в конструкторе и $this->getDb() везде.
Сервис-локаторы не многим лучше Синглтона, но я о другом. Речь об использовании переданного внутри класса. Лучше тем, что если захочется перейти на этот самый реестр, или вообще переписать класс для использования вместе с инжекцией зависимостей - придется поправить одно место, где делается setDb вместо путешествия по классу в поисках, где же еще этот db дергается.
А зачем геттер? по моему private $db; справиться с этим нормально PHP: <?php $this->db = DatabaseClass::getInstance(); $this->db->query($sql);
Это уже долгий холивар. Как минимум сеттер позволит сделать type hinting protected function setDb( Db $db ) {
это мой взгляд на вещи, предпочитаю не хранить ссылку на объект БД в объектах других классов. тем более, что в оригинале я получаю реестр, где хранится не только объект БД, но и другие данные. а здесь лишь привёл часть класса для наглядного примера предпочитаю в конструктор передавать только те данные, которые относятся к объекту, не создавая лишних свойств я предпочёл сделать единый интерфейс для различных классов баз данных, и через функцию получать объект именно того типа базы, который сейчас используется в системе
неважно. мне не нравится, потому так не делаю а видеть и не нужно. всё и так гут. все классы бд должны поддерживать стандартный sql (на котором собственно и пишутся запросы в бд), делать разбор запроса и экранирование переменных, поддерживать набор методов интерфейса