PHPでOOP (894レス)
PHPでOOP http://medaka.5ch.io/test/read.cgi/php/1172205352/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
402: nobodyさん [sage] 2008/02/14(木) 15:00:26 ID:??? >>398 > 各操作系に保持させるならプリペアドステートメントを。 プリペアドステートメントは条件の数を変えにくいという 大きな欠点があるからなぁ。 > 個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。 一般に言われている、ActiveRecordパターンですね。 Ruby on RailsやCakePHPで採用されている奴です。 http://medaka.5ch.io/test/read.cgi/php/1172205352/402
403: nobodyさん [sage] 2008/02/14(木) 15:08:57 ID:??? >>383 > テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。 > 両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな? 処理の負荷というより、決定的な問題がある。 それは主にトランザクションを使ったときに起こる。 複数のテーブルを操作することで、一つの処理を完成させる場合 中途半端な状態を他に見せないようにしなければいけないし、 また一つのテーブルで処理が失敗した場合すべてを元に戻さなければならない。 これを実現する為に同じ接続から見える状態と、違う接続からみえる状態で 違うことがある。 http://medaka.5ch.io/test/read.cgi/php/1172205352/403
404: nobodyさん [sage] 2008/02/14(木) 15:18:21 ID:??? PHPやWebアプリに限らないけど、OOPってのはフレームワークを作るためにある。 ここで言うフレームワークには、汎用の名前があるフレームワークだけじゃなく たとえばあるゲームの独自の基本システムなんていったものも含む。 このフレームワークを使って作るもの・・・すなわち、 フレームワークから呼び出されるコードは、単純な処理になるので (というか単純な処理ですむ為のフレームワーク) OOPにならないことが多い。 だからといって、システム全体がOOPになっていないとは思わないけどね。 システム全体の一部。つまりクラスの中のメソッドだけを見て 非OOPというのはおかしいでしょ? http://medaka.5ch.io/test/read.cgi/php/1172205352/404
405: nobodyさん [sage] 2008/02/14(木) 15:30:26 ID:??? >>404 誰に言ってるの?? http://medaka.5ch.io/test/read.cgi/php/1172205352/405
406: nobodyさん [sage] 2008/02/14(木) 15:35:44 ID:??? 誰に言ってるのかも気になるが、そんなこと誰が言ってるのかも気になる。 OOPがフレームワークのためにあるという主張は初めて聞いた。 http://medaka.5ch.io/test/read.cgi/php/1172205352/406
407: nobodyさん [sage] 2008/02/14(木) 15:36:31 ID:??? >>384 も >>389 も >>390 も気持ち悪すぎだ 普通に考えるとこういう感じだろう? // 接続に関する抽象クラス。汎用で使える関数があれば定義しても良い。 class CDB_Connection {} // PostgreSQL接続用クラスの実装 class CDB_PostgreSQL extends CDB_Connection {} // MySQL接続用クラスの実装 class CDB_MySQL extends CDB_Connection {} // テーブルに関する抽象クラス。汎用で使える関数があれば定義しても良い。 class CTable {} // 個人情報クラス。 class CPersonal extends CTable{ function CSearch($connection) {} //コンストラクタかメソッドでコネクションと接続 function search() {} function update() {} } http://medaka.5ch.io/test/read.cgi/php/1172205352/407
408: nobodyさん [sage] 2008/02/14(木) 15:41:23 ID:??? >>407 概ね同じ意見だけど、Cpersonalを実体化する必要ってあんまりなさそうだから、 自分はメソッドを staticにすることが多い。 あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも SQLを実行できてしまうので、引数で渡すようにしてる。 (まぁ、staticにしたら引数で渡すしかないけど) http://medaka.5ch.io/test/read.cgi/php/1172205352/408
409: nobodyさん [sage] 2008/02/14(木) 15:45:33 ID:??? >>408 に補足 必要性がないというより、CTable (のサブクラス)のインスタンスをnewするということは、 意味論的には、そのテーブル自体を新規に生成するということだから、ちょっと気持ち悪い。 http://medaka.5ch.io/test/read.cgi/php/1172205352/409
410: nobodyさん [sage] 2008/02/14(木) 15:48:44 ID:??? >>389 > 私は、DBをPostgreSQLからMySQLへ変換する必要性も生じることを > 想定した設計をしただけだよ。 > こうやっておけば、書き換えるコードも少なくて済む。 とか言っておきながら、 > // コンストラクタ > function CSearch_Personal(){ > $db_info = ""; // ここでDB接続に必要な情報を入れる。 > $this->m_db = new CDB_PostgreSQL($db_info); > } CSearch_Personalのコンストラクタで CDB_PostgreSQL決め打ちなのはナンセンス。 DBをPostgreSQLからMySQLへ変換する必要性も生じることを想定した設計というのなら 設計としては、Personalデータを扱う(Search専用?)クラスは 接続するデータベースに依存すべきではない。 (限られた環境だけで動くものを作ればいいだけならどうでもいいが) 接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から 与える。そのときの引数は(PHPに厳密な型は無いが)抽象クラスのCDB_Connection型で与える。 こうすることで、DBをPostgreSQLからMySQLへ変換する必要が生じたとき、 CSearch_Personalを一切修正しないですむ。 http://medaka.5ch.io/test/read.cgi/php/1172205352/410
411: nobodyさん [sage] 2008/02/14(木) 15:49:17 ID:??? >>404は、「バージョン6までのVBって構文は構造化だけど、 内部的にはクラスが動いているんだよ」といってるのと 同じ意味のように思える。 誰に何を伝えたいのかは良く分からないが。 http://medaka.5ch.io/test/read.cgi/php/1172205352/411
412: nobodyさん [sage] 2008/02/14(木) 15:51:40 ID:??? >>408-409 まあ、そこは設計しだいでいくつかやり方があるけど、 ActiveRecordパターンの場合、インスタンスはテーブルを作るという意味ではなく、 クラスがテーブル全体で、そのインスタンスはテーブルのレコードという扱いになる。 そしてフィールドがプロパティ。 http://medaka.5ch.io/test/read.cgi/php/1172205352/412
413: nobodyさん [sage] 2008/02/14(木) 15:53:27 ID:??? >>411 一応突っ込み。VBにはクラスがある。(少なくとも5以上) もちろんnewでインスタンスも生成できる。 http://medaka.5ch.io/test/read.cgi/php/1172205352/413
414: nobodyさん [sage] 2008/02/14(木) 16:01:23 ID:??? >>412 これですかね。 http://www.martinfowler.com/eaaCatalog/activeRecord.html 細かいけど、 >そのインスタンスはテーブルのレコードという扱いになる。 なら、searchメソッドは、staticなり外部に置くのではないかと思う。 確かに updateはこの場合 staticにすべきものではないですね。失礼。 http://medaka.5ch.io/test/read.cgi/php/1172205352/414
415: 412 [sage] 2008/02/14(木) 16:03:01 ID:??? >>408 > あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも > SQLを実行できてしまうので、引数で渡すようにしてる。 なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、 > (まぁ、staticにしたら引数で渡すしかないけど) これが理由なら、そのクラスをシングルトンパターンで 実装するという方法もある。 CPersonal::search() などという書き方で呼べるぞ。 ただし、PHP4に対応した書き方だとすごく気持ち悪いんだが(笑) CakePHPでgetInstance()というメソッドをキーワードにして探せば 実装例が見つかると思う。 getInstance()関数内のstatic変数に配列[0]にで確保(なぜ?)した後 各メソッドの初めで$_this = getInstance() して$_thisで参照するという・・・ まあ見たほうが早い(?) http://medaka.5ch.io/test/read.cgi/php/1172205352/415
416: nobodyさん [sage] 2008/02/14(木) 16:13:08 ID:??? >>415 >なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、 DBなんて巨大なグローバル変数の固まりみたいなものだし、アクセスもメモリと比べて遅いし、 トランザクションの都合からもある範囲でDBアクセスしている可能性がないかが 簡単に見分けられないのは怖いと思うけど。 http://medaka.5ch.io/test/read.cgi/php/1172205352/416
417: 412 [sage] 2008/02/14(木) 16:13:24 ID:??? >>414 > なら、searchメソッドは、staticなり外部に置くのではないかと思う。 あー。staticでいいです。単に個人的な環境の理由から PHP4を使っていて忘れていただけです。 http://medaka.5ch.io/test/read.cgi/php/1172205352/417
418: 412 [sage] 2008/02/14(木) 16:17:15 ID:??? >>416 でもどっちみちデータベースに操作を出来るところなら、 コネクション知っているわけで、結局同じことでしょ? それにクラスの変数はグローバル変数じゃないからw http://medaka.5ch.io/test/read.cgi/php/1172205352/418
419: nobodyさん [sage] 2008/02/14(木) 16:33:55 ID:??? >>418 必要なメソッドにしか connection を渡さず、オブジェクト内に保存しないことで、 「データベースに操作できるところ」を限定するという話。 connection をDBアクセスする権限と見るならば、その権限は処理に対して与えるべきで、 オブジェクトに対して与えるべきではないだろうということ。 http://medaka.5ch.io/test/read.cgi/php/1172205352/419
420: nobodyさん [sage] 2008/02/14(木) 17:56:06 ID:??? DB周りはZendFrameworkの実装でなんら不満ないなあ。 http://medaka.5ch.io/test/read.cgi/php/1172205352/420
421: 412 [sage] 2008/02/14(木) 18:14:31 ID:??? >>419 しかし、テーブルに関するクラスでデータベースを操作しないメソッドって あまりないからなぁ。まあ別にいいけどね。 http://medaka.5ch.io/test/read.cgi/php/1172205352/421
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 473 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.009s