X



PHPでOOP

00011 ◆SWtzLesEmM
垢版 |
2007/02/23(金) 13:35:52ID:???
PHPを使ってプログラミングするとき、
プロシージャ指向(手続き型、構造化プログラミング)でもできますが、
オブジェクト指向を使った場合の恩恵を享受するために、
PHPでオブジェクト指向プログラミングの勉強をしてみましょう。

<目的>
PHP5でオブジェクト指向プログラミングを行なうための知識を習得する。
(PHP4のOOPもOK、このスレが1000に行く前にPHP6が出たらPHP6のOOPもOK)

<方向性>
・このスレは、プログラミング初心者、PHP初心者の勉強の場として利用することを前提にします。
・PHPのOOPの話題に限定します。
(Ruby、Python、Javaなど他言語のOOPについては、その言語のスレッドでお願いします。)
・PHPのOOP学習に役立つ本、WEBサイトの紹介をお願いします。

<その他>
・略記は、「OO」=「オブジェクト指向」、「OOP」=「オブジェクト指向プログラミング」でお願いします。
・質問をする人はなるべくトリップを付けましょう。
・荒らし、煽り、叩き、気違いは無視・無干渉でお願いします。

このスレで、今日から貴方もOOP!!!\(^o^)/
0406nobodyさん
垢版 |
2008/02/14(木) 15:35:44ID:???
誰に言ってるのかも気になるが、そんなこと誰が言ってるのかも気になる。
OOPがフレームワークのためにあるという主張は初めて聞いた。
0407nobodyさん
垢版 |
2008/02/14(木) 15:36:31ID:???
>>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() {}
}
0408nobodyさん
垢版 |
2008/02/14(木) 15:41:23ID:???
>>407
概ね同じ意見だけど、Cpersonalを実体化する必要ってあんまりなさそうだから、
自分はメソッドを staticにすることが多い。

あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
SQLを実行できてしまうので、引数で渡すようにしてる。
(まぁ、staticにしたら引数で渡すしかないけど)
0409nobodyさん
垢版 |
2008/02/14(木) 15:45:33ID:???
>>408 に補足
必要性がないというより、CTable (のサブクラス)のインスタンスをnewするということは、
意味論的には、そのテーブル自体を新規に生成するということだから、ちょっと気持ち悪い。
0410nobodyさん
垢版 |
2008/02/14(木) 15:48:44ID:???
>>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を一切修正しないですむ。
0411nobodyさん
垢版 |
2008/02/14(木) 15:49:17ID:???
>>404は、「バージョン6までのVBって構文は構造化だけど、
内部的にはクラスが動いているんだよ」といってるのと
同じ意味のように思える。
誰に何を伝えたいのかは良く分からないが。
0412nobodyさん
垢版 |
2008/02/14(木) 15:51:40ID:???
>>408-409

まあ、そこは設計しだいでいくつかやり方があるけど、
ActiveRecordパターンの場合、インスタンスはテーブルを作るという意味ではなく、
クラスがテーブル全体で、そのインスタンスはテーブルのレコードという扱いになる。
そしてフィールドがプロパティ。

0413nobodyさん
垢版 |
2008/02/14(木) 15:53:27ID:???
>>411
一応突っ込み。VBにはクラスがある。(少なくとも5以上)
もちろんnewでインスタンスも生成できる。
0414nobodyさん
垢版 |
2008/02/14(木) 16:01:23ID:???
>>412
これですかね。
http://www.martinfowler.com/eaaCatalog/activeRecord.html

細かいけど、
>そのインスタンスはテーブルのレコードという扱いになる。
なら、searchメソッドは、staticなり外部に置くのではないかと思う。
確かに updateはこの場合 staticにすべきものではないですね。失礼。
0415412
垢版 |
2008/02/14(木) 16:03:01ID:???
>>408
> あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
> SQLを実行できてしまうので、引数で渡すようにしてる。
なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

> (まぁ、staticにしたら引数で渡すしかないけど)
これが理由なら、そのクラスをシングルトンパターンで
実装するという方法もある。

CPersonal::search() などという書き方で呼べるぞ。

ただし、PHP4に対応した書き方だとすごく気持ち悪いんだが(笑)
CakePHPでgetInstance()というメソッドをキーワードにして探せば
実装例が見つかると思う。

getInstance()関数内のstatic変数に配列[0]にで確保(なぜ?)した後
各メソッドの初めで$_this = getInstance() して$_thisで参照するという・・・
まあ見たほうが早い(?)
0416nobodyさん
垢版 |
2008/02/14(木) 16:13:08ID:???
>>415
>なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

DBなんて巨大なグローバル変数の固まりみたいなものだし、アクセスもメモリと比べて遅いし、
トランザクションの都合からもある範囲でDBアクセスしている可能性がないかが
簡単に見分けられないのは怖いと思うけど。
0417412
垢版 |
2008/02/14(木) 16:13:24ID:???
>>414
> なら、searchメソッドは、staticなり外部に置くのではないかと思う。
あー。staticでいいです。単に個人的な環境の理由から
PHP4を使っていて忘れていただけです。
0418412
垢版 |
2008/02/14(木) 16:17:15ID:???
>>416
でもどっちみちデータベースに操作を出来るところなら、
コネクション知っているわけで、結局同じことでしょ?

それにクラスの変数はグローバル変数じゃないからw
0419nobodyさん
垢版 |
2008/02/14(木) 16:33:55ID:???
>>418
必要なメソッドにしか connection を渡さず、オブジェクト内に保存しないことで、
「データベースに操作できるところ」を限定するという話。

connection をDBアクセスする権限と見るならば、その権限は処理に対して与えるべきで、
オブジェクトに対して与えるべきではないだろうということ。
0420nobodyさん
垢版 |
2008/02/14(木) 17:56:06ID:???
DB周りはZendFrameworkの実装でなんら不満ないなあ。

0421412
垢版 |
2008/02/14(木) 18:14:31ID:???
>>419
しかし、テーブルに関するクラスでデータベースを操作しないメソッドって
あまりないからなぁ。まあ別にいいけどね。
0422nobodyさん
垢版 |
2008/02/14(木) 18:51:49ID:???
>>421
例えば Personテーブルに depart_codeがあるとして、$person->getDepartName() としたときに、
暗黙のうちにdepart_codeをキーとしてDepartテーブルから検索する SQLが実行されたら嫌だし、
setPersonNameされたときに、そのタイミングでupdateが実行されていないか疑わなきゃいけないのも嫌。
0423nobodyさん
垢版 |
2008/02/14(木) 19:13:43ID:???
>>422
メソッドの実装がどうなってようが呼んだ方の知ったこっちゃないだろ。
そのどっちの例もそのクラスの仕様なんだから。
それを外側から知ろうとか制御しようだなんておかしな話だ。
0424nobodyさん
垢版 |
2008/02/14(木) 19:41:54ID:???
そもそもstaticも存在しないPHP4で機能をまとめたようなクラス(CDB_PostgreSQLクラスみたいなの)
を作ろうとしてるのが気持ち悪い。

しかもOOPなんてデータベースの各要素に関数をくっつけたようなもんなんだから既存のデータを単体でしか扱わない
データベースと相性が悪いのは分かりきったことだろう。
0425nobodyさん
垢版 |
2008/02/14(木) 19:54:36ID:???
OOPはデータベースの各要素に関数をくっつけたようなもの?
既存のデータベースはデータを単体でしか扱わない?
だからOOPとデータベースと相性が悪い?

( ゚Д゚) ワカラナイ
0426412
垢版 |
2008/02/14(木) 20:04:12ID:???
>>424
staticはあくまでstaticだよと明示しているだけで
本質的には必要なものとは思えないけど。便利だけどね。

それと、CDB_PostgreSQLは「機能をまとめたクラス」ではないよ。
たとえば一つのアプリでサーバー負荷分散などで、
複数の接続を使用するときとか、複数のインスタンスが出来る。
0427nobodyさん
垢版 |
2008/02/15(金) 07:09:54ID:???
PHPでもメンバポインタとかつかえれば
インスタンスに縛られない柔軟なOOPができるのにな
0428nobodyさん
垢版 |
2008/02/15(金) 17:51:58ID:???
少しだけど、クラス分割のコツが掲載されてたのではっておきます。
VBプログラマ向けの情報だと、OOPの考え方の情報が結構ありそうです。

業務Webアプリの作り方の基礎(前編)
業務アプリ開発で失敗しないコツ
http://www.atmarkit.co.jp/fdotnet/vblab/bizappbasic01/bizappbasic01_01.html
> 1つの機能(=たとえWebアプリで複数のページにまたがっていたとしても一連の作業を
> 完了させるまでの一連の操作)に対して、1つのビジネス・ロジック層のクラスを
> 作ってみることをお勧めする。

> 一般的な業務アプリでは、クラスを細かくしすぎてしまうとどこで何を行っているのかが
> 分かりづらくなり、結果的にメンテナンスしづらいアプリになることがある。

(パフォーマンスを考慮し、)
> 可能な限りクラスのインスタンス化が必要ない静的メソッド(Sharedプロシージャ)で
> 作成したステートレスな設計にすることをお勧めする。
0429nobodyさん
垢版 |
2008/02/15(金) 20:19:56ID:???
たまに昔のサイト触ったりすると非OOPなんてもうやってらんねーと思う
DRYになってないから直すの大変
0430nobodyさん
垢版 |
2008/02/15(金) 22:23:07ID:???
OOPってのは設計的な考え方ってのが含まれるんだけど、
そういう考え方は別として、単にコーディング技法として便利だよ。
0431nobodyさん
垢版 |
2008/02/15(金) 22:36:39ID:???
>>272
プリミティブだけど実装してみました・・
もはやQuickFormとSmartyがないと動きませんが・・
ttp://briefcase.yahoo.co.jp/bc/oopfw
0432◆lKs5QMUHoA
垢版 |
2008/02/15(金) 23:49:43ID:???
風邪をひいてしまい、最近頭が回らないです。レスも遅れてしまってます。。。

>>392
確かにそうですね。継承をして作ったクラスはすべてPostgreSQLに依存してしまいます
ので、is-a関係が正しいですね。

>>407
接続に関して抽象的にクラスを定義するところは勉強になりました。
私はまだまだ継承を使いこなせてないですね。

>>410
> 接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から与える。
この発想は思いつきませんでした。
確かに言われてみるとそうです。CSearch_Personalを一切修正しないで済むようになります。
0433◆lKs5QMUHoA
垢版 |
2008/02/15(金) 23:50:26ID:???
>>431
サンプルありがとうございます。
あとでソースを読んでみます。
0434383
垢版 |
2008/02/16(土) 00:15:26ID:???
質問しておきながら、反応かなり遅れてしまってごめんなさい。

具体的なコードやアドバイスを提示してくださった方々、ありがとう。
ちょっとまだ、自分には敷居が高くて色々大変そうですが、
考えるよりも産むが易し、と言うので、手を動かして色々試行錯誤してみます。

ありがとうございました。
0435nobodyさん
垢版 |
2008/02/16(土) 11:47:29ID:???
フレームワークの利点などの検証の参考となるかと思ったので書いておきます。

ASP.NETでは、「検証コントロール」というのが便利そうだ。
「プログラムを作成するたびにこういうのをいちいち書いたりしなくていい」という
部分の利便性は良く分かる。

ASP.NETで学ぶVisual Studio .NETの魅力
第2回 Visual Studio.NETでプログラム・レス開発を学ぶ(前編)
http://www.atmarkit.co.jp/fdotnet/aspandvs/aspandvs02/aspandvs02_04.html

だが、こういうのは逆にそのフレームワークに縛られてしまうのが欠点だな。
準備されてるコントロールを自分の意図するようにやりたいが、その方法が誰も分からない
もしくは、出来ない場合は、それで終わりみたいな。

話はずれるが、Accessで開発してる時、各種コントロールやウィザードの組み合わせでは
対応出来ないと感じたのを思い出した。ウィザードが準備する通りの物が目的ならば良いのだが、
それにちょっと変更を加えたい場合はどうしたらよいのかという感じ。各種プロパティーの
値を変更してみても変な方向に変わっていくだけ。
自分の意図するようにカスタマイズしたい場合は、非連結のテキストボックスを貼り付けて
VBAで制御するスタイルでやってたな。
0436nobodyさん
垢版 |
2008/02/16(土) 12:59:37ID:???
Accessではグリッドが無いけれど、サブフォームで代用する方法はある。
しかし、そのカスタマイズ度は低い。(確か、クリックしたセルの場所を
取るとか、一つのセルだけ色を変更するとかがかなり苦手だったような。)
サブフォームで代用できない場合は、フォーム上にグリッドを貼り付けるような
モジュールは無いので、DBへのアクセス手段が手軽なものを捨ててでも
VBで0から作り直すのが一般的な選択方法となる。

Webアプリのフレームワークでもこのような状況になる事ってあるのかなぁ?
0437383
垢版 |
2008/02/16(土) 17:18:06ID:???
PDOを継承する形でこんなクラスにしてみました。
突っ込みどころ満載だと思うんだけど、とりあえず、このコーディング方法はやめておいたほうがいい、
っていうところを教えていただけると嬉しいです。

class DBConnect(){
// メンバ変数にDB接続情報を記述

function __construct(){} // PDOをインスタンス化
function getConnID(){} // PDOオブジェクト格納変数を返す
}

class TableCtrl extends PDO{} //PDOを継承、汎用関数を定義してもOK.

class CtrlA extends TableCtrl{ // テーブルAを操作する
protected $ConnID;
function __construct($ConnID){} //PDOオブジェクト格納変数を渡す
}
0438438
垢版 |
2008/02/16(土) 17:21:28ID:???
スクリプト先頭で、DBConnectをnewして、PDO格納オブジェクトを受け取ってから、
それを引数にCtrlAをnewする感じ……。
一応動きはするけど……全然ダメだな……。
0439nobodyさん
垢版 |
2008/02/16(土) 17:46:45ID:???
>>438
なんでもいいけど、既存のフレームワークがどうなっているか見てみろ。

見たら自分で作るきなくなるけどなw
0440438
垢版 |
2008/02/17(日) 16:53:21ID:???
>>439
返信ありがとう。

まったくわかってないみたいなので、クラスの設計方法から学び直します。

実際の処理をする具象クラスを作って、また別に、それを統括するクラスを作っていく。
複数のクラスを設定によって使い分けしなきゃいけない場合は、抽象クラスなりインターフェイスなりを継承(後者の場合は実装)させて、
メソッド名を統一させた上で、ポリモーフィズム――クラスによって同名メソッドの振る舞いを変えさせるって解釈でいいよね?――で実現させる。
基本こんな感じかな?

プリペアドステートメントに惹かれて、PDOを継承する形で作って見たんだけど、
DB接続関連の場合、接続IDを返してくるmysql_connect(); なんかのほうが、使いやすい気がする。

フレームワーク自作なんて、自分にとってはとんでもない話しですよ……。
0441nobodyさん
垢版 |
2008/02/17(日) 19:14:54ID:???
お前の下らない御託はいいから見ろっつの
0442nobodyさん
垢版 |
2008/02/17(日) 20:01:12ID:???
>>441
ごめん、無視してたわけじゃないんだ。
とりあえず、軽い「ちいたん」とやらを見てきます。

スレ汚し、ごめんなさい。自重します。
0443nobodyさん
垢版 |
2008/02/17(日) 20:03:55ID:???
なぜちいたんを選ぶか・・・
0444nobodyさん
垢版 |
2008/02/17(日) 20:08:23ID:???
( ゚д゚)ポカーン
0445nobodyさん
垢版 |
2008/02/17(日) 20:22:12ID:???
救いようが無いな。
0446nobodyさん
垢版 |
2008/02/17(日) 21:40:51ID:???
スレのレベルを下げちゃってごめんなさい……。

軽い「ちいたん」が入門にはちょうどいいかな、と思っての選択です。
いきなり、CakePHPなど大きいのを見ても、余計に混乱しそうだったので。

スレのレベルを余計に下げるだけなのでROMします。
度重なるスレ汚し、失礼しました。
0448nobodyさん
垢版 |
2008/02/22(金) 09:37:11ID:???
フレームワークをみてみろとアドバイスをしてくださってる方は、
もう少し具体的なアドバイスを出して欲しい。
具体的に、どんなフレームワークの構造を見て、どんなことを
学んだのかなどをあわせて出してくれたら、勉強もしやすいと
思うのですが。
0449nobodyさん
垢版 |
2008/02/22(金) 09:52:27ID:???
お前は人に逐一指示されないと何にもできないんだな
0450nobodyさん
垢版 |
2008/02/22(金) 09:59:49ID:???
フレームワークはどこに行けば手に入りますか?
0452nobodyさん
垢版 |
2008/02/22(金) 11:21:05ID:???
>>451
そのくらい自分で探せよという意味なのですが
0453nobodyさん
垢版 |
2008/02/22(金) 11:36:33ID:???
>>451
自分でDBの抽象化を考えてみて、クラスの定義だけでも書いてみろ。
その後にZFのZend_DBを見て、自分のとどう違うか、なぜそうなっているのかを考えろ。

それから、偉そうな態度で教えてもらおうと思うな。

0454nobodyさん
垢版 |
2008/02/22(金) 11:50:38ID:???
別に偉そうじゃないだろ。
むしろお前のほうが偉そうだ。
何被害妄想してるんだw
0455nobodyさん
垢版 |
2008/02/22(金) 12:50:26ID:???
本気でOOP勉強したい人はまずPHP止めないと・・
PHPの世界にOOPの参考になるものがどれほどある?
javaやらずOOP出来ましたってありえないでしょ。
0456nobodyさん
垢版 |
2008/02/22(金) 12:58:24ID:???
>>455
OOP勉強するなら、SmallTalkだな。
Javaとかアフォ?w
0457nobodyさん
垢版 |
2008/02/22(金) 13:04:24ID:???
本気でOOP勉強する為にPHPをやめる必要は無い。
PHP使いながら、OOP勉強すればいいだけ。

本気でOOP勉強をするなら、非実用的な言語も含めていろいろな
言語を使うことになる。そしてそれらが実用的かというと別の問題。

いくらsmalltalkでOOPをマスターしました!とかいっても
それでウェブサービスを作ることはまずありえないんだから

手段と目的を逆にしないようにね。
0458nobodyさん
垢版 |
2008/02/22(金) 13:04:45ID:???
その論争は、きりが無いから、マ板とかのOOPのスレでやって欲しい。
「スクリプトの世界ならRubyだろ。」とか、結論が見えてこないし、
このスレの趣旨とは違うと思う。
0459nobodyさん
垢版 |
2008/02/22(金) 13:06:38ID:???
>>457は非常にすばらしいことを言ったと思う。
0460nobodyさん
垢版 |
2008/02/22(金) 13:13:27ID:???
確かにPHPでOOPの解説をしている情報は非常に少ないので、
勉強の際はjavaやC#などの情報を読みながらやることになると思う。
しかし、PHPを辞めるまでする必要性は無いと思う。
言いたいのは「OOPの勉強するのなら、PHPに限定してはいけないよ。」
じゃないの?
0461nobodyさん
垢版 |
2008/02/22(金) 13:16:21ID:???
本気で勉強する為にPHPをやめた。
そしてOOPをマスターした。

しかし、Javaでは共有サーバーで動くソフトを作れなかった。
多くのオープンソースアプリはPHP製だった。

OOPをマスターしたが、何も出来なくなった。 完。
0462nobodyさん
垢版 |
2008/02/22(金) 13:27:17ID:???
前から思ってたんだが、頭の悪い人間が粘着してるな。
自分がどんな風に思われてるかも分かってないんだろうなw
0463nobodyさん
垢版 |
2008/02/22(金) 13:58:48ID:???
>>457
> いくらsmalltalkでOOPをマスターしました!とかいっても
> それでウェブサービスを作ることはまずありえないんだから

今やウエブサービスに欠かせないMVCはそもそもsmalltalkのOOP由来なんだが…。
継続ベースだって覚えておいて損はない。

http://www.ibm.com/developerworks/opensource/library/os-lightweight8/
http://www.ibm.com/developerworks/jp/java/library/j-cb07056/index.html
0464nobodyさん
垢版 |
2008/02/22(金) 14:19:47ID:???
PHPでOOPする為に別の言語でOOPの勉強をする。
自分の為に必要だからやるだけ。
0465nobodyさん
垢版 |
2008/02/22(金) 14:42:14ID:???
>>463
うん。だからさ勉強・研究の為の言語と
実用・開発の為の言語は別なの。
0466nobodyさん
垢版 |
2008/02/22(金) 17:56:13ID:???
このソースの解析をがんばればいろいろ見えてくるだろうけど、
一人じゃ到底無理だろうな。別スレでも立てて、解析して
ドキュメント作ろう!見たいなことやってみる?

Visual Studio 2008で見る.NET Frameworkのソースコード
http://www.atmarkit.co.jp/fdotnet/insiderseye/20080222sourcecode/sourcecode.html
> 公開されたソースコードには(もちろん英語だが)多くのコメントが入っており、
> ローカル変数名も元のままの“生”のソースコードである。
> そしてそれがVisual Studio 2008でシームレスにトレースできるようになる
0467nobodyさん
垢版 |
2008/02/23(土) 08:39:50ID:???
>>447
サンプル見たけど
Viewで変数が入らないとこで”を使ってる意味がわからない
”と’の使い方間違ってると思う
面倒な使いわけするならsprintfという手もある

パラメータ変数が渡ってくる
switch文のcaseに頭文字を大文字にしてる意味がわからない

0468nobodyさん
垢版 |
2008/02/23(土) 08:44:08ID:???
function html_head(){
echo "<html>";
echo "<head><title>BBS</title></head>";
echo "<body>";
}

上は、こうでいいやん!

function html_head(){
echo '<html>';
echo '<head><title>BBS</title></head>';
echo '<body>';
}

なんでダブルクォートやねん
0469nobodyさん
垢版 |
2008/02/23(土) 09:12:10ID:???
>>447

class View_Baseは
helper的な役割だからいいとしても

View_List
View_WriteFinish

コントローラで判断させるべき機能が
Viewで書かれてるし
テンプレート化されてないのもあって
ぐちゃぐちゃですね。
ここがOOP構造を理解しにくい作りになってる

コントローラは面倒でもOOP理解するには必要だ
理解しやすくするためにテンプレート化も必要
0470nobodyさん
垢版 |
2008/02/23(土) 09:19:29ID:???
>>447
本来コントローラとModelがやりとりする部分が
コントローラが無いために
Viewで処理されてる

MVモデルですね!
OOP構造化理解のためには
面倒でもMVCモデルじゃないと
初心者を間違った方向に導きますよ!!

0471nobodyさん
垢版 |
2008/02/23(土) 12:22:21ID:???
>>469
具体的にどうすればいいの?
条件分岐してないから切り分けは良さげに見えたんだが。
viewは機能ごとの静的HTML吐くのとは違うの?
0472nobodyさん
垢版 |
2008/02/23(土) 13:43:29ID:i4AYcehM
http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/DesMVC.aspx

これの

アクティブモデルは、コントローラとは関係なくモデルで状態が変更される場合に使用されます。
これは別のソースでデータが変更され、この変更をビューに反映する必要がある場合に起こります。
株価相場表示を例に考えてみます。株価データが変更された場合、外部ソースからデータを受け取り、チッカーバンドや警告ウィンドウなどのビューを更新する必要があります。
モデルの内部状態の変更が検知できるのはモデルだけなので、モデルからビューに表示を更新するよう通知する必要があります。

って、hoge.php?param1=aaa¶m2=iiiみたいなリクエストを解析してコントローラがそれに応じたビューを選択して云々
ではなくて、例えばブログだったら記事テーブルにまだ一つもデータが無いときは「まだ記事が登録されていません」のビューをモデルが選ぶ、ってことかい?

だとしたらどうやって実装したらいいんだろ・・・

そのモデルを使用するビューをモデルに登録しておいて、モデルのデータによって分岐させて使うビューを選択。そのときにビューは出力に必要なデータをモデルからひっぱりだす

MSDNは書き方がやたらめんどいぜ
0473nobodyさん
垢版 |
2008/02/23(土) 13:56:50ID:i4AYcehM
コントローラがリクエスト解析

そのリクエストにおいて必要なモデルのインスタンス生成

モデルのメソッド呼び出す

選択したビューのupdate呼びだして出力に必要な変数定義

モデルがビューの出力するメソッドを呼ぶ

ビューはモデルからの変更を受け付けるupdateメソッドと出力するためのputHtmlメソッド持つインターフェイスを実装する

なんか間違ってますか>< 教えてください!><
0474nobodyさん
垢版 |
2008/02/23(土) 14:42:12ID:???
なんですでにあるフレームワークを参考にしない?
0475474
垢版 |
2008/02/23(土) 14:43:18ID:???
474は無視してくれ
0476474
垢版 |
2008/02/23(土) 15:11:03ID:???
>>472
それはようするに、株価データのようにユーザーが
ページを更新しなくてもデータが更新されるときの話。

コントローラがモデルからデータ引っ張ってきて
そのデータをビューに渡して表示という処理は変わらない。
↑この処理を、普通は「URLを開いた」というタイミングで行っているわけ。

しかし、そのタイミングだと株価データ表示のようなリアルタイムでの表示は難しい
人間がF5を押す必要がある。この場合も更新されているとは限らず無駄に負荷が高くなる。

それを(ウェブアプリ以外では)モデルからデータが変更されたよーと
コントローラ・ビューに通知し、その通知が来たタイミングでコントローラ・ビューが
モデルからデータを引っ張ってきて(ry)という設計方法がある。
それが>>472で言っていること。

モデルに対して、コントローラやビューを「変更あったら俺に通知してくれ」
登録することでそれを実現する。
(データに変更があったらコントローラ・ビューのこの関数を呼び出してくれとモデルに登録する)


でも、この設計。モデル(つまりサーバー)から変更の通知をすることになるので
ウェブアプリでは一工夫必要になる。結局は、JavaScriptを使って
一定ごとに変更チェックをすることになるわけだが、まあそれをAjaxとかの技術で
非同期的にバックグラウンドで行うことにより、見た目上はサーバーから
変更通知がくるような感じに出来るんでしょ?やったこと無いけど。
その通知を元に、画面の一部、もしくはすべてを再描画する。



あとは詳しい人に任せた。
0477nobodyさん
垢版 |
2008/02/23(土) 17:10:06ID:i4AYcehM
>>476
レスd

オブザーバパターンはWebアプリに不向きなのかー。

じゃあ、
//コントローラの実行メソッド
public function doExecute(){
if($this->model->getArticleNum() === 0){
$message = '記事がまだ一つもありません';
require_once('./template/Error.php');
}else{
$this->view->putHtml();
}
}

こういう、コントローラがモデルからデータ引っ張ってきて分岐して、ビューを選択する、ってのはアリなのかな?

ちょっとCakePHPとかの資料ググってくるは
0478nobodyさん
垢版 |
2008/02/23(土) 17:50:55ID:???
そういう場合Comet使うんじゃね?
Cometすげえ!って大騒ぎになってたころ資料見ても俺には何がなんだか理解できなかったけど
0479nobodyさん
垢版 |
2008/02/23(土) 20:15:50ID:???
1を含めてコントローラの役割が全然わかってないんだよ!
MVモデルになってるんだよ!
CakePHP、symfonyのソースをよく解読してみろよ!
1のサンプルにはVIEWにコントローラで処理するコードかいてあるんだぜ!
0480nobodyさん
垢版 |
2008/02/23(土) 20:21:31ID:???
PHPでOOPを追求すると
結局はMVCモデルのフレームワークにテーマが行き着くんだよね
だったらPHPフレームワークのスレと同じじゃんて感じで
ここでOOPを議論するときは
MVCモデル以外を議論の対象にしたいよ
0481nobodyさん
垢版 |
2008/02/23(土) 20:27:22ID:???
>>478
ワロタ。目からうろこw
httpってのはクライアント(ブラウザ側)から聞くことしかできないんだ。
どうやってもサーバーから話しかけることはできない。

だから、たとえば一分おきに、
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わったよ!」

って聞かないといけない。たとえ4分半の時点でデータが変わっていても
5分後に聞くまでわからない。Cometというのは、
「データ変わったかい?」・・・・・・・・・・・(4分30秒後)「変わったよ!」・・・(数分後)「また変わったよ!」
とこうなる。

本質的にはクライアントから聞いているわけだが、変更があるまで
みのもんたみたいにずっと溜めてから返答するため、
負荷の軽減とリアルタイムな通知が実現できるというわけ。

しかし、いまさらだけどhttpで無茶やりすぎだw
0484nobodyさん
垢版 |
2008/02/23(土) 20:35:35ID:???
>>480
> PHPでOOPを追求すると
> 結局はMVCモデルのフレームワークにテーマが行き着くんだよね

それはPHPに限らず。

そもそもOOPが一番よく使われるのは、フレームワーク部分なんだよ。
OOPはフレームワークを作るときに使うものといっても過言じゃない。

通常のビジネスロジック部分は基本的に単純な命令の集まりになるので
OOPを使っているという感じは無くなる。
0485nobodyさん
垢版 |
2008/02/23(土) 20:43:56ID:???
>>484
だから結局フレームワークの議論になるんなら
このスレの意味が無いんだよ
0487nobodyさん
垢版 |
2008/02/23(土) 20:49:01ID:???
>>485
フレームワークスレは、フレームワークの比較などを話すスレ
OOPはフレームワークを題材に、OOPの話をするスレ

おk?
0488nobodyさん
垢版 |
2008/02/23(土) 20:53:31ID:???
>>486
class View_List extends View_Base{
//
function Write_HTML_head(){
$this->html_head();
$this->html_title("--- PHP で OOP の BBS ---");
echo "<hr>";
}

// 書き込みフォームを表示させる。
function Write_HTML_form(){
$this->html_form_start("index.php");
echo "<b>[メッセージを投稿する]</b><br>";
$this->html_input_hidden("PAGE", "Write");
echo "タイトル:<br>";
$this->html_input_text("title");
echo "<br>";
echo "メッセージ:<br>";
$this->html_textarea("msg");
echo "<br>";
$this->html_submit(" 書き込む ");
$this->html_form_end();
}
0489nobodyさん
垢版 |
2008/02/23(土) 20:54:28ID:???
//
function Write_HTML_foot(){
$this->html_foot();
}
//
function Write_HTML_data($line){
echo "<b>タイトル:</b>";
echo $line->GetName();
echo "<br>";
echo "<b>メッセージ:</b>";
echo $line->GetMsg();
echo "<hr>";
}
}
この中のどこがコントローラで判断させるべき処理なんだ?
0490nobodyさん
垢版 |
2008/02/23(土) 20:57:01ID:???
>>487
OOPはフレームワークを題材に、OOPの話をするスレならプログラム板だろ?
初心者だらけの、ここよりも良レスが来ると思うんだが
PHPにこだわる理由がわからない
WEBでのフレームワークならどれも仕組みは同じだろうに
じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
0491nobodyさん
垢版 |
2008/02/23(土) 21:21:33ID:???
function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}

これは下記がいいだろ?

function GetNextData(){

$ans = "";
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}

return $ans;
}
0492nobodyさん
垢版 |
2008/02/23(土) 21:36:01ID:???
// データを1行読み出す。
function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}

変数名の最後に数字使うのは初心者だろ?
もしコード拡張で数値計算が入ったら紛らわしい
0493nobodyさん
垢版 |
2008/02/23(土) 21:39:32ID:???
// データを最後に追記する。
function AddLast($title, $msg){
// ファイルを開く
$hd = fopen($this->m_file_name , "a");
// データを書き込む
$line = $title . $this->m_pause_chr . $msg . "\n";
fwrite($hd, $line);
// ファイルを閉じる
fclose($hd);
}

なんでflock入れないの?
0494nobodyさん
垢版 |
2008/02/23(土) 21:47:30ID:???
$line2 = split($this->m_pause_chr, $line);

はこれの方がわかりやすいだろ?

list($name,$msg) = split($this->m_pause_chr, $line);
0495nobodyさん
垢版 |
2008/02/23(土) 21:52:46ID:???
function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}

これは下記に修正した方がわかりやすいよ

function GetNextData(){

$ans = "";
if( $line = fgets($this->m_file_hd, 1024) ){
 list($name,$msg) = split($this->m_pause_chr, $line);
 $ans = new Line();
 $ans->SetData($name, $msg);
}

return $ans;
}
0496nobodyさん
垢版 |
2008/02/23(土) 21:55:49ID:???
変数にオブジェクトが入ってくるなら
初期化はこうだった

function GetNextData(){

$ans = null;
if( $line = fgets($this->m_file_hd, 1024) ){
 list($name,$msg) = split($this->m_pause_chr, $line);
 $ans = new Line();
 $ans->SetData($name, $msg);
}

return $ans;
}
0497nobodyさん
垢版 |
2008/02/23(土) 22:04:10ID:???
else{
$ans = "";
}

これ全部

$ans = null;
に初期化に変えて
elseとっぱらった方がいいよ

返り値はオブジェクトが入ってるか入ってないかという処理なのに
空文字を返すのよくないよ!
0498nobodyさん
垢版 |
2008/02/23(土) 22:44:30ID:???
まぁ空文字もnullも演算子によっては同様にfalse扱いできるという点がPHPの特徴なわけで
0499nobodyさん
垢版 |
2008/02/24(日) 05:50:47ID:???
>>490
> じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
人気が無い言語だからw
0500nobodyさん
垢版 |
2008/02/24(日) 11:09:06ID:???
プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
OOP習得が目的ならあまりにも無謀だし、全くもって得策ではない。

フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
結局OOPの意味が無いんではないだろうか?むしろそれが出来てしまうPHPは
OOP理解には全く向いていない言語だとも思うのだ。

でも不完全ながら、PHPでOOPっぽくコーディングすること自体は楽しいと思う。
0501nobodyさん
垢版 |
2008/02/24(日) 11:31:24ID:???
>>500
> プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
どんな言語でも当たり前。

> フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
> 結局OOPの意味が無いんではないだろうか?
まったく関係ない。
0502nobodyさん
垢版 |
2008/02/24(日) 14:04:04ID:???
PHPでOOPするには
初心者じゃ無理だよ
オブジェクトの設計は上手に出来ても
コーディングレベルで初心者ならではのミスが目立つ
0503nobodyさん
垢版 |
2008/02/24(日) 14:08:38ID:???
PHPでOOP勉強は適してないよ
JAVA,C#,rubyみたいに
OOPを前提として作られた言語じゃないからね
0504nobodyさん
垢版 |
2008/02/24(日) 15:14:16ID:???
「PHPでOOPは」みたいな話は何度も出てるのに、いつも具体的な話にならないのは何で?
レスを投稿する


ニューススポーツなんでも実況