テクノロジーの開発により、すべてのプログラマーが自分のコンピューターを所有するようになったため、副作用として、数千のさまざまなライブラリー、フレームワーク、サービス、APIなどがあります。 すべての機会に。 しかし、この人生のケースが来ると、問題が発生します-それらを何に使用し、それが完全に適合しない場合に何をするか-書き直し、ゼロから書き、または異なるユースケースにいくつかのソリューションをねじ込みます。
多くの人が、プロジェクトを作成することは、プログラミングではなく、いくつかの既成のソリューションの統合コードを書くことよりも、多くの場合、ダウンすることに気づいたと思います。 そのような組み合わせは、その後のタスクで繰り返し使用できる新しいソリューションになる場合があります。
特定の「実行中の」タスク、つまりPHPでデータベースを操作するためのオブジェクトレイヤーに移りましょう。 PDOからマルチレベル(そして、私の意見では、PHPではまったく適切ではない)ORMエンジンに至るまで、多くのソリューションがあります。
これらのソリューションのほとんどは、他のプラットフォームからPHPに移行しました。 しかし、多くの場合、著者はPHPの機能を考慮に入れていません。PHPの機能は、移植性のある構成の記述と使用の両方を劇的に単純化します。
このクラスのタスクの一般的なアーキテクチャの1つは、アクティブレコードパターンです。 特に、いわゆるEntity(エンティティ)は、このテンプレートに従って構築され、EJB3の永続Beanから.NETのEFまで、多くのプラットフォームで何らかの形で使用されます。
それでは、PHP用に同様の構成を構築しましょう。 完成した
ADODBライブラリと、PHPオブジェクトの弱いタイピングと動的なプロパティの2つのクールなものを一緒に接続しましょう。
ADODBの多くの機能の1つは、データとの連想配列に基づいてレコードを挿入(INSERT)および更新(UPDATE)するための、いわゆるSQLクエリの自動生成です。
実際には、キーをフィールドの名前、値をデータとして、配列を取得し、SQLクエリ文字列を生成する軍事的なものはありません。 しかし、ADODBはより知的にそれを行います。 クエリは、以前にデータベーススキーマから読み取られたテーブルの構造に基づいています。 その結果、第一に、既存のフィールドのみがsqlに入り、すべてではなく、第二に、フィールドタイプが考慮されます-文字列に引用符が追加され、送信された値の文字列の代わりにADODBが見た場合、タイムスタンプに基づいて日付形式を形成できます。
それでは、PHPの側面から見ていきましょう。
このようなクラスを想像してください(簡略化)。
class Entity{
protected $fields = array();
public final function __set($name, $value) {
$this->fields[$name] = $value;
}
public final function __get($name) {
return $this->fields[$name];
}
}
ADODB SQL , , XML . . , , , .
, .
Gist. , . , — , .
, :
CREATE TABLE `users` (
`username` varchar(255) ,
`created` date ,
`user_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`user_id`)
)
— ADODB .
, Entity
/**
* @table=users
* @keyfield=user_id
*/
class User extends Entity{
}
.
:
$user = new User();
$user->username=' ';
$user->created=time();
$user->save(); //
//
$thesameuser = User::load($user->user_id);
echo $thesameuser ->username;
.
( ,
view=usersview) , , . . getMetatada() .
Entity ?
, init(), Entity, .
afterLoad(), , timestamp .
.
/**
* @table=users
* @view=usersview
* @keyfield=user_id
*/
class User extends Entity{
protected function init() {
$this->created = time();
}
protected function afterLoad() {
$this->created = strtotime($this->created);
}
}
beforeSave beforeDelete , , — , .
( WHERE ).
$users = User::load("username like '' ");
Entity , «» SQL . , . , ( user_id, ), . , , , , . . EF -.
, AR. — . , Entity Manager .
— , , .
— PHP , ( Entity) -. , - .
? , , — , , , . , , ( 99.9%) . , , - .
P.S.
GitHub