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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
pizza
Отправлено: 30 Июня, 2013 - 19:48:38
Post Id


Новичок


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


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




у меня есть много одинаковых классов, у которых одна и таже структура во всех методах:

PHP:
скопировать код в буфер обмена
  1.  
  2. class Example {
  3.  
  4. public function select(){
  5. $dbh = new PDO(DB::$DB, DB::$USER, DB::$PASS);
  6.  
  7. ...дальше идёт sql query...
  8.  
  9. $dbh = null;
  10. }
  11.  
  12. }
  13.  


Как бы унаследовать класс Example (и не только его) от класса DB что бы pdo сам создавался и удалялся, что бы избавиться от повтора в коде. Создать в классе DB __construct() и __destruct() ?

(Отредактировано автором: 30 Июня, 2013 - 19:49:46)

 
 Top
Crate
Отправлено: 30 Июня, 2013 - 19:58:24
Post Id



Посетитель


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


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




Эмм, да. Делаете просто обертку над пдо, в конструкторе подключаетесь, а дальше делаете что хотите.
 
 Top
pizza
Отправлено: 30 Июня, 2013 - 20:12:34
Post Id


Новичок


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


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




Короче, если я унаследую классы типа Example от такого DB, то всё будет протекать как нужно?

PHP:
скопировать код в буфер обмена
  1. class DB {
  2.     public static $DB = 'bla';
  3.     public static $USER = 'bla';
  4.     public static $PASS= 'bla';
  5.    
  6.     public function __construct() {
  7.         $dbh = new PDO(DB::$DB, DB::$USER, DB::$PASS);
  8.     }
  9.    
  10.     public function __destruct() {
  11.         $dbh = null;
  12.     }
  13. }


Я почему спрашиваю, ведь после запроса я должен вернуть result :

PHP:
скопировать код в буфер обмена
  1.  
  2. class Example extends DB{
  3.  
  4. public function select(){
  5.  
  6. $sql = 'SELECT * FROM bla';
  7. $result = $dbh->query($sql);
  8. ...дальше обрабатываем result...
  9. return $result;
  10. }
  11. }
  12.  


Так у меня закроется PDO?
 
 Top
OrmaJever Модератор
Отправлено: 30 Июня, 2013 - 20:49:38
Post Id



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


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


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




pizza Зачем вам класс для класса? Чем вас класс PDO не устроил?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
pizza
Отправлено: 30 Июня, 2013 - 21:04:59
Post Id


Новичок


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


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




OrmaJever пишет:
pizza Зачем вам класс для класса? Чем вас класс PDO не устроил?


Может оставить всё как есть? У меня просто несколько классов User, New, Comment... Везде одна структура:

PHP:
скопировать код в буфер обмена
  1.  
  2. class User{
  3.   public function getAllUsers(){.....}
  4.   public function addUser($data){.....}
  5.   public function deleteUser($id){.....}
  6. }
  7.  
  8. class New{
  9.   public function getAllNews(){.....}
  10.   public function addNews($data){.....}
  11.   public function deleteNews($id){.....}
  12. }
  13.  
  14. class Comment{
  15.   public function getAllComment(){.....}
  16.   public function addComment($data){.....}
  17.   public function deleteComment($id){.....}
  18. }
  19.  


Везде где {...}, я везде повторяю код $dbh = new PDO();.
Может это и нормально, а я пытаюсь изобрести велосипед, пытаясь избежать повтора?
 
 Top
Мелкий Супермодератор
Отправлено: 30 Июня, 2013 - 21:29:21
Post Id



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


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


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




Это не только нормально, но в корне неверно - на любой чих открывать соединение заново.
Используйте, например, singleton.


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 30 Июня, 2013 - 21:35:37
Post Id



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


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


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




ну а что бы прочитав про синглтон вы не пошли писать класс с одним методом, то вот вам пример синглтон функции для mysqli
PHP:
скопировать код в буфер обмена
  1. function mysqli()
  2. {
  3.         static $mysqli;
  4.         if(is_null($mysqli)) {
  5.                 $mysqli = new _mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  6.                 $mysqli->query('SET NAMES utf8');
  7.         }
  8.    return $mysqli;
  9. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
pizza
Отправлено: 30 Июня, 2013 - 21:51:44
Post Id


Новичок


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


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




OrmaJever пишет:
ну а что бы прочитав про синглтон вы не пошли писать класс с одним методом, то вот вам пример синглтон функции для mysqli

Если пока не вдаваться в тонкости pdo и msqli, то получается просто так:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.     class DB {
  3.         public static $DB = 'bla';
  4.         public static $USER = 'bla';
  5.         public static $PASS= 'bla';
  6.        
  7.        function mysqli()
  8.     {
  9.             static $mysqli;
  10.             if(is_null($mysqli)) {
  11.                     $mysqli = new _mysqli(self::$db, self::$user, self::$pass);
  12.                     $mysqli->query('SET NAMES utf8');
  13.             }
  14.        return $mysqli;
  15.     }
  16.     }


И потом в каждом методе просто вызывать:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $dbh = DB::mysqli;
  3.  
 
 Top
vanicon
Отправлено: 30 Июня, 2013 - 21:55:55
Post Id



Частый посетитель


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


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




pizza
Зачем тебе тут класс?
Функции уже нынче не в моде?


-----
Так было, так есть и так будет
 
 Top
pizza
Отправлено: 30 Июня, 2013 - 22:02:51
Post Id


Новичок


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


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




vanicon пишет:
pizza
Зачем тебе тут класс?
Функции уже нынче не в моде?


Я не совсем понял ваш вопрос. Вы про надобность какого класса спрашиваете? Можете просто привести пример с функцией... я только "за".
 
 Top
vanicon
Отправлено: 30 Июня, 2013 - 22:06:32
Post Id



Частый посетитель


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


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




pizza,
OrmaJever уже написал вам функцию, которая может возвращать один объект mysqli, как синглтон, зачем вы делайте из функции метод в ненужном классе DB?

(Отредактировано автором: 30 Июня, 2013 - 22:07:13)



-----
Так было, так есть и так будет
 
 Top
pizza
Отправлено: 30 Июня, 2013 - 22:13:40
Post Id


Новичок


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


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




vanicon пишет:
pizza,
OrmaJever уже написал вам функцию, которая может возвращать один объект mysqli, как синглтон, зачем вы делайте из функции метод в ненужном классе DB?


Ну а куда мне её вставить: за рамки созданного класса c require_once?

Вставляю в класс, потому что хочу потренироваться с классами. Я просто не понимаю какую ошибку я совершаю помещая эту функцию в класс. Класс жрёт память?
 
 Top
OrmaJever Модератор
Отправлено: 30 Июня, 2013 - 23:39:23
Post Id



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


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


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




pizza пишет:
Если пока не вдаваться в тонкости pdo и msqli, то получается просто так:

ммм нет, не получается. Я же написал это просто функция, не нужно её в класс пихать.
pizza пишет:
И потом в каждом методе просто вызывать:

и потом в каждом методе просто писать
PHP:
скопировать код в буфер обмена
  1. mysqli()->query( ... );
  2. //или
  3. mysqli()->error

тоесть функция возвращает просто одит и тот же обьект + функция всегда глобально и не нужно беспокоится за области видимости.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB