За последние 24 часа нас посетили 64568 программистов и 1574 робота. Сейчас ищут 836 программистов ...

насколько все плохо ?

Тема в разделе "PHP для новичков", создана пользователем crautcher, 9 сен 2011.

  1. crautcher

    crautcher Активный пользователь

    С нами с:
    21 май 2011
    Сообщения:
    156
    Симпатии:
    0
    в общем учу ооп ,жду здоровой критики ,
    какие есть большие недочеты?

    PHP:
    1. <?php
    2. class User
    3. {
    4. public $lastError;
    5.  
    6.  function __construct()
    7.     {
    8.         $sql -> query("CREATE TABLE IF NOT EXISTS Users (PRIMARY KEY(userID), Login varchar(25), Password varchar(25), Email varchar(45) )");
    9.     }
    10.    
    11.  
    12.  
    13.     function search($field,$fieldname='Login')
    14.     {
    15.     if ($sql -> query("select * from Users where ".$fieldname."='". addslashes($field) ."' ") <> 0)
    16.             return true;
    17.     else
    18.             $this -> $lastError = $field." Not found";
    19.             return false;
    20.     }
    21.  
    22.  
    23. //эту функцию я позаимствовал
    24. function TrueEmail($email){
    25.                     $email_arr=explode('@',$email);
    26.      $email_arr2=@explode('.',$email_arr[1]);
    27.      switch (true){
    28.          case count($email_arr)!=2:
    29.              return false;
    30.          case strlen($email_arr[1])<4:
    31.              return false;
    32.          case preg_replace("/[0-9A-zА-я._-]/",null,$email_arr[0])!=false:
    33.              return false;
    34.          case preg_replace("/[0-9A-zА-я._-]/",null,$email_arr[1])!=false:
    35.              return false;
    36.          case count($email_arr2)<2:
    37.              return false;
    38.          case strlen($email_arr2[0])<2:
    39.              return false;
    40.          case strlen($email_arr2[1])<2:
    41.              return false;
    42.          default:
    43.              return true;
    44.      }
    45.  }
    46.  
    47.  
    48.  
    49.     function edit($login,$password,$email,$userID)
    50.     {
    51.     $login = trim ($login);
    52.     $password = trim ($password);
    53.     $email = trim ($email);
    54.     if (!$this->TrueEmail($email))
    55.     {
    56.         $this -> $lastError = $email." is bad e-mail";
    57.      return false;     
    58.     }
    59.     $sql -> query("update Users SET Login='".   addslashes($login)  ."' , Password = '".    addslashes($password)   ."' , Email = '".   addslashes($email)  ."' WHERE userID = '".  addslashes($userID) ."'"); 
    60.     return true;               
    61.     }
    62.    
    63.  
    64.  
    65.    
    66.     function delete($field,$fieldname='userID',$limit=1)
    67.     {
    68.     $sql -> query("DELETE FROM Users where ".$fieldname."='". addslashes($field) ."' LIMIT ".$limit." ");
    69.     }
    70.    
    71.  
    72.  
    73.    
    74.     function add($login,$password,$email)
    75.     {
    76.     $login = trim ($login);
    77.     $password = trim ($password);
    78.     $email = trim ($email);
    79.     if (!$this->TrueEmail($email))
    80.     {
    81.      $this -> $lastError = $email." is bad e-mail";
    82.      return false;
    83.     }
    84.     if ($this->search($login))
    85.     {
    86.      $this -> $lastError = $login." already exists";
    87.      return false;
    88.     }
    89.     if ($this->search($email,'Email'))
    90.     {
    91.       $this -> $lastError = $email." already exists";
    92.       return false;
    93.     }
    94.     $sql -> query("INSERT INTO Users(Login,Email,Password) values ( '".$login."', '".$email."','".$password."') ");
    95.     return true;
    96.     }
    97.    
    98. }
    99. ?>
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Только два вопроса:
    1. По каким источникам учитесь
    2. Где здесь ООП
     
  3. crautcher

    crautcher Активный пользователь

    С нами с:
    21 май 2011
    Сообщения:
    156
    Симпатии:
    0
    1. по разным
    2. разве классы это не ооп ?
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    crautcher
    1. не ответ
    2. нет, если в вашем коде убрать слово class по-сути программа нисколько не изменится. Вполне нормальный процедурный подход...

    Достаточно сомнительно создавать таблицу бд в конструкторе класса
    Откуда берётся переменная $sql?
    Со стандартами оформления как-то не очень: http://www.opennet.ru/docs/RUS/php_code_standart/
    UPD по стилю кодирования лучше сюда: http://framework.zend.com/manual/ru/cod ... style.html

    Возьмите книгу что ли
     
  5. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    crautcher
    ООП подразумевает немного другое. Класс - это описание какого-либо объекта, у тебя же класс - это просто набор функций.

    например, возьмём класс пользователя, каким его представляю я:

    PHP:
    1. <?php
    2.  
    3. class User {
    4.  
    5.   private $user = array(
    6.       'user_id' => 0,
    7.       'name' => '',
    8.       'pass' => ''
    9.     );
    10.  
    11.   // инициализация пользователя
    12.   public function __construct($user_id = 0){
    13.     if(self::exists($user_id)){
    14.       $db = DatabaseClass::getInstance();
    15.       $this->user['user_id'] = $user_id;
    16.       $query = "SELECT `user_id`, `name`, `pass` FROM `users` WHERE `user_id`={user_id}";
    17.       $this->user = $db->first($query, $this->user);
    18.     }
    19.   }
    20.  
    21.   // установка имени и пароля пользователя
    22.   public function set_data($name, $pass){
    23.     $this->user['name'] = $name;
    24.     $this->user['pass'] = $pass;
    25.   }
    26.  
    27.   // сохранение изменений пользователя
    28.   public function save(){
    29.     $db = DatabaseClass::getInstance();
    30.     $query = "UPDATE `users` SET `name`={name}, `pass`=md5({pass}) WHERE `user_id`={user_id}";
    31.     $db->query($query, $this->user);
    32.   }
    33.  
    34.  
    35.   // удаление текущего пользователя
    36.   public function delete(){
    37.     $db = DatabaseClass::getInstance();
    38.     $query = "DELETE FROM `users` WHERE `user_id`={user_id}";
    39.     $db->query($query, $this->user);
    40.   }
    41.  
    42.  
    43.   /* СТАТИЧНЫЕ ФУНКЦИИ */
    44.  
    45.   // проверка существования пользователя по айди
    46.   private static function exists($user_id){
    47.     $db = DatabaseClass::getInstance();
    48.     $query = "SELECT COUNT(*) as `count` FROM `users` WHERE `user_id`={user_id}";
    49.     $count = $db->first($query, array('user_id'=>$user_id));
    50.     return $count['count'];
    51.   }
    52. }
    53.  
    54. ?>
    в итоге я могу работать с пользователями как с объектами - создать объект нового пользователя, либо получить объект уже существующего пользователя по айди

    PHP:
    1. <?php
    2.  
    3. $new_user = new User();
    4. $new_user->set_data('Gromo', '1234');
    5. $new_user->save();
    6.  
    7. $old_user = new User(1);
    8. $old_user->delete();
     
  6. crautcher

    crautcher Активный пользователь

    С нами с:
    21 май 2011
    Сообщения:
    156
    Симпатии:
    0
    вот теперь я не совсем понял , но класс и есть набор методов(функций) , возможно мне теории нихватает
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Gromo
    Симпатичный код, но всё же он не является примером ООП

     
  8. crautcher

    crautcher Активный пользователь

    С нами с:
    21 май 2011
    Сообщения:
    156
    Симпатии:
    0
    спасибо всем, буду учиться
     
  9. alexfer

    alexfer Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    239
    Симпатии:
    0
    Gromo
    Улыбнуло))
    PHP:
    1. <?php
    2. if(self::exists($user_id)){
    3.        $db = DatabaseClass::getInstance();
    4. //...................
    5. private static function exists($user_id){
    6.      $db = DatabaseClass::getInstance();
    7.  
    И зачем все эти телодвижения с инстансом DatabaseClass, есло можно один раз в конструкторе вызвать
     
  10. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    alexfer
    Дело вкуса, нет? (В static-методе вызвать конструктором? о боже..)
     
  11. alexfer

    alexfer Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    239
    Симпатии:
    0
    Неа. При чем здесь вкус? Да и статик там нафиг не нужен.
     
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Он прав, $this->db = .. в конструкторе лучше, а еще лучше $this->setDb() в конструкторе и $this->getDb() везде.
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    MiksIr
    Лучше, чем? Может сразу реестр?
     
  14. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Сервис-локаторы не многим лучше Синглтона, но я о другом. Речь об использовании переданного внутри класса.

    Лучше тем, что если захочется перейти на этот самый реестр, или вообще переписать класс для использования вместе с инжекцией зависимостей - придется поправить одно место, где делается setDb вместо путешествия по классу в поисках, где же еще этот db дергается.
     
  15. alexfer

    alexfer Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    239
    Симпатии:
    0
    А зачем геттер? по моему private $db; справиться с этим нормально
    PHP:
    1.  
    2. <?php
    3. $this->db = DatabaseClass::getInstance();
    4. $this->db->query($sql);
    5.  
     
  16. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Это уже долгий холивар. Как минимум сеттер позволит сделать type hinting
    protected function setDb( Db $db ) {
     
  17. alexfer

    alexfer Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    239
    Симпатии:
    0
    MiksIr
    Согласен. Этот вариант рациональнее
     
  18. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    это мой взгляд на вещи, предпочитаю не хранить ссылку на объект БД в объектах других классов.
    тем более, что в оригинале я получаю реестр, где хранится не только объект БД, но и другие данные.

    а здесь лишь привёл часть класса для наглядного примера

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

    я предпочёл сделать единый интерфейс для различных классов баз данных, и через функцию получать
    объект именно того типа базы, который сейчас используется в системе
     
  19. alexfer

    alexfer Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    239
    Симпатии:
    0
    это не правильно
    они не избыточны
    жаль интерфейса не видно....
     
  20. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    неважно. мне не нравится, потому так не делаю :)

    а видеть и не нужно. всё и так гут.

    все классы бд должны поддерживать стандартный sql (на котором собственно и пишутся запросы в бд),
    делать разбор запроса и экранирование переменных, поддерживать набор методов интерфейса
     
  21. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    alexfer, здесь не тот форум, что бы спорить о том, что правильно, а что говнокод, хоть и ООП.