Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ООП пытаюсь писать [3]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): « 1 2 [3] 4 5 »   

> Описание: Посмотрите, это ООП или ГК...?
Hapson
Отправлено: 25 Июля, 2013 - 19:56:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
Цитата:
Я еще ничего сам не написал. Я пишу первый блог, зачем мне брать готовое. Мне нужно самому что-то делать.



так пишите то что касается вашего функционала. Какое отношение к этому имеет работа с БД?

вы ж не пишете собственные функции PHP вместо готовых.

Ну как же?
Сохранить статью, сохранить комментарий, зарегистрировать пользователя, показать статьи, комментарии, рейтинги.............
У блога ведь есть БД


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июля, 2013 - 20:18:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Hapson пишет:
У блога ведь есть БД
При достаточном уровне абстракции тебя вообще не должно волновать что там, БД или файлы, или еще какое друое хранилище..
 
 Top
Hapson
Отправлено: 25 Июля, 2013 - 20:44:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


DeepVarvar
Ну вот например класс Users. Метод регистрации должен быть в нем же, или нет? Метод просмотра списка пользователей, изменение профиля.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
esterio
Отправлено: 25 Июля, 2013 - 21:22:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




DeepVarvar пишет:
При достаточном уровне абстракции тебя вообще не должно волновать что там, БД или файлы, или еще какое друое хранилище..

Поддерживаю
(Добавление)
EuGen пишет:
могу сказать лишь то, что нельзя понять объектный подход, пытаясь рассматривать лишь реализацию

Ето и есть ответ на Ваш вопрос. Тоесть думать нужно не реализацией, а интерфейсами
 
 Top
caballero
Отправлено: 25 Июля, 2013 - 21:48:41
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Ну вот например класс Users. Метод регистрации должен быть в нем же, или нет? Метод просмотра списка пользователей, изменение профиля.


только не метод просмотра а метод возвращающий список пользователей

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

изменения профиля - обычный метод класса который записывает себя в БД.

регистрация как правило не делается одним методом
есть метод проверки на валидность и метод опять же записи в БД

вообще рекомендую вам посмотреть в сторону паттерна Active record


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 29 Июля, 2013 - 11:29:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
вообще рекомендую вам посмотреть в сторону паттерна Active record

Вроде начал понимать...
Начал писать класс Users.
Пока написал метод авторизации. Вообще идея такая, к примеру авторизация:

PHP:
скопировать код в буфер обмена
  1. //сам класс (не дописан)
  2. <?PHP
  3. class Users{
  4.         public $online = false;
  5.        
  6.         function __construct($option, $user_data){
  7.                 switch($option){
  8.                         case 'auth': $this->authUser($user_data); break;
  9.                         case 'new': $this->newUser($user_data); break;
  10.                         case 'update': $this->updateUserData($user_data); break;
  11.                 }
  12.         }
  13.        
  14.         private function authUser($user_data){
  15.                 if(is_array($user_data) && count($user_data) == 2){
  16.                         if($user_data['email'] != '' && $user_data['password'] != ''){
  17.                                 $sql = "SELECT `id_user`, `email`, `password`, `diff`, `role`, `status`, `name`, `avatar`, `date_reg`, `last_entry`, `sex`, `city`, `age`
  18.                                         FROM `". DB_PREFIX ."users`
  19.                                         WHERE email = {?}";
  20.                                 $db = DB::getDB();
  21.                                 $user = $db->selectArray($sql, array($user_data['email']));
  22.                                 if($user){
  23.                                         if($this->compare($user_data['password'], $user['password'], $user['diff'])){
  24.                                                 switch((int)$user['status']){
  25.                                                         case 1:
  26.                                                                 $date = date("Y-m-d H:i:s");
  27.                                                                 $sql = "UPDATE `". DB_PREFIX ."users` SET last_entry = {?} WHERE id_user = {?}";
  28.                                                                 $db = DB::getDB();
  29.                                                                 $update = $db->mixedQuery($sql, array($date, $user['id_user']));
  30.                                                                 $this->online = true;
  31.                                                                 $key = array('hash', 'id_user', 'role', 'name', 'avatar', 'date_reg', 'last_entry', 'sex', 'city', 'age');
  32.                                                                 $val = array(md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']), $user['id_user'], $user['role'], $user['name'], $user['avatar'], $user['date_reg'], $date, $user['sex'], $user['city'], $user['age']);
  33.                                                                 $_SESSION = array_combine($key, $val);
  34.                                                                 if(isset($_POST['remember']) && $_POST['remember'] == 'on'){
  35.                                                                         setcookie('mycookie', $user['password'], time() + 14*24*60*60);
  36.                                                                 }
  37.                                                                 //$this->redirect();
  38.                                                 }
  39.                                         }else{
  40.                                                 //неверные данные
  41.                                                 $this->redirect('incorrect');
  42.                                         }
  43.                                 }else{
  44.                                         //неверные данные
  45.                                         $this->redirect('incorrect');
  46.                                 }
  47.                         }else{
  48.                                 //заполнены не все поля
  49.                                 $this->redirect('empty_field');
  50.                         }
  51.                 }
  52.                 if(is_array($user_data) && count($user_data) == 1){
  53.                         if(strlen((string)$user_data['mycookie']) == 32){
  54.                                 $sql = "SELECT `id_user`, `email`, `password`, `diff`, `role`, `status`, `name`, `avatar`, `date_reg`, `last_entry`, `sex`, `city`, `age`
  55.                                         FROM `". DB_PREFIX ."users`
  56.                                         WHERE `password` = {?}";
  57.                                 $db = DB::getDB();
  58.                                 $user = $db->selectArray($sql, array($user_data['mycookie']));
  59.                                 if($user){
  60.                                         switch((int)$user['status']){
  61.                                                 case 1:
  62.                                                         $this->online = true;
  63.                                                         $key = array('hash', 'id_user', 'role', 'name', 'avatar', 'date_reg', 'last_entry', 'sex', 'city', 'age');
  64.                                                         $val = array(md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']), $user['id_user'], $user['role'], $user['name'], $user['avatar'], $user['date_reg'], $user['last_entry'], $user['sex'], $user['city'], $user['age']);
  65.                                                         $_SESSION = array_combine($key, $val);
  66.                                         }
  67.                                 }else{
  68.                                         setcookie('mycookie', "", time() - 14*24*60*60);
  69.                                         $this->redirect();
  70.                                 }
  71.                         }else{
  72.                                 setcookie('mycookie', "", time() - 14*24*60*60);
  73.                                 $this->redirect();
  74.                         }
  75.                 }
  76.         }
  77.        
  78.         private function compare($pass_form, $pass, $diff){
  79.                 $compare = md5(md5($pass_form) . $diff);
  80.                 if($compare == $pass){
  81.                         return true;
  82.                 }else{
  83.                         return false;
  84.                 }
  85.         }
  86.        
  87.         private function newUser(){
  88.                
  89.         }
  90.        
  91.         private function updateUserData(){
  92.                
  93.         }
  94.        
  95.         private function redirect($error = false){
  96.                 if($error){
  97.                         header('Location: '. SITE_URL .'/index.php?error='. $error);
  98.                         exit;
  99.                 }else{
  100.                         header('Location: '. SITE_URL);
  101.                         exit;
  102.                 }
  103.                
  104.         }
  105. }
  106.  
  107. //это кусочек кода из модуля авторизации
  108. $data = array("email" => $_POST['email'], "password" => $_POST['password']);
  109. $user = new Users("auth", $data);
  110. if($user->online){
  111.     //авторизован
  112. }else{
  113.     //не авторизован
  114. }
  115. ?>
  116.  


А это класс для запросов

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class DB{
  3.         private static $db = null;
  4.         private $id;
  5.         private $sym = "{?}";
  6.        
  7.         static function getDB(){
  8.                 if(self::$db == null){
  9.                         self::$db = new DB();
  10.                 }
  11.                 return self::$db;
  12.         }
  13.        
  14.         private function __construct(){
  15.                 $this->id = new mysqli(DB_SERVER, DB_LOGIN, DB_PASSWORD, DB_NAME) or die ();
  16.                 if(mysqli_connect_error()){
  17.                         $error = date("Y.m.d H:i") ."\n\tFile: ". __FILE__ ."\n\tClass/Method: ". __METHOD__ ."\n\tError Connect DB: ". mysqli_connect_error() ."\n";
  18.                         Logger::printLog($error);
  19.                         //вывод страницы с ошибкой. БД нет - делов не будет
  20.                         exit;
  21.                 }else{
  22.                         $this->id->query("SET lc_time_names = 'ru_RU'");
  23.                         $this->id->set_charset("utf8");
  24.                 }
  25.         }
  26.        
  27.         private function replace($sql, $param){
  28.                 if($param){
  29.                         for($i = 0; $i < count($param); $i++){
  30.                                 $pos = strpos($sql, $this->sym);
  31.                                 $val = "'". $this->id->real_escape_string($param[$i]) ."'";
  32.                                 $sql = substr_replace($sql, $val, $pos, strlen($this->sym));
  33.                         }
  34.                 }
  35.                 return $sql;
  36.         }
  37.        
  38.         private function arrayAssoc($object){
  39.                 $result = array();
  40.                 while(($array = $object->fetch_assoc()) != false){
  41.                         $result[] = $array;
  42.                 }
  43.                 return $result;
  44.         }
  45.         /*
  46.         **      Public functions
  47.         */
  48.         function selectTwoArray($sql, $param = false){
  49.                 $result = $this->id->query($this->replace($sql, $param));
  50.                 if($result){
  51.                         return $this->arrayAssoc($result);
  52.                 }else{
  53.                         $error = date("Y.m.d H:i") ."\n\tFile: ". __FILE__ ."\n\tClass/Method: ". __METHOD__ ."\n\tError Query: ". $this->id->error ."\n";
  54.                         Logger::printLog($error);
  55.                         return false;
  56.                 }
  57.         }
  58.        
  59.         function selectArray($sql, $param = false){
  60.                 $result = $this->id->query($this->replace($sql, $param));
  61.                 if($result){
  62.                         if($result->num_rows == 1){
  63.                                 return $result->fetch_assoc();
  64.                         }else{
  65.                                 return false;
  66.                         }
  67.                 }else{
  68.                         $error = date("Y.m.d H:i") ."\n\tFile: ". __FILE__ ."\n\tClass/Method: ". __METHOD__ ."\n\tError Query: ". $this->id->error ."\n";
  69.                         Logger::printLog($error);
  70.                         return false;
  71.                 }
  72.         }
  73.        
  74.         function selectOneValue($sql, $param = false){
  75.                 $result = $this->id->query($this->replace($sql, $param));
  76.                 if($result){
  77.                         $array = $result->fetch_assoc();
  78.                         if($result->num_rows == 1 && count($array) == 1){
  79.                                 return $value = array_shift($array);
  80.                         }else{
  81.                                 return false;
  82.                         }
  83.                 }else{
  84.                         $error = date("Y.m.d H:i") ."\n\tFile: ". __FILE__ ."\n\tClass/Method: ". __METHOD__ ."\n\tError Query: ". $this->id->error ."\n";
  85.                         Logger::printLog($error);
  86.                         return false;
  87.                 }
  88.         }
  89.        
  90.         function mixedQuery($sql, $param = false){
  91.                 $result = $this->id->query($this->replace($sql, $param));
  92.                 if($this->id->affected_rows >= 0){
  93.                         return $this->id->affected_rows;
  94.                 }else{
  95.                         $error = date("Y.m.d H:i") ."\n\tFile: ". __FILE__ ."\n\tClass/Method: ". __METHOD__ ."\n\tError Query: ". $this->id->error ."\n";
  96.                         Logger::printLog($error);
  97.                         return false;
  98.                 }
  99.         }
  100.        
  101.         function __destruct(){
  102.                 if($this->id){
  103.                         $this->id->close();
  104.                 }
  105.         }
  106. }
  107. ?>


То есть авторизация в одном методе. Проверка и по форме и по куке.
Как-то так вообщем...


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 29 Июля, 2013 - 12:28:28
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




авторазиция обычно делается статическим методом потому как по логике на связана и с каким экмепляром.

для работы с Бд лучше взять готовые решения. PDO например если уж хочется ООП


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 29 Июля, 2013 - 13:09:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
авторазиция обычно делается статическим методом потому как по логике на связана и с каким экмепляром.

для работы с Бд лучше взять готовые решения. PDO например если уж хочется ООП


Я наверное что-то не понимаю. Ну из примеров: кролик - экземпляр класса зверей, кролик живой или дохлый - свойство экземпляра класса зверей, кролик кролик залезает в нору, если вход не привалило булыжником - метод экземпляра.

Юзер - экземпляр класса пользователей. Юзер online или offline - свойство юзера. Юзер входит на сайт, если пустят - метод.

Есть какое-то принципиальное отличие между:
$user = new Users("auth", $data);
$user = Users::authUser($data);


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Contr
Отправлено: 29 Июля, 2013 - 13:26:49
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Hapson, лови ответ:
http://www[dot]youtube[dot]com/watch?v=Aw28-krO7ZM
Там шесть уроков, я делал так: просмотрел - пауза - повторил, пока не становится понятно


Отредактировано администратором: EuGen, 29 Июля, 2013 - 13:28:57
 
 Top
caballero
Отправлено: 29 Июля, 2013 - 14:27:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
кролик - экземпляр класса зверей,

кролик - экземпляр класса кролик.

Цитата:
Юзер - экземпляр класса пользователей. Юзер online или offline - свойство юзера. Юзер входит на сайт, если пустят - метод.

мы проверяем юзера на существование такого экземпляра а не проверяем признак (офлайн или нет) конкретного экземпляра


Цитата:
Есть какое-то принципиальное отличие между:
$user = new Users("auth", $data);
$user = Users::authUser($data);

второй метод не может относится ни к какому екземпляру.

Цитата:

Hapson, лови ответ:

это не ответ потомму как мы не обсуждаем MVC. Не говоря о том что это лисное видение конкретного автора, не более того.

(Отредактировано автором: 29 Июля, 2013 - 14:28:44)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 29 Июля, 2013 - 14:45:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
мы проверяем юзера на существование такого экземпляра а не проверяем признак (офлайн или нет) конкретного экземпляра

Хорошо, тогда метод обновления/удаления пользователя приватный и не статический?
А метод регистрации? Тоже наверное не статический и приватный?

Тогда и свойство $online не нужно? Метод авторизации просто вернет true или false:

PHP:
скопировать код в буфер обмена
  1. $data = array("name" => $_POST['name'], "password" => $_POST['password']);
  2. if(Users::authUser($data)){
  3.     $auth = true;
  4. }else{
  5.     $auth = false;
  6. }
  7. //или просто
  8.  
  9. $auth = Users::authUser($data);
  10.  


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 29 Июля, 2013 - 15:20:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Хорошо, тогда метод обновления/удаления пользователя приватный и не статический?

удаления - тоже статический - екемпляр не может себя удалитть.
нестатические методы - те которые предназначены для работы с атрибутами (полями)екземпляра.

те которые манипулируют екземплярами - должны быть статическими.
Теоретически - статические методы юзера должны относится к какому то классу типа фабрики или менеджера юзеров. но использование статических методов в самом классе упрощает структуру. Кроме того статические методы имеют доступ к приватным полям екземпляра что то же удобно при инициализации например

Цитата:
Тогда и свойство $online не нужно? Метод авторизации просто вернет true или false:

да
или он может вернуть уже готовый екземпляр юзера если удачно или null если не удачно.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 29 Июля, 2013 - 15:31:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
Цитата:
Хорошо, тогда метод обновления/удаления пользователя приватный и не статический?

удаления - тоже статический - екемпляр не может себя удалитть.
нестатические методы - те которые предназначены для работы с атрибутами (полями)екземпляра.

те которые манипулируют екземплярами - должны быть статическими.
Теоретически - статические методы юзера должны относится к какому то классу типа фабрики или менеджера юзеров. но использование статических методов в самом классе упрощает структуру. Кроме того статические методы имеют доступ к приватным полям екземпляра что то же удобно при инициализации например

Цитата:
Тогда и свойство $online не нужно? Метод авторизации просто вернет true или false:

да
или он может вернуть уже готовый екземпляр юзера если удачно или null если не удачно.


Угу, теперь понятно.
Я вот еще что не пойму.
После удачной авторизации пользователя я записываю в $_SESSION почти все свойства пользователя, кроме email и password, чтобы потом не дергать БД. А вот если я в классе сделаю свойства идентичные полям в таблице пользователей и при удачной авторизации буду записывать в эти свойства значения. По окончании кода мне будут доступны эти свойства? Ведь объект уничтожается по окончании кода.
К примеру пользователь авторизовался, я перезапросил страницу, дабы избавиться от $_POST, и хочу вывести приветствие.



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 29 Июля, 2013 - 15:42:27
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




запихиваете екземпляр в сессию и все дела


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 29 Июля, 2013 - 17:44:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
запихиваете екземпляр в сессию и все дела

Эмммм... то есть так:

PHP:
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3. <title>Test User Class</title>
  4. <meta http-equiv="Content-Language" content="ru" />
  5. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  6. </head>
  7. <style type="text/css">
  8.         html{background: #fff;}
  9.         body{width: 800px; margin: 20px auto; background: #ddd; padding: 20px; border: 1px solid}
  10. </style>
  11. <?PHP
  12. class Users{
  13.         private $name;
  14.         private $password;
  15.         function __construct($data){
  16.                 $this->name = $data['name'];
  17.                 $this->password = $data['password'];
  18.                 $_SESSION = $this;
  19.         }
  20.         function getUser($val){
  21.                 return $this->$val;
  22.         }
  23. }
  24. ?>
  25. <body>
  26.         <?PHP
  27.         $data = array("name" => $_POST['name'], "password" => $_POST['password']);
  28.         $user = new Users($data);
  29.         echo $_SESSION->getUser("name") ."<br>";
  30.         echo $_SESSION->getUser("password");
  31.         ?>
  32.         <form action="<?PHP $_SERVER['PHP_SELF'] ?>" method="post">
  33.                 Neme:<br>
  34.                 <input type="text" name="name" value="Вася"><br>
  35.                 Password:<br>
  36.                 <input type="text" name="password" value="1234"><br>
  37.                 <input type="submit" value="GO"><br>
  38.         </form>
  39. </body>
  40. </html>


А может лучше сляпать массив со свойствами и уже его записать в сессию?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Страниц (5): « 1 2 [3] 4 5 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB