Problem z tymi samouczkami wideo polega na tym, że ich autorzy nie mają pojęcia na ten temat, co sprawia, że wynik jest DUŻO GORSZY, niż gdybyś w ogóle nie używał ich mentalnych ekskrementów. Szkody, jakie wyrządzają, są tak poważne, że musiałem nawet napisać specjalny artykuł wyjaśniający, dlaczego wszystkie te bezradne „opakowania” są całkowicie bezużyteczne w jakiejkolwiek rzeczywistej aplikacji, Twoje pierwsze choroby wieku dziecięcego wrappera .
Weźmy na przykład to opakowanie z filmu:
- Zgłaszanie błędów jest całkowicie błędne
- Bezużyteczna funkcja dla SELECTów.
- Państwo
- Chroniona instancja PDO
Tak więc w istocie nie będziesz w stanie uzyskać z tego „opakowania” nawet tak głupiej rzeczy jak Insert Id. I żadne zgłaszanie błędów nie może nawet pomóc w zrozumieniu problemu.
Jeśli chodzi o kod, po prostu nie trać czasu na oszczędzanie na wpisywaniu słowa kluczowego SQL. To jest głupie. SQL to cenna rzecz, nie odrzucaj go na rzecz jakichś bełkotliwych skrótów. Nie powinieneś też umniejszać PDO do stanu kalekiego inwalidy, niszcząc jego najwspanialsze cechy.
Twoje opakowanie powinno udostępniać wszystkie funkcje PDO i SQL, zamiast je odrzucać. Tak to wygląda:
class DB
{
protected static $instance;
protected $pdo;
protected function __construct() {
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
PDO::ATTR_EMULATE_PREPARES => FALSE,
);
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
$this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt);
}
// a classical static method to make it universally available
public static function instance()
{
if (self::$instance === null)
{
self::$instance = new self;
}
return self::$instance;
}
// a proxy to native PDO methods
public function __call($method, $args)
{
return call_user_func_array(array($this->pdo, $method), $args);
}
// a helper function to run prepared statements smoothly
public function run($sql, $args = [])
{
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
ten wrapper jest dziesięć razy prostszy i jednocześnie dziesięć razy silniejszy niż ten z filmu.
A teraz twoja klasa
class Schedule
{
private $_db;
public function __construct()
{
$this->_db = DB::instance();
}
public function listGames()
{
$data = $this->_db->query('SELECT * FROM games')->fetchAll();
var_dump($data);
echo '<br>';
}
}
Sekret polega na tym, że PDO może już udostępniać dane obiektu, bez ani jednej dodatkowej linii kodu.
Chociaż ten prosty przykład nie jest zbyt imponujący, sekretem jest to, że to opakowanie posłuży Ci również do każdego innego przykładu, gdy ten z filmu się dławi. Spróbuj pomyśleć o jakimkolwiek innym przykładzie, a pokażę Ci, jak proste, ale potężne jest to opakowanie.