2010-05-05 1 views
0

Хорошо, это так странно !!! Я запускаю PHP Version 5.1.6, когда я пытаюсь запустить код ниже, он дает фатальную ошибку для объекта, который не был создан. Как только я прокомментирую эту строку кода // $ cb_db = new cb_db (USER, PASSWORD, NAME, HOST); все работает. Хотя я объявил объект $ cb_db глобальным внутри метода. Любая помощь будет принята с благодарностью.Вызов функции-функции члена() для не-объекта

require_once (ROOT_CB_CLASSES. 'Db.php');

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 

class cb_user { 
    protected function find_by_sql($sql) { 
     global $cb_db; 

     //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 
     $result_set = $cb_db->query($sql); 

     $object_array = array(); 
     while($row = $cb_db->fetch_array($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array; 
    } 
} 
+1

Почему вы используете глобальный класс? расширение кажется гораздо более подходящим, вы также можете передать объект в качестве параметра ... – Dormilich

+0

Не начали использовать классы, чтобы избавиться от глобальных переменных? –

ответ

2

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

Global $cb_db; 
$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 

class cb_user { 
    protected function find_by_sql($sql) { 
     global $cb_db; 

     //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 
     $result_set = $cb_db->query($sql); 

     $object_array = array(); 
     while($row = $cb_db->fetch_array($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array; 
    } 
} 

Однако, я считаю, что лучший способ сделать это - это передать соединение с базой данных через конструктор.

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 
$cb_user = new cb_user($cb_db); 

class cb_user { 
    public __construct(cb_db $database) 
    { 
     $this->database = $database 
    } 

    protected function find_by_sql($sql) { 

     $this->database = new cb_db(USER, PASSWORD, NAME, HOST); 
     $result_set = $cb_db->query($sql); 

     $object_array = array(); 
     while($row = $cb_db->fetch_array($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array; 
    } 
} 

Вы также можете передать его в отдельной функции (find_by_sql($sql, $cb_db)), если вы обнаружите, что это единственная функция, которая использует соединение.

 Смежные вопросы

  • Нет связанных вопросов^_^