Есть ли какие-либо принципиальные недостатки в использовании этого подхода?
Самое первое, что вы должны понять, что $pdo
является частью хранения логики. Это означает, что он должен использоваться только внутри классов, которые делают абстрактным доступом к данным, будь то таблица SQL или коллекция.
Давайте посмотрим на код,
function somefunction(){
global $pdo;
$statement = $pdo->prepare("some query");
$statement->execute();
}
Что делать, если вы хотите, чтобы перейти от MySQL к Монго/MSSQL/PgSQL, в будущем? Тогда вам придется переписать много кода.
И для каждого поставщика базы данных вам нужно будет создать отдельный файл с другой переменной.Так же, как этот
function somefunction(){
global $mongo;
return $mongo->fetch(...);
}
с помощью глобального состояния, вы в конечном итоге с массовым дублирования кода, потому что вы не можете передать параметры и, следовательно, не может изменить поведение функция во время выполнения.
Теперь давайте посмотрим на это,
function somefunction($pdo){
$statement = $pdo->prepare("some query");
$statement->execute();
}
Здесь $pdo
передается в качестве аргумента, таким образом, нет никакого глобального состояния. Но проблема все еще остается, вы в конечном итоге нарушаете принцип единой ответственности
Если вы действительно хотите что-то поддерживаемое, чистое и очень читаемое, вам лучше придерживаться DataMappers. Вот пример,
$pdo = new PDO(...);
$mapper = new MySQL_DataMapper($pdo);
$stuff = $mapper->fetchUserById($_SESSION['id'])
var_dump($stuff); // Array(...)
// The class itself, it should look like this
class MySQL_DataMapper
{
private $table = 'some_table';
private $pdo;
public function __construct($pdo)
{
$this->pdo = $pdo;
}
public function fetchUserById($id)
{
$query = "SELECT * FROM `{$this->table}` WHERE `id` =:id";
$stmt = $this->pdo->prepare($query);
$stmt->execute(array(
':id' => $id
));
return $stmt->fetch();
}
}
Заключение
Это действительно не имеет значения, если ваш проект маленький или большой, вы всегда должны избежать глобального государства во всех его формах (глобальные переменные, статические классы, Одиночки) - ради кода ремонтопригодности
Вы должны помнить, что $pdo
не является частью бизнес-логики. Это часть логики хранения. Это означает, что, прежде чем даже начать делать что-то с бизнес-логикой, как тяжелые вычисления, вы должны действительно абстрактный доступ к таблицам (в том числе CRUD операций)
Мост, который объединяет ваши data access abstraction
и computation logic
обычно называют служба
Вы всегда должны передать потребность вещи функционирует в качестве параметров
лучше перестать беспокоиться о вашем коде и начать думать о уровнях абстракции.
И, наконец, прежде чем даже начать делать какие-либо вещи, вы во-первых, инициализировать все свои услуги в bootstrap.php
, а затем начать запрашивая хранения в соответствии с входом пользователя ($_POST
или $_GET
).
Так же, как,
public function indexAction()
{
$id = $_POST['id']; // That could be $this->request->getPost('id')
$result = $this->dataMapper->fetchById($id);
return print_r($result, true);
}
Пожалуйста, смотрите http://stackoverflow.com/questions/12445972/stop-using-global-in-php – Achrome
Считают, что вы строите новый дом. Вы ожидали бы, что электрик будет запускать всю проводку в стенах, чтобы вы могли иметь красивые розетки, где бы вы ни хотели. Но теперь представьте себе, что электрик говорит вам: «Вместо того, чтобы прокладывать всю проводку в стенах, я просто использую счетчики и метры удлинителей. Я имею в виду, что в этом плохого? У вас все еще есть электричество». – Mark