<?php
class PdoFactory {
private static $instance = NULL; private function __construct() {}
public static function get
() { if (self::$instance === NULL) {
$dsn = 'mysql:dbname=***;host=***;port=***;'; //
$user = 'nobody'; //zmien na swoje
$password = 'nobody'; //
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
throw new Exception ($e->getMessage());
}
self::$instance = $pdo;
}
return self::$instance;
}
}
?>
Nazwa klasy wskazuje że jest to fabryka bo bardzo łatwo przerobić tą klasę tak żeby fabryką była (fabryka czyli klasa która serwuje różne obiekty w zależności od parametrów) i jeśli w projekcie korzystasz z więcej niż jednej bazy danych należałoby przekazać do metody PdoFactory::get() jeszcze jeden parametr dzięki któremu będziesz mógł uzyskać połączenie z określoną bazą danych
Zaprezentowany wyżej kod jest implementacją wzorca projektowego o nazwie
Singleton i sprawdza się bardzo do kodu który ma być dostępny w dowolnym miejscu twojego skryptu. Jest to tak naprawdę opakowana w klasę zmienna globalna dlatego radze nie nadużywać tego wzorca.
Mając tak zdefiniowaną klasę obiekt klasy PDO pobierasz przez:
<?php
$pdo = PdoFactory::get();
?>
Metoda z twojego pierwszego postu może wyglądać teraz np tak:
<?php
public function getOnePerson($id) {
$pdo = PdoFactory::get();
//Jeżeli do zapytania przekazujesz jakikolwiek parametr radze zamiast z PDO::query() skorzystać z PDO::prepare()
$row = $pdo -> query("SELECT * FROM persons WHERE id = $id");
return $row;
$row -> closeCursor(); //to jest bez sensu bo nigdy nie będzie wykonane przez to że umieściłeś to za "return"
}
?>
albo obiekt klasy PDO pobrać już w samym konstruktorze i przypisać go do prywatnej składowej tej klasy.
Pozwoliłem dodać sobie dwa komentarze do kodu na jego temat.