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

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

1. smumrik - 09 Ноября, 2011 - 13:30:11 - перейти к сообщению
Привет! требуется переписать программу php5 на сервер с php4.
основная проблема - паттерн синглтон.
было :
PHP:
скопировать код в буфер обмена
  1.  public static function getDB() {
  2.         if(!self::$db) self::$db=new dbclass;
  3.         return self::$db;
  4.  }

стало:
PHP:
скопировать код в буфер обмена
  1.  function &getDB() {
  2.          static $db;
  3.         if (!isset($db)) {       
  4.         $db = new dbclass;
  5.         }
  6.         return $db;

вызов:
$res = &dbclass::getDB()->qu('SELECT * FROM `table` WHERE `ID`= '.$ID);

не работает. ошибка: Parse error: syntax error, unexpected T_OBJECT_OPERATOR

что еще нужно исправить?
2. OrmaJever - 09 Ноября, 2011 - 16:09:09 - перейти к сообщению
и в какой строке ошибка? Однако
3. smumrik - 09 Ноября, 2011 - 16:48:53 - перейти к сообщению
OrmaJever
в этой: $res = &dbclass::getDB()->qu('SELECT * FROM `table` WHERE `ID`= '.$ID);
разобрался, нужно в скрипте определять объект перед обращением к методам.
$Obj_db = &dbclass::getDB();
а как из других классов к этому объекту обращаться?
(Добавление)
из методов другого класса dbclass::getDB()->query('запрос');
уже не работает.
чем заменить? неужели в каждый метод передавать объект класса БД?
4. smumrik - 09 Ноября, 2011 - 22:19:36 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  class dbclass {
  2.  var $db;
  3.  var $dbid;
  4.  var $query_id;
  5.  var $query_res;
  6.  
  7.  function &getDB() {
  8.         if (!isset($db)) {
  9.                 $db = new dbclass;
  10.         }
  11.         return $db;
  12.  }
  13.  # Подключение к БД
  14. function init($db_name, $db_user_name, $db_user_password)
  15.  {
  16.   $this->dbid = mysql_connect('localhost', $db_user_name, $db_user_password);
  17.   mysql_select_db($db_name, $this->dbid);
  18.  }
  19.  function resnum_qu($qu)
  20.  {
  21.   $this->query_id = mysql_query($qu, $this->dbid);
  22.   $this->num_results = mysql_num_rows($this->query_id);
  23.   return $this->num_results;
  24.  }
  25. //........................................
  26. }
  27.  
  28. class User {
  29.   var $row;
  30.   var $name_group;
  31.   var $row_type;
  32.  var $Objb;
  33.  
  34.   function User($uid) {
  35.    $this->Objb = &dbclass::getDB();
  36.     $row = $this->Objb->resnum_qu("SELECT * FROM `USER` WHERE `ID` = ".$id);
  37.    $this->row = $this->Objb->result();
  38.   }
  39. }
  40.  


$Obj_db = &dbclass::getDB();
$Obj_db->init($db_name, $name, $pass);

$user = new User(1);
выдает ошибку mysql в методе resnum_qu : supplied argument is not a valid MySQL-Link resource
Не понял помогите разобраться что я делаю не так!?
5. OrmaJever - 09 Ноября, 2011 - 23:27:08 - перейти к сообщению
smumrik пишет:
OrmaJever
в этой: $res = &dbclass::getDB()->qu('SELECT * FROM `table` WHERE `ID`= '.$ID);
разобрался, нужно в скрипте определять объект перед обращением к методам.
$Obj_db = &dbclass::getDB();
а как из других классов к этому объекту обращаться?
(Добавление)
из методов другого класса dbclass::getDB()->query('запрос');
уже не работает.
чем заменить? неужели в каждый метод передавать объект класса БД?

я не знаток php4 но подозреваю что там нельзя было обращатся к методам из функции (getDB()->qu()). Из других классов обращается так же как вы написали, нужно вначале присвоить обьект переменой а затем уже с ним работать.
Мето например
PHP:
скопировать код в буфер обмена
  1. $res = &dbclass::getDB()->qu('SELECT * FROM `table` WHERE `ID`= '.$ID);

писать
PHP:
скопировать код в буфер обмена
  1. $ob = &dbclass::getDB();
  2. $res = $ob->qu('SELECT * FROM `table` WHERE `ID`= '.$ID);
6. smumrik - 10 Ноября, 2011 - 10:02:58 - перейти к сообщению
OrmaJever в примере выше у меня так и написано
PHP:
скопировать код в буфер обмена
  1.   function User($uid) {
  2.    $this->Objb = &dbclass::getDB();
  3.     $row = $this->Objb->resnum_qu("SELECT * FROM `USER` WHERE `ID` = ".$id);
  4.    $this->row = $this->Objb->result();
  5.   }

проблема в том, что запрос к БД не идет! тут же resnum_qu из другово объекта вызывается
7. smumrik - 10 Ноября, 2011 - 14:00:13 - перейти к сообщению
блин, как сделать то? неужели передавать объект БД в класс User как параметр Не понял
8. caballero - 10 Ноября, 2011 - 14:29:20 - перейти к сообщению
переписывание на php4 - маразм
поэтому не парься с классами

сделай по дедовски
переменная $connect

и топай к ней через
global $connect
9. smumrik - 10 Ноября, 2011 - 14:51:17 - перейти к сообщению
caballero и что в этой переменной-то?
(Добавление)
вы предлагаете отказаться от ООП и перейти к процедурам?
10. caballero - 10 Ноября, 2011 - 15:38:00 - перейти к сообщению
$connect = mysql_connect('localhost', $db_user_name, $db_user_password);


Цитата:
вы предлагаете отказаться от ООП и перейти к процедурам?


в PHP4 все равно нет нормального ООП и придется переделывать все классы, амперсанды растыкивать там и все такое

опять же речь идет о конкретном месте где ты безуспешно пытаешся изобразить синглетон.

остальное должно более менее работать
11. smumrik - 10 Ноября, 2011 - 16:29:19 - перейти к сообщению
caballero ок, значит буду использовать http://dklab[dot]ru/lib/DbSimple/

 

Powered by ExBB FM 1.0 RC1