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 :: Наследовательность

 PHP.SU

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


 Страниц (2): [1] 2 »   

> Без описания
etoYA
Отправлено: 05 Марта, 2012 - 11:11:09
Post Id



Участник


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


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




есть у меня 1 класс config, сделал его как singleton как сделать, чтобы все остальные классы были наследованы от него, но с возможностью вызывать другие классы.

Как всегда я понял, что сказал какой-то бред, поэтому покажу на примере что я хочу.

PHP:
скопировать код в буфер обмена
  1. class config{
  2. // парсит ini файл, устанавливает новые значение и.т.д
  3. }
  4. class mysql{
  5. // вытаскивает данные из класса config и работает с базой
  6. }
  7. class users{
  8. // методы регистрация,авторизация и.т.д, т.е. тоже работает с базой, но из конфига тоже берет некоторые данные.
  9. }


Какими должны быть классы?
 
 Top
Зверь
Отправлено: 05 Марта, 2012 - 11:51:18
Post Id



Частый гость


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


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




Для чего реализовывать класс как singleton, чтобы потом его наследовать?

(Отредактировано автором: 05 Марта, 2012 - 11:54:40)

 
 Top
etoYA
Отправлено: 05 Марта, 2012 - 13:24:30
Post Id



Участник


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


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




Зверь, я не про это,

config(singleton) в конструкторе класса mysql($this->db = Config::getInstance())

хм. Если я буду, допустим класс users наследоватать от mysql (class users exntends mysql), я смогу использовать $this->методы mysql и $this->conf->методы config?

Вооо, попробовал, то что нужно)).

Т.е config (singleton), а остальные классы наследуются от mysql и можно использовать и mysql и extends)
(Добавление)
Хм.. Странная ошибка:

CODE (htmlphp):
скопировать код в буфер обмена
  1. Notice: Undefined index: login in Z:\home\test.ofc\www\engine\classes\Users.php on line 15
  2.  
  3. Notice: Undefined index: password in Z:\home\test.ofc\www\engine\classes\Users.php on line 16
  4.  
  5. Notice: Undefined index: repeat in Z:\home\test.ofc\www\engine\classes\Users.php on line 17
  6.  
  7. Notice: Undefined index: email in Z:\home\test.ofc\www\engine\classes\Users.php on line 18


Вот строки с ошибками:

PHP:
скопировать код в буфер обмена
  1.  
  2.                 $this->_login = trim(mysql_real_escape_string($_POST['login']));
  3.                 $this->_password = $_POST['password'];
  4.                 $this->_repeat = $_POST['repeat'];
  5.                 $this->_email = $_POST['email'];
  6.  


Вот весь код
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class Users extends MySQL{
  4.         private $_login;
  5.         private $_password;
  6.         private $_repeat;
  7.         private $_email;
  8.         private $_error = false;
  9.         private $_errorm;
  10.        
  11.         function __destruct(){
  12.                 $this->close();
  13.         }
  14.         function singup(){
  15.                 $this->connect();
  16.                 $this->_login = trim(mysql_real_escape_string($_POST['login']));
  17.                 $this->_password = $_POST['password'];
  18.                 $this->_repeat = $_POST['repeat'];
  19.                 $this->_email = $_POST['email'];
  20.                
  21.                 if (isset($_POST['singup'])){
  22.                         if (empty($this->_login)){
  23.                                 $this->_error = true;
  24.                                 $this->_errorm .= '<pre>Незаполнено поле логин</pre>';
  25.                         }
  26.                         if (empty($this->_password)){
  27.                                 $this->_error = true;
  28.                                 $this->_errorm .= '<pre>Незаполнено поле пароль</pre>';
  29.                         }
  30.                         elseif ($this->_password != $this->_repeat){
  31.                                 $this->_error = true;
  32.                                 $this->_errorm .= '<pre>Введенные пароли не совпадают</pre>';
  33.                         }
  34.                         if (empty($this->_email)){
  35.                                 $this->_error = true;
  36.                                 $this->_errorm .= '<pre>Незаполнено поле емейл</pre>';
  37.                         }
  38.                         if (!preg_match('/[a-z,A-Z, 0-9]/',$this->_login) OR strlen($this->_login) < 2 OR strlen($this->_login) > 16){
  39.                                 $this->_error = true;
  40.                                 $this->_errorm .= '<pre>Логин может быть от 4 до 16 символов и содержать англ. буквы и символы</pre>';                 
  41.                         }
  42.                         if (!preg_match('/[a-z,A-Z, 0-9]/',$this->_password) OR strlen($this->_password) < 2 OR strlen($this->_password) > 16){
  43.                                 $this->_error = true;
  44.                                 $this->_errorm .= '<pre>Пароль может быть от 4 до 16 символов и содержать англ. буквы и символы</pre>';                
  45.                         }
  46.                         elseif (!filter_var($this->_email, FILTER_VALIDATE_EMAIL)){
  47.                                 $this->_error = true;
  48.                                 $this->_errorm .= '<pre>Введен не корректный емейл</pre>';                     
  49.                         }
  50.                         $db->query("SELECT `login` FROM `users` WHERE `login` = $this->_login LIMIT 1");
  51.                         if ($this->num_rows() > 0){
  52.                                 $this->_error = true;
  53.                                 $this->_errorm .= 'Пользователь с логином <b>'.$this->_login.'</b> уже сущевсвтует';                           
  54.                         }
  55.                         if ($this->_error == false){
  56.                                 $this->_password = md5($this->_password);
  57.                                 $db->query("INSERT INTO `users` (`login`,`password`,`email`,`group`) VALUES('$this->_login','$this->_password','$this->_email','user')");
  58.                         }
  59.                         else echo $_errorm;
  60.                 }
  61.                 @require_once('html/singup.html');
  62.         }
  63. }
  64. ?>
  65.  

(Отредактировано автором: 05 Марта, 2012 - 13:28:01)

 
 Top
digi
Отправлено: 05 Марта, 2012 - 14:10:06
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


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




а если не mysql бд будет? ;)

присмотритесь к http_://fabien.potencier.org/article/62/create-your-own-framework-on-top-of-the-symfony2-components-part-12
 
 Top
etoYA
Отправлено: 05 Марта, 2012 - 14:11:18
Post Id



Участник


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


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




digi,дак я делаю для себя )). Бд будет 100% майскл, да и других я незнаю пока)
 
 Top
caballero
Отправлено: 05 Марта, 2012 - 14:19:15
Post Id


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


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


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




ты на каждого юзера будешь свой коннект открывать?

а если не создавать экземполяры юзеров и дергать статические функции то ООП тут и не пахнет


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
etoYA
Отправлено: 05 Марта, 2012 - 14:43:10
Post Id



Участник


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


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




caballero, хм.. Немного не понял, при регистрации соединение открывается, после регистрации закрывается.
 
 Top
caballero
Отправлено: 05 Марта, 2012 - 15:09:25
Post Id


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


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


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




у тебя клас User это что вообще?
если он инкапсулирует юзера то на трех юзеров там будет три конекта к БД.
А если класс - просто собрание функций для работы с БД то ООП это можно назвать с большрй натяжкой/

Не понимаю почему все начинающие изучать ООП норовят создать некий класс работы с БД и наследовать от него классы сушностей.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
etoYA
Отправлено: 05 Марта, 2012 - 17:26:07
Post Id



Участник


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


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




caballero пишет:
А если класс - просто собрание функций для работы с БД то ООП это можно назвать с большрй натяжкой/

Скорей так). Но я лучше попробую сделать модулями
(Добавление)
И все же, что это за ошибка? Типо переменная не установлена, но как это может быть?!
 
 Top
DeepVarvar Супермодератор
Отправлено: 05 Марта, 2012 - 19:15:09
Post Id



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


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


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




etoYA пишет:
Странная ошибка

Цитата:
Undefined index: login

Ничего странного - нужно обязательно проверять переменную на наличие её,
или ключ в массиве на его наличие.
Если массив $_POST пустой, то и будет такая ошибка.
etoYA пишет:
попробую сделать модулями
Модулями чего и кого?
Мускуль - это одна сущность.
Юзер - другая.
Шаблон - третья.
Контроллер - четвертая.
Роутер - пятая.
и т.д....
НО!!! Ни один из них не наследует мускуль!
Зачем?
Они просто используют его API и все.
 
 Top
Okula
Отправлено: 05 Марта, 2012 - 19:29:52
Post Id



Участник


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


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




Зачем наследовать интерфейсы для работы с бд, в них и так достаточно методов для решения различных задач.
Еслиуж так хочется применить запрос внутри метода друго класса можно передать ссыку на соединение либо в аргументе, либо через статический метод класса на основе шаблона Singleton.
 
 Top
caballero
Отправлено: 05 Марта, 2012 - 19:42:25
Post Id


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


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


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




наследовать есть смысл если используется паттерн Active Record


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
etoYA
Отправлено: 05 Марта, 2012 - 22:00:12
Post Id



Участник


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


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




Я вас не понимаю)) Вот мой говнокод)
Классы

Config.php (Отобразить)

MySQL.php (Отобразить)

Template.php (Отобразить)

Users.php (Отобразить)

И index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. ini_set('display_errors',1);
  4.  
  5. function __autoload($class){
  6.         require_once('engine/classes/'.$class.'.php');
  7. }
  8. $tmp = new Template;
  9. $tmp->load('default');
  10. ?>
  11.  


Скажите как делать нельзя, как делать нужно(и лучше).

(Отредактировано автором: 05 Марта, 2012 - 22:01:35)

 
 Top
Bio man
Отправлено: 05 Марта, 2012 - 22:53:20
Post Id


Постоянный участник


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


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




etoYA, почитайте "Философия Java". там очень хорошо описано ООП. сам щас читаю, очень понравилась книга. есть 2 понятия - "похоже" и "является".
первый это когда класс потомок определяет новые методы,
второе это когда класс потомок перегружает методы класса родителя.

(Отредактировано автором: 05 Марта, 2012 - 22:54:05)

 
 Top
etoYA
Отправлено: 06 Марта, 2012 - 01:54:16
Post Id



Участник


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


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




Все таки решил попробовать сделать модули типа: Регистраций и.т.д в отдельном файле и в процедурном стиле, имхо так удобней. Выглядит это как то так

PHP:
скопировать код в буфер обмена
  1.  
  2. $db = new MySQL();
  3. $db->connect();
  4.  
  5. $error = false;
  6. $errorm = '';
  7.  
  8. if ($_POST['singup']){
  9.         $login = $_POST['login'];
  10.         $pass = $_POST['pass'];
  11.         $repeat = $_POST['repeat'];
  12.         $email = $_POST['email'];
  13.        
  14.         if (empty($login)){
  15.                 $error = true;
  16.                 $errorm .= '<pre>Введите логин</pre>';
  17.         }
  18.         elseif (!preg_match('/^[-a-zA-Z0-9]{2,16}+$/', $login)){
  19.                 $error = true;
  20.                 $errorm .= '<pre>Логин может содержать только англ. буквы и цифры, и быть не от 2 до 16 символов</pre>';
  21.         }
  22.         if (empty($pass)){
  23.                 $error = true;
  24.                 $errorm .= '<pre>Введите пароль</pre>';
  25.         }
  26.         elseif (!preg_match('/^[-a-zA-Z0-9]{4,16}+$/', $pass)){
  27.                 $error = true;
  28.                 $errorm .= '<pre>Пароль может содержать только англ. буквы и цифры, и быть не от 2 до 16 символов</pre>';
  29.         }
  30.         elseif ($repeat != $pass){
  31.                 $error = true;
  32.                 $errorm .= '<pre>Пароли не совпадают</pre>';
  33.         }
  34.         if (empty($email)){
  35.                 $error = true;
  36.                 $errorm .= '<pre>Введите емейл</pre>';
  37.         }
  38.         elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)){
  39.                 $error = true;
  40.                 $errorm .= '<pre>Введите корректный емейл</pre>';
  41.         }
  42.         $db->query("SELECT `login` FROM `users` WHERE `login` = '{$login}' LIMIT 1");
  43.         if ($db->num_rows() > 0){
  44.                 $error = true;
  45.                 $errorm .= "<pre>Пользователь с логином <b>$login</b> уже существует</pre>";           
  46.         }
  47.         if ($error == false){
  48.                 $pass = md5($pass);
  49.                 $db->query("INSERT INTO `users` (`login`,`password`,`email`,`group`) VALUES('$login','$pass','$email','user')");
  50.                 if ($db->query) echo 'Регистрация прошла успешно';
  51.                 $db->close();
  52.         }
  53.         else echo $errorm;
  54. }
  55. require_once($_SERVER['DOCUMENT_ROOT'].'/forms/singup.html');
  56.  


Но сразу же 2 вопроса:

0. Так делать можно? Т.е. смешивать ООП и процедурный стиль?
1. Как проверить на успешность MySQL запроса? (добавить метод mysql_affected_rows() ?) Или сделать публичный $_query?
2. Если я сделать в виде контроллера обычную switch case конструкцию будет нормально? Смогу ли я нормально прикрутить ЧПУ? Или есть другие варианты не меняя моего кода

(Отредактировано автором: 06 Марта, 2012 - 01:59:42)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB