PHPでOOP (894レス)
1-

398
(1): 2008/02/14(木)12:33 ID:??? AAS
とりあえずDBアクセスはPDOでいい。
各操作系に保持させるならプリペアドステートメントを。

個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
テーブルに対する操作は静的メソッドで実装する。

どうでもいいがクラスってのは抽象データ型なので関数と比べるなんてしてるとハマる。
399: 2008/02/14(木)12:59 ID:??? AAS
UMLモデリングツールでPHP書いている人いる?
具体的には「Umbrello」を業務で使っている人
400: 2008/02/14(木)13:18 ID:??? AAS
C#の記事だけど、継承に関するものをみつけた。
Column - 継承を使うべき場合、使うべきではない場合 -
外部リンク[html]:www.atmarkit.co.jp
401: 2008/02/14(木)14:54 ID:??? AAS
>>397
> というのは、OOが本質的にDB向きではないということだと考えてる。
逆逆、リレーショナルデータベースが、OO向きじゃない。
402: 2008/02/14(木)15:00 ID:??? AAS
>>398
> 各操作系に保持させるならプリペアドステートメントを。
プリペアドステートメントは条件の数を変えにくいという
大きな欠点があるからなぁ。

> 個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
一般に言われている、ActiveRecordパターンですね。
Ruby on RailsやCakePHPで採用されている奴です。
403: 2008/02/14(木)15:08 ID:??? AAS
>>383
> テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
> 両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?

処理の負荷というより、決定的な問題がある。

それは主にトランザクションを使ったときに起こる。

複数のテーブルを操作することで、一つの処理を完成させる場合
中途半端な状態を他に見せないようにしなければいけないし、
また一つのテーブルで処理が失敗した場合すべてを元に戻さなければならない。

これを実現する為に同じ接続から見える状態と、違う接続からみえる状態で
違うことがある。
404
(2): 2008/02/14(木)15:18 ID:??? AAS
PHPやWebアプリに限らないけど、OOPってのはフレームワークを作るためにある。
ここで言うフレームワークには、汎用の名前があるフレームワークだけじゃなく
たとえばあるゲームの独自の基本システムなんていったものも含む。

このフレームワークを使って作るもの・・・すなわち、
フレームワークから呼び出されるコードは、単純な処理になるので
(というか単純な処理ですむ為のフレームワーク)
OOPにならないことが多い。

だからといって、システム全体がOOPになっていないとは思わないけどね。
システム全体の一部。つまりクラスの中のメソッドだけを見て
非OOPというのはおかしいでしょ?
405: 2008/02/14(木)15:30 ID:??? AAS
>>404
誰に言ってるの??
406: 2008/02/14(木)15:35 ID:??? AAS
誰に言ってるのかも気になるが、そんなこと誰が言ってるのかも気になる。
OOPがフレームワークのためにあるという主張は初めて聞いた。
407
(2): 2008/02/14(木)15:36 ID:??? AAS
>>384>>389>>390 も気持ち悪すぎだ
普通に考えるとこういう感じだろう?

// 接続に関する抽象クラス。汎用で使える関数があれば定義しても良い。
class CDB_Connection {}

// PostgreSQL接続用クラスの実装
class CDB_PostgreSQL extends CDB_Connection {}

// MySQL接続用クラスの実装
class CDB_MySQL extends CDB_Connection {}

// テーブルに関する抽象クラス。汎用で使える関数があれば定義しても良い。
class CTable {}
省6
408
(3): 2008/02/14(木)15:41 ID:??? AAS
>>407
概ね同じ意見だけど、Cpersonalを実体化する必要ってあんまりなさそうだから、
自分はメソッドを staticにすることが多い。

あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
SQLを実行できてしまうので、引数で渡すようにしてる。
(まぁ、staticにしたら引数で渡すしかないけど)
409
(1): 2008/02/14(木)15:45 ID:??? AAS
>>408 に補足
必要性がないというより、CTable (のサブクラス)のインスタンスをnewするということは、
意味論的には、そのテーブル自体を新規に生成するということだから、ちょっと気持ち悪い。
410
(1): 2008/02/14(木)15:48 ID:??? AAS
>>389
> 私は、DBをPostgreSQLからMySQLへ変換する必要性も生じることを
> 想定した設計をしただけだよ。
> こうやっておけば、書き換えるコードも少なくて済む。

とか言っておきながら、

> // コンストラクタ
> function CSearch_Personal(){
> $db_info = ""; // ここでDB接続に必要な情報を入れる。
> $this->m_db = new CDB_PostgreSQL($db_info);
> }
省10
411
(1): 2008/02/14(木)15:49 ID:??? AAS
>>404は、「バージョン6までのVBって構文は構造化だけど、
内部的にはクラスが動いているんだよ」といってるのと
同じ意味のように思える。
誰に何を伝えたいのかは良く分からないが。
412
(6): 2008/02/14(木)15:51 ID:??? AAS
>>408-409

まあ、そこは設計しだいでいくつかやり方があるけど、
ActiveRecordパターンの場合、インスタンスはテーブルを作るという意味ではなく、
クラスがテーブル全体で、そのインスタンスはテーブルのレコードという扱いになる。
そしてフィールドがプロパティ。
413: 2008/02/14(木)15:53 ID:??? AAS
>>411
一応突っ込み。VBにはクラスがある。(少なくとも5以上)
もちろんnewでインスタンスも生成できる。
414
(1): 2008/02/14(木)16:01 ID:??? AAS
>>412
これですかね。
外部リンク[html]:www.martinfowler.com

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

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

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

ただし、PHP4に対応した書き方だとすごく気持ち悪いんだが(笑)
CakePHPでgetInstance()というメソッドをキーワードにして探せば
省4
416
(1): 2008/02/14(木)16:13 ID:??? AAS
>>415
>なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

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

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

connection をDBアクセスする権限と見るならば、その権限は処理に対して与えるべきで、
オブジェクトに対して与えるべきではないだろうということ。
420: 2008/02/14(木)17:56 ID:??? AAS
DB周りはZendFrameworkの実装でなんら不満ないなあ。
421
(1): 412 2008/02/14(木)18:14 ID:??? AAS
>>419
しかし、テーブルに関するクラスでデータベースを操作しないメソッドって
あまりないからなぁ。まあ別にいいけどね。
422
(1): 2008/02/14(木)18:51 ID:??? AAS
>>421
例えば Personテーブルに depart_codeがあるとして、$person->getDepartName() としたときに、
暗黙のうちにdepart_codeをキーとしてDepartテーブルから検索する SQLが実行されたら嫌だし、
setPersonNameされたときに、そのタイミングでupdateが実行されていないか疑わなきゃいけないのも嫌。
423: 2008/02/14(木)19:13 ID:??? AAS
>>422
メソッドの実装がどうなってようが呼んだ方の知ったこっちゃないだろ。
そのどっちの例もそのクラスの仕様なんだから。
それを外側から知ろうとか制御しようだなんておかしな話だ。
424
(1): 2008/02/14(木)19:41 ID:??? AAS
そもそもstaticも存在しないPHP4で機能をまとめたようなクラス(CDB_PostgreSQLクラスみたいなの)
を作ろうとしてるのが気持ち悪い。

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

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

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

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

> 一般的な業務アプリでは、クラスを細かくしすぎてしまうとどこで何を行っているのかが
> 分かりづらくなり、結果的にメンテナンスしづらいアプリになることがある。
省3
429: 2008/02/15(金)20:19 ID:??? AAS
たまに昔のサイト触ったりすると非OOPなんてもうやってらんねーと思う
DRYになってないから直すの大変
430: 2008/02/15(金)22:23 ID:??? AAS
OOPってのは設計的な考え方ってのが含まれるんだけど、
そういう考え方は別として、単にコーディング技法として便利だよ。
431
(1): 2008/02/15(金)22:36 ID:??? AAS
>>272
プリミティブだけど実装してみました・・
もはやQuickFormとSmartyがないと動きませんが・・
外部リンク:briefcase.yahoo.co.jp
432: に ◆lKs5QMUHoA 2008/02/15(金)23:49 ID:??? AAS
風邪をひいてしまい、最近頭が回らないです。レスも遅れてしまってます。。。

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

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

>>410
> 接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から与える。
この発想は思いつきませんでした。
省1
433: に ◆lKs5QMUHoA 2008/02/15(金)23:50 ID:??? AAS
>>431
サンプルありがとうございます。
あとでソースを読んでみます。
434: 383 2008/02/16(土)00:15 ID:??? AAS
質問しておきながら、反応かなり遅れてしまってごめんなさい。

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

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

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

ASP.NETで学ぶVisual Studio .NETの魅力
第2回 Visual Studio.NETでプログラム・レス開発を学ぶ(前編)
外部リンク[html]:www.atmarkit.co.jp

だが、こういうのは逆にそのフレームワークに縛られてしまうのが欠点だな。
準備されてるコントロールを自分の意図するようにやりたいが、その方法が誰も分からない
もしくは、出来ない場合は、それで終わりみたいな。
省6
436: 2008/02/16(土)12:59 ID:??? AAS
Accessではグリッドが無いけれど、サブフォームで代用する方法はある。
しかし、そのカスタマイズ度は低い。(確か、クリックしたセルの場所を
取るとか、一つのセルだけ色を変更するとかがかなり苦手だったような。)
サブフォームで代用できない場合は、フォーム上にグリッドを貼り付けるような
モジュールは無いので、DBへのアクセス手段が手軽なものを捨ててでも
VBで0から作り直すのが一般的な選択方法となる。

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

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

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

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

class CtrlA extends TableCtrl{ // テーブルAを操作する
省3
438
(3): 438 2008/02/16(土)17:21 ID:??? AAS
スクリプト先頭で、DBConnectをnewして、PDO格納オブジェクトを受け取ってから、
それを引数にCtrlAをnewする感じ……。
一応動きはするけど……全然ダメだな……。
439
(1): 2008/02/16(土)17:46 ID:??? AAS
>>438
なんでもいいけど、既存のフレームワークがどうなっているか見てみろ。

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

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

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

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

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

スレ汚し、ごめんなさい。自重します。
443: 2008/02/17(日)20:03 ID:??? AAS
なぜちいたんを選ぶか・・・
444: 2008/02/17(日)20:08 ID:??? AAS
( ゚д゚)ポカーン
445: 2008/02/17(日)20:22 ID:??? AAS
救いようが無いな。
446: 2008/02/17(日)21:40 ID:??? AAS
スレのレベルを下げちゃってごめんなさい……。

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

スレのレベルを余計に下げるだけなのでROMします。
度重なるスレ汚し、失礼しました。
447
(3): 1 ◆SWtzLesEmM [age] 2008/02/17(日)23:11 ID:??? AAS
>>324
>>335
掲示板スクリプトの改善、どうもありがとうございます。(*^^*)v

↓動作サンプルを設置しました。

外部リンク:ssurl.net
外部リンク:ssurl.net
448: [age] 2008/02/22(金)09:37 ID:??? AAS
フレームワークをみてみろとアドバイスをしてくださってる方は、
もう少し具体的なアドバイスを出して欲しい。
具体的に、どんなフレームワークの構造を見て、どんなことを
学んだのかなどをあわせて出してくれたら、勉強もしやすいと
思うのですが。
449
(1): 2008/02/22(金)09:52 ID:??? AAS
お前は人に逐一指示されないと何にもできないんだな
450
(1): 2008/02/22(金)09:59 ID:??? AAS
フレームワークはどこに行けば手に入りますか?
451
(2): 2008/02/22(金)11:02 ID:??? AAS
>>449
漠然としすぎていて良く分からないのである程度は具体例が
欲しいという意味なのですが。

>>450
こちらへどうぞ
【PHP】フレームワークについて語るスレ10【総合】
2chスレ:php
452: 2008/02/22(金)11:21 ID:??? AAS
>>451
そのくらい自分で探せよという意味なのですが
453: 2008/02/22(金)11:36 ID:??? AAS
>>451
自分でDBの抽象化を考えてみて、クラスの定義だけでも書いてみろ。
その後にZFのZend_DBを見て、自分のとどう違うか、なぜそうなっているのかを考えろ。

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

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

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

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

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

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

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

外部リンク:www.ibm.com
外部リンク[html]:www.ibm.com
464: 2008/02/22(金)14:19 ID:??? AAS
PHPでOOPする為に別の言語でOOPの勉強をする。
自分の為に必要だからやるだけ。
465: 2008/02/22(金)14:42 ID:??? AAS
>>463
うん。だからさ勉強・研究の為の言語と
実用・開発の為の言語は別なの。
466: 2008/02/22(金)17:56 ID:??? AAS
このソースの解析をがんばればいろいろ見えてくるだろうけど、
一人じゃ到底無理だろうな。別スレでも立てて、解析して
ドキュメント作ろう!見たいなことやってみる?

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

パラメータ変数が渡ってくる
switch文のcaseに頭文字を大文字にしてる意味がわからない
468: 2008/02/23(土)08:44 ID:??? AAS
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>';
省2
469
(5): 2008/02/23(土)09:12 ID:??? AAS
>>447

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

View_List
View_WriteFinish

コントローラで判断させるべき機能が
Viewで書かれてるし
テンプレート化されてないのもあって
ぐちゃぐちゃですね。
ここがOOP構造を理解しにくい作りになってる
省2
470: 2008/02/23(土)09:19 ID:??? AAS
>>447
本来コントローラとModelがやりとりする部分が
コントローラが無いために
Viewで処理されてる

MVモデルですね!
OOP構造化理解のためには
面倒でもMVCモデルじゃないと
初心者を間違った方向に導きますよ!!
471
(1): 2008/02/23(土)12:22 ID:??? AAS
>>469
具体的にどうすればいいの?
条件分岐してないから切り分けは良さげに見えたんだが。
viewは機能ごとの静的HTML吐くのとは違うの?
472
(1): 2008/02/23(土)13:43 ID:i4AYcehM(1/3) AAS
外部リンク[aspx]:www.microsoft.com

これの

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

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

だとしたらどうやって実装したらいいんだろ・・・
省2
473: 2008/02/23(土)13:56 ID:i4AYcehM(2/3) AAS
コントローラがリクエスト解析

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

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

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

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

ビューはモデルからの変更を受け付けるupdateメソッドと出力するためのputHtmlメソッド持つインターフェイスを実装する
省1
474
(2): 2008/02/23(土)14:42 ID:??? AAS
なんですでにあるフレームワークを参考にしない?
475: 474 2008/02/23(土)14:43 ID:??? AAS
474は無視してくれ
476
(1): 474 2008/02/23(土)15:11 ID:??? AAS
>>472
それはようするに、株価データのようにユーザーが
ページを更新しなくてもデータが更新されるときの話。

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

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

それを(ウェブアプリ以外では)モデルからデータが変更されたよーと
コントローラ・ビューに通知し、その通知が来たタイミングでコントローラ・ビューが
省12
477: 2008/02/23(土)17:10 ID:i4AYcehM(3/3) AAS
>>476
レス?

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

じゃあ、
//コントローラの実行メソッド
public function doExecute(){
if($this->model->getArticleNum() === 0){
$message = '記事がまだ一つもありません';
require_once('./template/Error.php');
}else{
省5
478
(1): 2008/02/23(土)17:50 ID:??? AAS
そういう場合Comet使うんじゃね?
Cometすげえ!って大騒ぎになってたころ資料見ても俺には何がなんだか理解できなかったけど
479
(4): 2008/02/23(土)20:15 ID:??? AAS
1を含めてコントローラの役割が全然わかってないんだよ!
MVモデルになってるんだよ!
CakePHP、symfonyのソースをよく解読してみろよ!
1のサンプルにはVIEWにコントローラで処理するコードかいてあるんだぜ!
480
(1): 2008/02/23(土)20:21 ID:??? AAS
PHPでOOPを追求すると
結局はMVCモデルのフレームワークにテーマが行き着くんだよね
だったらPHPフレームワークのスレと同じじゃんて感じで
ここでOOPを議論するときは
MVCモデル以外を議論の対象にしたいよ
481: 2008/02/23(土)20:27 ID:??? AAS
>>478
ワロタ。目からうろこw
httpってのはクライアント(ブラウザ側)から聞くことしかできないんだ。
どうやってもサーバーから話しかけることはできない。

だから、たとえば一分おきに、
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わったよ!」
省8
482: 2008/02/23(土)20:30 ID:??? AAS
例え巧すぎワロタ
483
(1): 2008/02/23(土)20:32 ID:??? AAS
>>479
だから具体的にどこがだよ?
484
(1): 2008/02/23(土)20:35 ID:??? AAS
>>480
> PHPでOOPを追求すると
> 結局はMVCモデルのフレームワークにテーマが行き着くんだよね

それはPHPに限らず。

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

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

おk?
488
(1): 2008/02/23(土)20:53 ID:??? AAS
>>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(){
省12
489
(1): 2008/02/23(土)20:54 ID:??? AAS
//
function Write_HTML_foot(){
$this->html_foot();
}
//
function Write_HTML_data($line){
echo "<b>タイトル:</b>";
echo $line->GetName();
echo "<br>";
echo "<b>メッセージ:</b>";
省5
490
(2): 2008/02/23(土)20:57 ID:??? AAS
>>487
OOPはフレームワークを題材に、OOPの話をするスレならプログラム板だろ?
初心者だらけの、ここよりも良レスが来ると思うんだが
PHPにこだわる理由がわからない
WEBでのフレームワークならどれも仕組みは同じだろうに
じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
491: 2008/02/23(土)21:21 ID:??? AAS
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;
}
省10
492: 2008/02/23(土)21:36 ID:??? AAS
// データを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;
省3
493: 2008/02/23(土)21:39 ID:??? AAS
// データを最後に追記する。
function AddLast($title, $msg){
// ファイルを開く
$hd = fopen($this->m_file_name , "a");
// データを書き込む
$line = $title . $this->m_pause_chr . $msg . "\n";
fwrite($hd, $line);
// ファイルを閉じる
fclose($hd);
}
省1
494: 2008/02/23(土)21:47 ID:??? AAS
$line2 = split($this->m_pause_chr, $line);

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

list($name,$msg) = split($this->m_pause_chr, $line);
495: 2008/02/23(土)21:52 ID:??? AAS
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;
}
省10
496: 2008/02/23(土)21:55 ID:??? AAS
変数にオブジェクトが入ってくるなら
初期化はこうだった

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;
省1
497: 2008/02/23(土)22:04 ID:??? AAS
else{
$ans = "";
}

これ全部

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

返り値はオブジェクトが入ってるか入ってないかという処理なのに
空文字を返すのよくないよ!
1-
あと 397 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.038s