2010-05-19 2 views
0

Я новичок в PHP oop.Расширение mysqli и использование нескольких классов

Я пытаюсь создать базу данных классов и вызвать из нее другие классы. Правильно ли я делаю это?

класс базы данных:

class database extends mysqli { 

private $classes = array(); 

public function __construct() { 
parent::__construct('localhost', 'root', 'password', 'database'); 
    if (mysqli_connect_error()) { 
    $this->error(mysqli_connect_errno(), mysqli_connect_error()); 
    } 
} 

public function __call($class, $args) { 
    if (!isset($this->classes[$class])) { 
    $class = 'db_'.$class; 
    $this->classes[$class] = new $class(); 
    } 
return $this->classes[$class]; 
} 

private function error($eNo, $eMsg) { 
die ('MySQL error: ('.$eNo.': '.$eMsg); 
} 

} 

класса db_users:

class db_users extends database { 

public function test() { 
echo 'foo'; 
} 

} 

и как я использую его

$db = new database(); 
$db->users()->test(); 

Является ли это правильный путь, или это должно быть сделано по-другому ?

спасибо.

+0

Там кажется, нет ничего плохого с кодом. Я не уверен, что вы спрашиваете здесь. В качестве побочного примечания я бы рекомендовал не расширять mysqli и не создавать его в вашем классе. Он не появляется, поскольку вы получаете что-либо от его расширения в этот момент. – tylermac

+0

Спасибо за ваш комментарий. Линия, которая меня беспокоит, - это $ db-> users() -> test() ;. Я в порядке, чтобы создавать новые классы с __call(), или должен ли я каждый раз делать что-то вроде $ u = new db_users(); $ U-> тест(); – Mikk

ответ

2

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

protected function error($eNo, $eMsg, $extra = '') { 
    throw new Exception('MySQL error: ['.$eNo.'] '.$eMsg.': '.$extra); 
} 

Кроме того, я предложил бы перегружать метод запроса, а также

public function query($sql, $result_mode = MYSQLI_STORE_RESULT) { 
    $result = parent::query($sql, $result_mode); 
    if ($result === false) { 
     $this->error($this->errno, $this->errstr, $sql); 
    } 
    return $result; 
} 

Я также предлагаю хранить копию объекта $ db внутри дочернего класса. Итак:

class db_users extends database { 
    protected $db = null; 

    public function __construct(Database $db) { 
     $this->db = $db; 
    } 

    public function test() { 
     echo 'foo'; 
    } 
} 

Тогда в __call:

if (!isset($this->classes[$class])) { 
    $class = 'db_'.$class; 
    $this->classes[$class] = new $class($this); 
} 
1

Там нет ничего плохого в этом заводском стиле для создания классов. Я бы разместил в нем немного обработки исключений.

Моя единственная проблема заключается в расширении базы данных в ваших подклассах.

Так что я бы изменить следующим образом:

public function __call($className, $args) { 
    if (!isset($this->classes[$class])) { 
     if(include_once('db_'.$class)) { 
      $class = 'db_'.$class; 
      $this->classes[$class] = new $class($this); 
     } else { 
      throw new Exception("Db class not found"); 
     } 
    } 

    return $this->classes[$class]; 
} 

А класс пользователей, как:

public class db_users { 
    private $db; 

    public __constructor($db) { 
     $this->db = $db; 
    } 

    public function test() { 
     return 'Foo'; 
    } 
} 
+0

Спасибо, проверили и поняли, почему расширение подклассов не было хорошей идеей. – Mikk