PHPでオブジェクト指向プログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/04/17(日) 16:55:57ID:iM4mgYnJPHPによるOOPについて語りましょう。
0175nobodyさん
2005/06/10(金) 22:00:46ID:Ba+L/9uuスレッドのタイトルが『PHPでオブジェクト指向プログラミング』となっているのだから、
相手を貶めたい人やらプロだのアマだのにこだわりたい人は邪魔ですよ。
この流れではスレッドの趣これい旨に沿った話題の展開さえままならない。
これ以上続けられても迷惑なばっかりなのでそろそろ止めてくれ。
小学生でも無いだろうし、お互い大人になろうよ。
0176nobodyさん
2005/06/10(金) 22:04:25ID:???ポリモーフィズム∈OOP
じゃないのか?
それにSmalltalkもObjCも型付け出来ないぞ。
静的型付けは確かに有用だが、
OOPに必ずしも必要という訳ではない。
それぞれの利点を考慮して
言語の性質に見合った設計をしていく事が大切だと俺は思う。
0177nobodyさん
2005/06/11(土) 00:19:38ID:???多態って言うなぁ
漢字にした方が、初心者の人でも、何のことかイメージしやすいし
相手が理解できない専門用語を言って満足してるアホみたいだから、横文字は好きじゃない
0180169
2005/06/11(土) 01:57:38ID:???ポリモーフィズムじゃヤダとか駄々をこねるので仕方なく多態でいってやろう。
だいたいお前の職場だろうがこのスレだろうが意味が通じることが重要ってのがお前の主張じゃないのか?
少なくともこのスレではポリモーフィズムを多態と言わなかったがための誤解なんてなかった気がするが。
>>176
俺はPHPには型がないからOOじゃないなんて言ってない。
PHPでOOP的な多態がどういう位置付けなのかを疑問に思っただけ。
Smalltalkを持ち出すってことは>>169も多態ってことになるんだろうが、そんなこと言ったらPHPにオブジェクト指向が導入される前からある言語仕様も全て多態って話になるだろ。
全ての変数は内部的に数値なのか文字列なのか配列なのかオブジェクトなのか、、、によって実行時に動的に振る舞いが決まるわけだからな。
0181nobodyさん
2005/06/11(土) 11:07:10ID:???それを阻む奴は、とことん攻撃するみたいなw
0182nobodyさん
2005/06/11(土) 12:01:10ID:???散々暴れて散々叩かれて消滅したが、実は何かをわかってて釣っていたのだろうか。
いや、それはない(反語)。
で、PHPのポリモーフィズムって結局何なのさ?
オブジェクト指向を謳うなら一言説明がほしいとこだ。>PHP
0183nobodyさん
2005/06/11(土) 23:59:38ID:???だからJAVA厨は嫌われるんだよ。
PHPでOOPやってる奴なら常識なのに。
0185nobodyさん
2005/06/12(日) 01:10:40ID:???お前も多態とか言って誤魔化しとけよwww
0186nobodyさん
2005/06/12(日) 02:11:20ID:???ポリモーフィズムというのはOOが持つ特性であって、
開発者がポリモーフィズムであることを意図していない機能は
それに「見えるような」振る舞いをしたとして、
あなたがそれをポリモーフィズムだと言っても、
それはあくまで主観(というかあなたの勝手な認識)でしかない。
0187nobodyさん
2005/06/12(日) 03:21:50ID:???引数や実行される環境によって振る舞いを変えればいいわけだし。
メンテナンス性などを考えればOOPな方がいいだろうけど。
PHP4での例とすれば、PEAR::DBなんかはポリモーフィズムじゃない。
DB::connectは渡されたDSNから判断して、DB_commonを継承した
各DBのサブクラスをインスタンス化して委譲することによって
多くのDBに対応している。
↓勘違いしてたらツッコミよろ↓
0188180
2005/06/12(日) 04:43:28ID:???微妙にワロタ
>>186
俺の言いたいのはあくまで
>PHPでOOP的な多態がどういう位置付けなのかを疑問に思っただけ。
であって
>(〜中略〜)ってことは(〜中略〜)全て多態って話になるだろ。
はただの推論なんで、そこに茶々いれられても。
(そこつっこんだわけじゃなかったならスマソ)
まー言語の開発者がポリモーフィズムを意図したかどうかに焦点があるべきなのは同意。
ただ直接聞くわけにもいかないからここで話してるわけで。
>>187
同意。たしかにそういうのもポリモーフィズムと言えると思う。
PEARに限らずPHPを使う側が意図してポリモーフィズム的な振る舞いを実装することはできる。
あとはPHPの言語仕様自体にポリモーフィズムがどう盛り込まれてるかって話。
はっきり言ってアフォな俺にはなかなかわからない。
0189187
2005/06/12(日) 05:42:38ID:???>あとはPHPの言語仕様自体にポリモーフィズムがどう盛り込まれてるかって話。
俺はJavaを知らない(つーかRubyもC++も知らん)のだけど、Javaにはどのように
盛り込まれているの? インターフェイスがそうなのか? それとも抽象クラスやメソッドを
定義できること?
0190nobodyさん
2005/06/12(日) 06:25:01ID:???Oya obj = new Ko();
obj.func();
で子クラスのメソッドが呼ばれる。
C++の場合は親クラスのメソッドにvirtualっていうキーワードをつけないと親クラスのメソッドが呼ばれてしまう(objがOya型として宣言されているため)。
ルビーは知らない。
0191nobodyさん
2005/06/12(日) 10:32:33ID:???0192nobodyさん
2005/06/12(日) 10:34:06ID:???0193nobodyさん
2005/06/12(日) 10:34:48ID:???0194nobodyさん
2005/06/12(日) 11:06:09ID:???188 名前:180[sage] 投稿日:2005/06/12(日) 04:43:28 ID:???
>>183-185
微妙にワロタ
0195nobodyさん
2005/06/12(日) 12:23:54ID:???0196nobodyさん
2005/06/12(日) 12:38:57ID:wbP1UJDj誰もわかんないのかよー!
俺もわかんないよー!
ヤケクンのアゲ
0198nobodyさん
2005/06/12(日) 14:06:38ID:???0200nobodyさん
2005/06/12(日) 17:57:05ID:wbP1UJDjVBかよ
0201nobodyさん
2005/06/12(日) 18:08:57ID:???OOPに標準とかあるのか知らないのが、とりあえず
ttp://www.computerlanguage.com/webexamples.htm
での検索結果によると、
>the ability of a generalized request (message) to produce different results based on the object that it is sent to
ま、OOP的に言えば、同じ名前のメソッドでもインスタンスの動的な状態(実行時の状態)に応じて適切にメソッドが呼ばれるってことだと解釈しておけばいいんじゃないの?
とりあえず俺も>>197の意見が聞きたい
0203nobodyさん
2005/06/13(月) 11:30:16ID:???0204nobodyさん
2005/06/13(月) 11:38:44ID:???$obj->method();
}
f を呼び出したとき $obj がどのクラスなのかに応じて適切な method() が呼び出されるわけだが。
0205nobodyさん
2005/06/13(月) 15:04:45ID:???0206nobodyさん
2005/06/13(月) 15:18:16ID:???わけだが。
0207nobodyさん
2005/06/13(月) 15:43:38ID:???そのコード読んで思ったんだけど、ビュークラスやDBクラスを分けてオブジェクト指向っぽく取り扱ったところで、糞分かりづらいだけでまったく意味ねえな、と。
0208nobodyさん
2005/06/13(月) 16:21:03ID:???0209nobodyさん
2005/06/13(月) 23:29:38ID:???いろんな型のデータを区別せずに扱えますよ、
ということだと認識してる。
同じ扱いなのに、実際のふるまいがポリモってるよ!という感じ?
だもんで、型がない場合は、その時点でてけとうに
ポリモーフィズムが実現されすぎちゃって困ってる、
という状況なんだと思われ。
型で制約されている場合でも、仮想関数表なんかを管理しとけば
どっこいポリモれちゃうんですよ奥さん、と。
(もともとは関数型言語方面で、このリスト型だとどんな型の値でも
ぶらさがりますよ、とか、関数を引数の型の微妙な違いで
オーバーロードできますよ、とかいうのがポリモーフィズム
だったらしいけど、OOP方面ではふつうそういうのまで
ポリモーフィズムとは言わない、よね?)
0210nobodyさん
2005/06/14(火) 03:02:54ID:???0211nobodyさん
2005/06/14(火) 03:17:23ID:???同意。
実装をする側がクラスごとに適切に書いておけば、それを使う側はオブジェクトごとにいちいち区別しなくても同じように使えて正しく動く。
それがOOP的ポリモーフィズムの利点だわな。
ま、
>ポリモーフィズムが実現されすぎちゃって困ってる
のかどうかは微妙な線だが、PHPなどの型なし言語はもともとポリモーフィズム的振る舞いをしていたから、殊にPHPでOOを導入する時に「この部分がポリモーフィズムだよ」という必要がなかったってこっちゃな。
>もともとは関数型言語方面で、(・・・)、とかいうのがポリモーフィズム
ってのは初めて知った。
0213nobodyさん
2005/06/14(火) 04:02:57ID:???0214nobodyさん
2005/06/14(火) 05:12:52ID:???違ったモノに同じ命令で言うこと聞かせられるようにすることだよ。
0215nobodyさん
2005/06/14(火) 10:10:02ID:???0217nobodyさん
2005/06/14(火) 16:20:27ID:???でも>>214でなんか少しわかった気がする。
動的束縛がなんちゃらとか、なんかすでにポリモーフィズムをわかっている人にしかわからない言葉を説明に使わないでほしい。
難しそうなことをいろいろ知ってるのはわかったから、それをわかりやすく説明できるようになってほしい。
でないとあんたらの頭の良さは全然伝わらないってことに気づいてほしい。
0218nobodyさん
2005/06/14(火) 17:03:30ID:???ある親クラスを継承した子クラスがすべて同じ名前のメソッドを持っていて
オブジェクトが変わると同じメソッドでも振舞いが変わるというように
理解したんだけど違う?
0219nobodyさん
2005/06/14(火) 17:42:45ID:???○ 振る舞いを変えることができる(メソッドのオーバーライド(override : 覆す、無効にする))
0220nobodyさん
2005/06/14(火) 18:06:57ID:???もともとここは初心者に説明するためのスレじゃないし
話の流れ的にも >>197 の講釈を待ってる間に野次馬ががやがや言ってるだけかと
素直に「動的束縛ってなんのことだかわからないので教えてください」と頭を下げれば
親切な人が教えてくれるんじゃないか
0221nobodyさん
2005/06/14(火) 19:59:09ID:???0224nobodyさん
2005/06/15(水) 02:40:19ID:???リスコフの置換原則は次のように謂う、
「派生クラスは、ユーザーが基底クラスとの違いに気付かずに、
基底クラスのインターフェイスを通じて使用できるものでなければならない。」
とゆうことは、
継承したクラスで独自にメソッド増やすのはよろしくないってこと?
0225224
2005/06/15(水) 02:42:17ID:???0226224
2005/06/15(水) 02:49:04ID:???基底クラスのメソッドは
継承クラスも基底クラスと同様に実装しておけってことで、
新しいメソッドを持つなって言ってるんじゃないね。そりゃそうか…
0227nobodyさん
2005/06/15(水) 03:19:21ID:???0228nobodyさん
2005/06/15(水) 03:42:43ID:???0229nobodyさん
2005/06/15(水) 03:46:15ID:???0230nobodyさん
2005/06/15(水) 04:30:26ID:???あーなんか静的束縛の説明が微妙にあやしーと思って一旦エディタに移動させたら
失敗して消えて頭もまっしろんなってる厨のいるスレはまさにここですYO
0231nobodyさん
2005/06/15(水) 07:50:33ID:???◆まずは下準備として、親クラス←子クラス←孫クラスという継承関係とする。
↓のように、親クラスでfuncというメソッドを宣言し、孫クラスでのみオーバーライドする。
class Oya { func() {return "親";} }
class Ko extends Oya { }
class Mago extends Ko { func() {return "孫";} }
◆ここで子クラスのオブジェクトobjを宣言してみる。
↓のように、ユーザ入力など実行するまで未定な要素をからめたコードを書く。
Ko obj; /* 子クラスのオブジェクトとして宣言。 */
switch ( ユーザ入力 ) {
case "子": obj = new Ko();
case "孫": obj = new Mago();
}
/* ここで問題。 */
obj.func();
◆さて、実行時にユーザが"孫"と入力した場合について考えてみる。
objにはnewによって孫クラスの実体(の参照)が代入されました。
obj.func()は"親"を返すのか?それとも"孫"を返すのか?
もう一度書いておくけど、objは親でも孫でもなく、子クラスとして宣言されたオブジェクト。
0232nobodyさん
2005/06/15(水) 07:51:09ID:???静的束縛なら"親"。
動的束縛なら"孫"。
なぜか?
◆静的束縛は、実行する以前に、
「objは子クラスなのだから、子クラスのfuncを呼び出せばいーだろ」
と決めつける。
子クラスは親クラスを継承している(つまり含んでいる)ので、親クラスのfuncが呼ばれる。
◆動的束縛は、実行時に、
「objが参照しているのは孫クラスの実体だから、孫クラスのfuncを探そう」
と柔軟に対処する。
孫クラスでfuncはオーバーライドされているので、その孫クラスのfuncが呼ばれる。
もちろん、もしオーバーライドされていなければ継承元クラスのfuncが呼ばれる。
つまり、静的=実行前、動的=実行時ってこと。
束縛という言葉が意味不明にきこえるかもしれないが、これは英語のbindingをアフォな人が和訳したため。
元々は「結びつける」というくらいの意味。
C++はデフォルトで静的束縛。JAVAはデフォルトで動的束縛。
0233nobodyさん
2005/06/15(水) 07:51:22ID:???静的束縛=実行前にメソッド決定=今時イラネ
動的束縛=実行時にメソッド決定=多態性の実現
ちなみに動的束縛・静的束縛の話題は、PHPのような型なし言語とはカンケーない。
よってスレ違い。
以上。
0234nobodyさん
2005/06/15(水) 16:39:11ID:???型のあるなしと関係あるん?
0236nobodyさん
2005/06/15(水) 20:23:54ID:???.______゙!lllll!l!llll!! ,llllllllllllllliiiiiii,,,,,,,、
.llllllllllllllllllllllllllllllllllllllll` ゙゙゙゙゙!!!!!!llllllllllllllll!
.l!!!!!!!!!!!!!!!!!!!!!!llllllllll .,iiiiiii,,,,,,,,゙゙゙゙゙!!!l゜
llllllllll lllllllllllllllllllliiiii,,,
llllllllll `゙゙゙゙゙!!!!lllllllll゜
_______,llllllllll .,illllliiiiiiii,,,,,,,, ゙゚゙゙′
lllllllllllllllllllllllllllllllllllllllll l!!!!llllllllllllllllllllliiiii,,,,,,、
'!!!!!!!!!!!!!!!!!!!!!!!lllllllll| ゙゙゙゙゙゙!!!!lllllllllllll!:
゙゚゙゙゙!!°
.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,、 ,,,,,,,,,,
.lllllllllllllllllllllllllllllllllllli、 lllllllllll
.'゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙lllllllllll゙′ llllllllll
,illllllllll゙` .llllllllll| ,,,i,,
,,iillllllllll゙` llllllllll| ,,,iilllllllli,
,,,iillllllllllllllllii,,, .lllllllllll .,,,iiilllllllllll!!゙゜
,,,,,iilllllllllllll!!!llllllllllllii,,、 llllllllll|.,,,,iiillllllllllll!!゙’
..liillllllllllllllll!!゙’ ゙゙!llllllllllllii、 .llllllllllllllllllllllll!!゙゙`
: ゙゙lllllll!!!゙゙` ゙゙!lll!!゙゜ .゙!lllllllllll!!!゙゙゜
.゙゙゛ : `゙゙゙゙″
0238nobodyさん
2005/06/16(木) 01:25:30ID:???0239nobodyさん
2005/06/16(木) 18:57:06ID:???・DBからデータを取得する場合、1要素づつオブジェクトにいれて、
それの集合体オブジェクトに追加していくものなのでしょうか。
・そうだとしたら検索する関数は、1要素づつのクラスのメンバでしょうか、
集合体のクラスのメンバなのでしょうか。
例えば請求書オブジェクトは、請求明細一覧オブジェクトをメンバとしています。
請求明細一覧は、請求明細のあつまりです。
請求書オブジェクトを生成する際の請求明細一覧を生成するロジック?が
わからないんです。どなたかよろしくお願いします。
0240nobodyさん
2005/06/16(木) 19:48:57ID:???( ゚д゚) ・・・・・?
0241nobodyさん
2005/06/16(木) 19:49:57ID:???その明細一覧というのがが、均質な項目をイパーイあつめた単なる表のような
データであって、かつ、一種類のメソッド群でさばききれる(多態性がいらない)んであれば、
たぶんそうこまかくする理由ってみつかりにくいんじゃないか。という気はするYO。
たいして効率に影響しなくて使いやすくてメンテ等もしやすければいいんだろうけどね。
0242nobodyさん
2005/06/16(木) 20:34:29ID:???めちゃめちゃ混乱してますな。
「請求書オブジェクト」という概念は捨てた方がいいんではないかと。
全て1つのオブジェクトに突っ込んでしまうのではなく、オブジェクトを役割ごとに分けるのも必要。
検索部分は検索結果とは別個のオブジェクトにすることが多いし、
検索結果は1レコードを保持できるオブジェクトとして設計することが多いと思う。
検索オブジェクトから検索結果オブジェクトのインスタンスがたくさん返ってくるイメージ。
それらをまとめて管理したいなら、複数の検索結果オブジェクトを1つにまとめる専用の
オブジェクトを更に別個に設計したりするわけだが、検索結果が多い場合や1レコードあたりのメモリ
占有量が大きい場合は、そういう概念で設計すると検索結果を全部メモリに読んでしまい
メモリを圧迫する結果になる。
1レコードずつDBから読んでは捨て読んでは捨てした方が効率がいい場合もあるわけ。
0243239
2005/06/16(木) 21:43:06ID:???独学の悲しさか何がわからないのかわからない程混乱してます。
もっとシンプルな例えとして「部署一覧」や、「部署コードから部署名」を検索する場合、
・部署一覧クラス(部署単体クラスの集まりをデータにもつ)
・部署クラス(部署単体のクラス)
・DBクラス(DBへアクセスしてSQLを実行する)
が必要かなと思うのですが(間違ってますでしょうか?)
■DBクラスのSQLを実行するfunction query($sql)は
何を返すべきなんでしょう。
1.部署オブジェクトの配列(さらに部署一覧オブジェクトに読み込む)
2.部署一覧オブジェクト
3.部署名の配列。それを改めて部署オブジェクトに読み込む(さらに
部署一覧オブジェクトに読み込む)
4.部署名の配列。それを部署一覧オブジェクトに読み込む。
■部署一覧を取得するfunction bushoList()と、部署名を検索するfindBusho($key)は
1.両方とも部署一覧クラスのメンバにする
もし該当部署がひとつしかなくても配列がひとつしかないとして処理する
2.findBusho($key)がひとつしかないことがわかっていれば
bushoList()は部署一覧クラス・findBusho($key)は部署クラスのメンバにする
3.両方とも部署クラスのメンバにして、複数の部署名の場合に
部署一覧オブジェクトを生成してそれに入れ込む。
なにを悩んでいるかわかっていただけますでしょうか。
エスパー能力をあてにしてすみません、お願いします。
多分、
>>241
細かくする理由が無い場合、どういうクラスにしたらいいのかわからないです。
>>242
読んでは捨て読んでは捨てというのは具体的にどうしたらいいのか
わからないです。
単純に請求書一覧を得るとか部署一覧を得るとかなら配列を使うなりして
できるのですが、オブジェクト指向だとどうするのかがさっぱりです。
0244nobodyさん
2005/06/16(木) 22:42:39ID:???> ■DBクラスのSQLを実行するfunction query($sql)は何を返すべきなんでしょう。
1〜4のどれでもいいのではないかと。データの内容や量、処理の内容によって
どれを選ぶかもプログラマの腕にかかってるわけで。
あと、DBオブジェクトとデータにアクセスするオブジェクトは別々に設計した方がいいのではないかと。
> ■部署一覧を取得するfunction bushoList()と、部署名を検索するfindBusho($key)は
自分だったらDBクラスを持った部署データを専門に扱う「人事課」みたいなオブジェクトを作るかな。
$jinji = new jinji();
$bushoList = $jinji->bushoList();
$bushoList2 = $jinji->findBusho('shomu');
bushoListやfindBushoが何を返すかは最初の疑問の答えを参照。
> 読んでは捨て読んでは捨てというのは具体的にどうしたらいいのか
例えば、検索結果を全部一度に配列にぶちこむのではなく、ループの中で
1つの変数に1レコードずつ結果を代入して処理する。ループが回るごとに
その変数は上書きされるから配列にぶちこむのに比べてメモリを食わない。
0245nobodyさん
2005/06/16(木) 23:30:18ID:???クラスに関数をまとめるだけで十分だよ。
オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。
0246nobodyさん
2005/06/16(木) 23:47:48ID:???大規模開発になると避けて通れなくなるよ。PHPのなんちゃってオブジェクト指向でも
利用する価値はある。
最近、「クラスに関数まとめるだけ」で適当に作ったサイトがつぎはぎで巨大化するにつれ
保守が間に合わなくなって破綻したのでなんとかしてくれっつー依頼が多い。
まあ逆にフレームワークとかテンプレートエンジンとか詰め込みすぎて負荷でパンクした
サイトも知ってるけど。
> オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。
これは同意。
0247nobodyさん
2005/06/16(木) 23:50:59ID:???0248nobodyさん
2005/06/17(金) 00:02:32ID:???PHPのよさは手軽にかけることなんだから。
0249nobodyさん
2005/06/17(金) 00:06:10ID:???0250239
2005/06/17(金) 00:11:43ID:???つ、ついていけない…。「これ以上どうやさしく説明すればいいんだよ」
と怒られそうですが。(丁寧に説明いただいてるは語感からわかります。
感謝です。)
■DBオブジェクトとデータにアクセスするオブジェクトって
どう違うものなのでしょうか?(あ、何か日本語も変だ)
■人事課オブジェクトを作るというのは…
今回の程度の場合、細分化して部署クラスとかを作るんじゃなくて、
(例えばそれはデータメンバの変数にしたりして)操作するクラスを
つくるという解釈でいいでしょうか。
クラスにするものの勘所が全然つかめない…。
0251nobodyさん
2005/06/17(金) 00:23:58ID:???PHPでも工夫すればオブジェクト指向開発できるって言っても、そんな不毛な工夫するより、その言語に適した開発アプローチを取るべきだと思う。
0252239
2005/06/17(金) 00:27:02ID:???>>247
「したいぜ」というか「してみたいぜ」です。みなさんは、「できるけど
やらない。」なのでしょうけど、私は「できない」のでやり方は知って
おきたいのです。
何をクラスにするのかは、案件によって違ってくるんでしょうけど、
なんというか、こう常套手段のようなものを例示してもらえないかなと
思ってるんですよ。例えばDBがあって、そこからデータを引っ張ってきて
そのデータを扱うという操作についてとか…。デザインパターンと実際の
(この例みたいなの)が結びつかないんです。
面と向かって尋ねられる人がいればもう少し理解がはやいのかなとも
思うのですがいないもので。
0253nobodyさん
2005/06/17(金) 00:34:44ID:???0254nobodyさん
2005/06/17(金) 01:16:39ID:???とりあえず、DBへアクセスして結果を取得するクラスに関しては自作するより
PEAR::DBを使うことをおすすめする。
0255nobodyさん
2005/06/17(金) 02:48:28ID:???>こう常套手段のようなものを例示してもらえないかなと
常套手段のサンプルコードとかは、巷ではPHPよりJAVAの方がずっと多いんじゃないかな。
だからちょっとがんばってJAVAやってみるのも勘所をつかむにはいいかも。
あと私見だけど、自分でクラスつくるときには、
クライアント側(class Bushoを書く側ではなくnew Bushoってやったりメソッド呼び出す側)
の人にとってどうしたら便利か考えながらやるのがいいと思う。
今の段階ではクライアントにあたるのも自分自身だろうから、よりいっそう自分の欲望に正直にできるはず。
0256255
2005/06/17(金) 02:53:13ID:???>>243の前半の質問の答えは>>244の言うとおり、何がやりたいかに応じてどれでもいいと思う。
後半のに関してはfindBusho()を部署一覧クラスのメンバにして
$list = new BushoList();
$kikaku = $list->findBusho('企画');
って感じで使用したらいいんじゃないかと。
もしfindBushoが部署クラスのメンバだったら
$soumu = $kikaku->findBusho('総務'); // !?
って感じで、特定の部署から他の部署を検索(?)みたいで意味不明かなと思った。
bushoList()メソッドの使いどころは、おいどんにはよくわからんとです。
まあとにかく「クライアント側でどう使ったらいいか」をよく考えてみて。
応援してるからガンガレ!
0257nobodyさん
2005/06/17(金) 03:19:33ID:???PHP5のオブジェクト指向はかなりJavaを意識して作られてると思うんだけど
それでもやっぱり物足りない感じですかね?
0258nobodyさん
2005/06/17(金) 03:28:16ID:???0259nobodyさん
2005/06/17(金) 07:29:07ID:???どーれ試しに。。。
$obj = new MyClass();
と
$obj = & new MyClass();
の違いって何ですか?
0260nobodyさん
2005/06/17(金) 07:38:56ID:???0261nobodyさん
2005/06/17(金) 07:57:27ID:???PHP5でやったらStrict error
Strict Standards: Assigning the return value of new by reference is deprecated in C:\home\php\test.php on line 5
0263nobodyさん
2005/06/17(金) 08:29:16ID:???0264nobodyさん
2005/06/17(金) 09:30:34ID:???> ■DBオブジェクトとデータにアクセスするオブジェクトってどう違うものなのでしょうか?(あ、何か日本語も変だ)
DBオブジェクトってのはデータベースに直接アクセスするモノでしょ?
どんな命令でもquery関数に渡せば実行しちゃうような。
それだとqueryに変なモノを渡された時に困るので、DBオブジェクトは直接
使わないようにして、queryを出す専用のオブジェクトを作るわけ。
部署管理なら、部署管理データを操作する専用のオブジェクトを設計する。
> 今回の程度の場合、細分化して部署クラスとかを作るんじゃなくて、
いや、部署オブジェクト(部署1つ分)のインスタンス(群)をリクエストに応じて生成するオブジェクトですね。
「こんな部署のリストください」と言ったら「はい、これとこれ」と言ってDBを勝手に検索して結果を渡して
くれるような存在。こういったオブジェクトには、部署データの更新なんかも任せれば良いかも知れない。
こうすれば、メインルーチンではDBへのSQL文をどうすればいいとか考えなくて済むし、
それもオブジェクト指向のメリット。SQL文絡みのエラーが出れば、それは「人事課オブジェクト」の
設計のせいだとすぐ分かる=バグの原因の特定が容易。
>>251
> PHPでも工夫すればオブジェクト指向開発できるって言っても、そんな不毛な工夫するより、
> その言語に適した開発アプローチを取るべきだと思う。
全然不毛ではないよ。ある程度以上の規模になると開発効率が全く違う。
本当に不毛ならなぜPEARがほとんどOOで書かれているのかと。
Perlのようにただパッケージを拡張しただけみたいな物でも充分使いではあるよ。
問題は機能の多彩さではなく、OOな考え方でプログラミングが可能かどうか。
機能はその補助(そしてあるときはOOな考え方を強制・補正する束縛)に過ぎない。
構造化プログラミングな思考で書かれたモノと正しいOOな思考で書かれたモノでは
開発効率も保守性も全然違う。
0265nobodyさん
2005/06/17(金) 11:33:13ID:???>問題は機能の多彩さではなく、OOな考え方でプログラミングが可能かどうか。
>機能はその補助(そしてあるときはOOな考え方を強制・補正する束縛)に過ぎない。
なかなか的を得てる表現だと思った。
>それだとqueryに変なモノを渡された時に困るので、DBオブジェクトは直接
>使わないようにして、queryを出す専用のオブジェクトを作るわけ。
メソッドの引数にSQL文をとらなければいいだけだと思うが。
作成するDBクラス自体に汎用性を持たせたいなら別だけど。
OOP練習中の>>250にはやや冗長かと。
0267nobodyさん
2005/06/17(金) 11:45:33ID:???リンクぐらい書かないとね
http://jp.php.net/manual/ja/language.oop.newref.php
0269nobodyさん
2005/06/17(金) 13:24:27ID:???>global $globalref;
>$globalref[] = &$this;
>// 内部への参照グローバル配列 $globalref を作成
>global $globalref;
>$globalref[] = &$this;
。。。なんかこれ、日本語がやばくないか?
「グローバルな配列 $globalref の中に参照(&$this)をひとつ作る(入れる)」ってことだよね?
0271nobodyさん
2005/06/17(金) 14:07:56ID:???最初のはインスタンスのコピーを返すが、2番目のは参照を返す。じゃなかったっけか。
$obj = new MyClass();
$obj2 = new MyClass();
$obj->setName("hello");
$obj2->setName("world");
$obj->printName();
実行結果: hello
$obj =& new MyClass();
$obj2 =& new MyClass();
$obj->setName("hello");
$obj2->setName("world");
$obj->printName();
実行結果: world
試してないけどこんな感じでは?
>>261
てきとー訳
> Strict Standards: Assigning the return value of new by reference is deprecated in C:\home\php\test.php on line 5
> 厳密な標準: newの戻り値を参照で割り当てるのは推奨されません。場所 C:\home\php\test.php の 5 行目
>>270
これもやってないけど、PHP4と同じ振る舞いをするんではなかろうか。
0272nobodyさん
2005/06/17(金) 14:27:34ID:???WEBプログラミングっていうのは、ユーザの入力を受け取って、それをDBに入れて、DBから出したものを加工して表示する。
このシーケンシャルな処理の繰り返しに過ぎない。
JavaのStrutsを例にとっても、あれをオブジェクト指向って印象は受けない。
入力データのチェックと画面遷移の仕組みを用意してあるだけだから。だけど、WEBプログラミングにはそれで十分なんだよね。
あれ以上の機能を持たすと、オーバースペックになって使いづらくなるから。
0273nobodyさん
2005/06/17(金) 14:30:50ID:???ほうほう
0274nobodyさん
2005/06/17(金) 14:37:07ID:???それは必要ないから、WEBアプリでは適用しづらいからだと思う。
FLASHとかAjaxみたいなのは別だろうけど、HTTPリクエストドリブンなWEBアプリだと使いどころが見つからない。
■ このスレッドは過去ログ倉庫に格納されています