Практика базы данных и ООП в PHP

Его трудно объяснить эту ситуацию, но, пожалуйста, см. Пример.

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

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

пример

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, просто создайте соединение в своем классе базы данных, выполните все запросы, необходимые для этой функции, а затем закройте его. Это мой предпочтительный подход.