brussens
Мега-мастер
Дата регистрации:
11.10.2011 22:50:07
Сообщений: 438
Михаил, вот есть класс работы с БД
<?php
class DB {
private static $msqlicnct;
private function __construct() {
self::$msqlicnct = new Mysqli('localhost', 'root', '', 'beatzone');
return self::$msqlicnct;
}
public static function select() {
new DB();
$b = self::$msqlicnct->query("SELECT * FROM users WHERE id = '2'"->fetch_assoc();
print_r($b);
}
}
DB::select();
?>
класс основан на синглтоне, только вот хотелось бы new DB(); не дублировать в каждом новом методе класса, как его можно создавать один раз? Заранее спасибО)
Admin
Администратор
Дата регистрации:
27.05.2010 21:23:42
Сообщений: 3063
Это какой-то испорченный singleton. Надо создать всего 1 статический метод, который создаёт новый объект и записывает в поле, либо если он уже существует возвращает его из поля. Все остальные методы должны быть нестатическими. Вызывали метод, появился объект, а дальше к нему применяете все необходимые методы.
brussens
Мега-мастер
Дата регистрации:
11.10.2011 22:50:07
Сообщений: 438
Ведь по сути то по синглтону конструктор должен быть private, а статичный метод его создаёт, так ведь? Как тогда обратиться к статическому свойству класса? Ведь если конструктор привэйт, то нельзя создавать объект напрямую
Admin
Администратор
Дата регистрации:
27.05.2010 21:23:42
Сообщений: 3063
К нему надо обратиться только 1 раз в методе, создающем объект. Все остальные методы (уже нестатические) к данному полю вообще не должны обращаться.
brussens
Мега-мастер
Дата регистрации:
11.10.2011 22:50:07
Сообщений: 438
Михаил, по вашему совету исправил ошибки, только вот как тогда обращаться уже непосредственно к самому объекту Mysqli, для выполнения query()?
Через конструкцию в методе insertos() не получается, пишут ошибку наличия метода.
Вот исправленный код
class DB {
private static $msqlicnct;
private function __construct() {
new Mysqli('localhost', 'root', '', 'beatzone');
}
public static function select() {
if ( is_null(self::$msqlicnct) ) {
self::$msqlicnct = new DB();
}
return self::$msqlicnct;
}
public function insertos() {
$b = self::select();
$b->query("SELECT * FROM users WHERE id = '2'"->fetch_assoc();
echo $b['name'] . " " . $b['secondname'];
}
}
DB::select()->insertos();
brussens
Мега-мастер
Дата регистрации:
11.10.2011 22:50:07
Сообщений: 438
Михаил, посидел, потупил, вот вроде понял, всё работает, скажите, какие замечания есть?
class DB {
private static $msqlicnct = NULL;
private function __construct() {
$this->db = new Mysqli('localhost', 'root', '', 'beatzone');
}
private function __clone() {}
private function __wakeup() {}
public static function select() {
if ( is_null(self::$msqlicnct) ) {
self::$msqlicnct = new DB();
}
return self::$msqlicnct;
}
public function insertos() {
$b = $this->db->query("SELECT * FROM users WHERE id = '2'"->fetch_assoc();
echo $b['name'] . " " . $b['secondname'];
}
}
DB::select()->insertos();
Admin
Администратор
Дата регистрации:
27.05.2010 21:23:42
Сообщений: 3063
Теперь всё хорошо, только вот так писать можно, если Вы вызываете объект всего 1 раз:
DB::select()->insertos();
В противном случае, надо просто записать объект в переменную и дальше уже применять методы:
$db = DB::select();
$db->insertos();
$db->insertos();
brussens
Мега-мастер
Дата регистрации:
11.10.2011 22:50:07
Сообщений: 438
Спасибо Михаил)) Это просто каркас))) Далее уже методы будут дописываться и класс будет использоваться для всего проекта)