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
Форумы портала PHP.SU :: Версия для печати :: обращение к методам класса БД
Форумы портала PHP.SU » » Объектно-ориентированное программирование » обращение к методам класса БД

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

1. smumrik - 11 Октября, 2011 - 21:52:56 - перейти к сообщению
Привет. начал изучать ООП, пишу небольшой скрипт...
есть класс для работы с БД

PHP:
скопировать код в буфер обмена
  1. class dbclass {
  2.  var $dbid;
  3. .........
  4.  
  5.  # Подключение к БД
  6. function init($db_name, $db_user_name, $db_user_password)
  7.  {
  8.   $this->dbid = mysql_connect('localhost', $db_user_name, $db_user_password);
  9.   mysql_select_db($db_name, $this->dbid);
  10.  }
  11.  # Выполнение запроса
  12. function qu($qu)
  13.  {
  14.     if(!$this->query_id=mysql_query($qu, $this->dbid)) return $this->error();
  15.     return $this->query_id;
  16.  }
  17. .......итд
  18.  


и еще один класс
PHP:
скопировать код в буфер обмена
  1. class User {
  2.  var $row;
  3.  function __construct($uid) {
  4.          if($db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
  5.          else $this->row = $db->result();
  6.   }


В коде создаю сначала объект класса БД
PHP:
скопировать код в буфер обмена
  1. $db = new dbclass;
  2. $db->init($db_name, $db_user_name, $db_user_pass);

далее пытаюсь создать класс пользователя
$USER = new User("1");
и получаю ошибку Call to a member function resnum_qu() on a non-object

догадываюсь, что проблема в том, что класс пользователя "не видит" класс БД.

вопрос: как лучше реализовать программу? наследовать класс БД?
2. Мелкий - 11 Октября, 2011 - 21:56:56 - перейти к сообщению
smumrik пишет:
наследовать класс БД?

Ни в коем случае.

smumrik пишет:
как лучше реализовать программу?

Паттерн Singleton обычно используется.

Ну и плюс имена методов разные - resnum_qu и qu
3. OrmaJever - 11 Октября, 2011 - 22:03:06 - перейти к сообщению
smumrik пишет:
function __construct($uid) {
if($db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
else $this->row = $db->result();
}

такк... откуда берётся $db? А неоткуда! Потомучто нужно передавать либо параметром либо через global ну или создавать обьект внутри контруктора
4. smumrik - 11 Октября, 2011 - 22:06:22 - перейти к сообщению
Мелкий
почитал в википедии http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
ничего не понял, можно подробней?
или все таки прочитать книгу «Приемы объктно-ориентированного проектирования. Паттерны проектирования», Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссилес
нужно?
(Добавление)
OrmaJever пишет:
такк... откуда берётся $db? А неоткуда! Потомучто нужно передавать либо параметром либо через global ну или создавать обьект внутри контруктора

а какой вариант более удачный?
мне кажется, что внутри конструктора создавать объет БД неудачный вариант Однако
(а если у меня тысяча объектов, то что и тысяча объектов класса БД что ли)
(Добавление)
а как передать параметром? да и что передавать? объект класса БД в конструктор класса USER? Однако
5. OrmaJever - 11 Октября, 2011 - 22:26:28 - перейти к сообщению
Вспомнил ещё один вариант
PHP:
скопировать код в буфер обмена
  1. class User {
  2.   public $db; // хотя можно и private, и через конструктор инстализировать
  3.  var $row;
  4.  function __construct($uid) {
  5.          if($this->db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return ''; //теперь обращение  $this->db->*
  6.          else $this->row = $db->result();
  7.   }

(Добавление)
ах забыл написать
PHP:
скопировать код в буфер обмена
  1. $db = new dbclass;
  2. $db->init($db_name, $db_user_name, $db_user_pass);
  3. $user = new user(/* ... */);
  4. $user->db = $db; // а ещё лутше написать так $user->db = &$db;  
  5. // но это взависимоти от ситуации
  6. // дальше как нужно
6. Мелкий - 11 Октября, 2011 - 22:34:38 - перейти к сообщению
smumrik пишет:
нужно?

Нужно, если хотите развиваться в направлении программирования. Правда я сам ещё не осилил эту книгу.

smumrik пишет:
ничего не понял, можно подробней?

Например, мой класс для мелких проектов:
Спойлер (Отобразить)


Соответственно, в месте, где нужно выполнить запрос:
PHP:
скопировать код в буфер обмена
  1. DB::singleton()->query($sql);

Класс dbresult просто для удобства абстрагирования, да реализует несколько хороших интерфейсов.
7. smumrik - 11 Октября, 2011 - 22:37:25 - перейти к сообщению
OrmaJever
а так

PHP:
скопировать код в буфер обмена
  1.  function __construct($uid, $db) {
  2.  
  3.          if($db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
  4.          else $this->row = $db->result();.......


$USER = new User(2, $db);
echo $USER->row["ID"];
неудачный вариант?
8. White - 11 Октября, 2011 - 22:40:40 - перейти к сообщению
smumrik пишет:
function __construct($db,$id) {

$USER = new User($db,1);
так конечно работать будет, но это плохой вариант. решается проблема либо синглтоном, либо статическими методами самого dbclass. можно сделать так в классе dbclass

PHP:
скопировать код в буфер обмена
  1. class dbclass {
  2.   public static $con;
  3.  
  4.   private function __construct() {}
  5.  
  6.   public static function init($db_name, $db_user_name, $db_user_password) {
  7.     if(!self::$con) self::$con=new dbclass;
  8.     self::$con->dbid = mysql_connect('localhost', $db_user_name, $db_user_password);
  9.     mysql_select_db($db_name, self::$con->dbid);
  10.  }
  11.  
  12. ...
  13. }
  14. dbclass::init($db_name, $db_user_name, $db_user_pass);
  15.  
  16. class User {
  17.   public $row;
  18.   function __construct($uid) {
  19.     if(dbclass::$con->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
  20.     else $this->row = dbclass::$con->result();
  21.   }
  22. }
  23.  
  24. $user = new User(1);
  25. echo $user->row["ID"];
9. caballero - 11 Октября, 2011 - 22:42:39 - перейти к сообщению
Цитата:
$USER = new User(2, $db);
echo $USER->row["ID"];
неудачный вариант?

так присвой хотябы внуьренней переменной эту $db
следующий метод как вызывать будешь? Ссылка то локальная
10. smumrik - 11 Октября, 2011 - 22:47:55 - перейти к сообщению
OrmaJever
PHP:
скопировать код в буфер обмена
  1. class User {
  2.   public $db; // хотя можно и private, и через конструктор инстализировать
  3.  var $row;
  4.  function __construct($uid) {
  5.          if($this->db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return ''; //теперь обращение  $this->db->*
  6.          else $this->row = $db->result();
  7.   }
  8.  
  9. $db = new dbclass;
  10. $db->init($db_name, $db_user_name, $db_user_pass);
  11. $user = new user(/* ... */);
  12. $user->db = $db;


не работает, ведь при создании объекта $user = new user(); $db туда не передается
11. caballero - 11 Октября, 2011 - 22:56:14 - перейти к сообщению
и что что не передается

ты ж сам присваиваешь
$user->db = $db;
12. smumrik - 11 Октября, 2011 - 23:00:33 - перейти к сообщению
caballero но это же уже после создания объекта!
в момент создания объекта $this->db в классе пустая же
13. caballero - 11 Октября, 2011 - 23:01:40 - перейти к сообщению
Цитата:
в момент создания объекта $this->db в классе пустая же

И какая проблемма?
14. smumrik - 11 Октября, 2011 - 23:07:37 - перейти к сообщению
caballero пишет, что нет такого объекта
15. caballero - 11 Октября, 2011 - 23:13:57 - перейти к сообщению
где в каком месте пишет
и о каком объекте речь
кто обращается к этому объекту в каком месте?

 

Powered by ExBB FM 1.0 RC1