これらのビデオチュートリアルの問題は、主題についての手がかりがない著者であり、精神的な排泄物をまったく使用していない場合よりも結果がはるかに悪くなります。彼らが与えている被害は非常にひどいので、これらすべての無力な「ラッパー」が実際のアプリケーションにまったく使用できない理由を説明する専用の記事を書く必要がありました。最初のデータベースラッパーの小児疾患 。
たとえば、ビデオからこのラッパーを取り出します:
- エラー報告には完全な欠陥があります
- SELECTには役に立たない関数です。
- ステートフルネス
- 保護されたPDOインスタンス
したがって、本質的には、InsertIdのようなばかげたものでさえこの「ラッパー」から取得することはできません。また、エラー報告は問題の認識にさえ役立ちません。
あなたのコードの時点では、SQLキーワードを入力する手間を省くために交渉しないでください。それはばかげています。 SQLは貴重なものです。いくつかのぎこちないショートカットを優先して、SQLを却下しないでください。また、PDOを機能不全の無効な状態にまで減らして、その最も優れた機能を破棄するべきではありません。
ラッパーは、すべてのPDOおよびSQL機能を破棄するのではなく、アクセス可能にする必要があります。つまり、次のようになります。
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;
}
}
このラッパーは、ビデオのラッパーよりも10倍単純であると同時に、10倍強力です。
そして今、あなたのクラス
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>';
}
}
ここでの秘密は、PDOが、コーディングの1行を追加することなく、オブジェクトデータをすでに提供できることです。
この単純な例はあまり印象的ではありませんが、ここでの秘密は、ビデオからの例が詰まるときに、このラッパーが他の例にも役立つことです。他の例を考えてみてください。このラッパーがいかにシンプルで強力かをお見せします。