Его трудно объяснить эту ситуацию, но, пожалуйста, см. Пример.
Я закодировал сайт, на котором загружается страница, я инициализирую класс базы данных. Я отправил этот класс в качестве параметра функции для любых функций, которым необходим доступ к базе данных.
Я знаю, что это плохой подход, но в настоящее время я понятия не имею, как это сделать любым другим способом. Не могли бы вы мне помочь.
пример
class sms { function log_sms($message, $db) { $sql = "INSERT INTO `smslog` SET `mesasge` = '$message' "; $db->query($sql); if ($db->result) return true; return false; } }
затем на главной странице ..
$db = new db(username,pass,localhost,dbname); $sms = new sms; $sms->log_sms($message, $db);
Есть ли лучший подход, чем это?
существует множество вариантов решения проблемы зависимостей (для объекта A требуется объект B):
впрыск конструктора
class Sms { function __construct($db) .... } $sms = new Sms (new MyDbClass);
инъекция сеттера
class Sms { protected $db; } $sms = new Sms; $sms->db = new MyDbClass;
шаблон реестра
class Registry { static function get_db() { return new MyDbClass; }} class Sms { function doSomething() { $db = Registry::get_db(); $db->.... }}
шаблон «сервис-локатор»
class Loader { function get_db() { return new MyDbClass; }} class Sms { function __construct($loader) { $this->loader = $loader; function doSomething() { $db = $this->loader->get_db(); $db->.... }} $sms = new Sms(new Loader);
автоматическая инъекция зависимостей на основе контейнеров, см., например, http://www.sitepoint.com/blogs/2009/05/11/bucket-is-a-minimal-dependency-injection-container-for-php
interface DataSource {...} class MyDb implements DataSource {...} class Sms { function __construct(DataSource $ds) .... $di = new Dependecy_Container; $di->register('DataSource', 'MyDb'); $sms = $di->get('Sms');
назвать несколько 😉
также статья Фаулера, которую я вам дала, действительно стоит прочитать
Для начала вы можете сделать защищенную переменную $ db в каждом из ваших классов, которые должны использовать базу данных. Затем вы можете передать $ db в конструктор класса. Вот обновленный код:
$db = new db(username,pass,localhost,dbname); $sms = new sms($db); $sms->log_sms($message); class sms { protected $db; public function __construct($db) { $this->db = $db; } public function log_sms($message) { $sql = "INSERT INTO `smslog` SET `mesasge` = '$message' "; $this->db->query($sql); if ($this->db->result) return true; return false; } }
Этот пример приведен в PHP 5.
Синглтон также является хорошей практикой в разработке приложений. Они очень полезны, чтобы избежать повторных запросов или вычислений во время одного вызова. Передача объекта базы данных каждому методу или конструктору – не очень хорошая идея, вместо этого используйте Singleton.
расширить вашу базу данных или вставить статический метод в свой класс db. (Я бы также вызвал для config в db-методе конструктора)
class database extends db { public static function instance() { static $object; if(!isset($object)) { global $config; $object = new db($config['username'],$config['pass'],$config['localhost'],['dbname']); } return $object; } }
сделать свой метод статическим
class sms { public static function log($message) { $sql = "INSERT INTO `smslog` SET `mesasge` = '$message'"; database::instance()->query($sql); return (bool) database::instance()->result; } }
В следующий раз, когда вам нужно записать sms, просто сделайте статический вызов, как этот
sms::log($message);
Вы можете либо иметь статический класс, который имеет два списка, одно из доступных подключений, другое из распределенных соединений и просто имеет пул соединений.
Или, если вы используете то, что имеет быстрое время соединения, например MySQL, просто создайте соединение в своем классе базы данных, выполните все запросы, необходимые для этой функции, а затем закройте его. Это мой предпочтительный подход.