Расширение mysqli и использование нескольких классов - PullRequest
0 голосов
/ 19 мая 2010

Я новичок в PHP.

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

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

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();

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

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

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 голос
/ 19 мая 2010

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

Мое единственное другое беспокойство - расширение базы данных в ваших подклассах.

Поэтому я бы изменил это следующим образом:

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';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...