トップページ⇒php
1001コメント362KB

PHPでオブジェクト指向プログラミング

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
0175nobodyさん2005/06/10(金) 22:00:46ID:Ba+L/9uu
ここは言語論争をする場所でもなければ、オブジェクト指向の腕自慢をする場所でもない。
スレッドのタイトルが『PHPでオブジェクト指向プログラミング』となっているのだから、
相手を貶めたい人やらプロだのアマだのにこだわりたい人は邪魔ですよ。

この流れではスレッドの趣これい旨に沿った話題の展開さえままならない。
これ以上続けられても迷惑なばっかりなのでそろそろ止めてくれ。
小学生でも無いだろうし、お互い大人になろうよ。
0176nobodyさん2005/06/10(金) 22:04:25ID:???
>>172
ポリモーフィズム∈OOP
じゃないのか?
それにSmalltalkもObjCも型付け出来ないぞ。

静的型付けは確かに有用だが、
OOPに必ずしも必要という訳ではない。

それぞれの利点を考慮して
言語の性質に見合った設計をしていく事が大切だと俺は思う。
0177nobodyさん2005/06/11(土) 00:19:38ID:???
でも、説明するときでもポリモーフィズムってあんまり言わなくない?
多態って言うなぁ
漢字にした方が、初心者の人でも、何のことかイメージしやすいし
相手が理解できない専門用語を言って満足してるアホみたいだから、横文字は好きじゃない
0178nobodyさん2005/06/11(土) 00:20:06ID:???
と言うわけで、>>173 私怨みっともないぞ
0179nobodyさん2005/06/11(土) 01:33:34ID:???
>>178
ハイ本人登場w
01801692005/06/11(土) 01:57:38ID:???
>>177(=>>126か?)
ポリモーフィズムじゃヤダとか駄々をこねるので仕方なく多態でいってやろう。
だいたいお前の職場だろうがこのスレだろうが意味が通じることが重要ってのがお前の主張じゃないのか?
少なくともこのスレではポリモーフィズムを多態と言わなかったがための誤解なんてなかった気がするが。

>>176
俺はPHPには型がないからOOじゃないなんて言ってない。
PHPでOOP的な多態がどういう位置付けなのかを疑問に思っただけ。
Smalltalkを持ち出すってことは>>169も多態ってことになるんだろうが、そんなこと言ったらPHPにオブジェクト指向が導入される前からある言語仕様も全て多態って話になるだろ。
全ての変数は内部的に数値なのか文字列なのか配列なのかオブジェクトなのか、、、によって実行時に動的に振る舞いが決まるわけだからな。
0181nobodyさん2005/06/11(土) 11:07:10ID:???
なんかもう、どうやったらポリモーフィズムって言えるかの競争になってるな。
それを阻む奴は、とことん攻撃するみたいなw
0182nobodyさん2005/06/11(土) 12:01:10ID:???
なんか>>91の「PHP4でポリモーフィズムってどうやるの?」を思い出した。
散々暴れて散々叩かれて消滅したが、実は何かをわかってて釣っていたのだろうか。
いや、それはない(反語)。

で、PHPのポリモーフィズムって結局何なのさ?
オブジェクト指向を謳うなら一言説明がほしいとこだ。>PHP
0183nobodyさん2005/06/11(土) 23:59:38ID:???
ポリモフォーフィズムも知らないで、よくJAVAならとか言えるよな。
だからJAVA厨は嫌われるんだよ。
PHPでOOPやってる奴なら常識なのに。
0184nobodyさん2005/06/12(日) 01:08:28ID:???
>>183
ポリモフォーフィズムって何ですか?
0185nobodyさん2005/06/12(日) 01:10:40ID:???
知らねぇのかよwww
お前も多態とか言って誤魔化しとけよwww
0186nobodyさん2005/06/12(日) 02:11:20ID:???
>>180
ポリモーフィズムというのはOOが持つ特性であって、
開発者がポリモーフィズムであることを意図していない機能は
それに「見えるような」振る舞いをしたとして、
あなたがそれをポリモーフィズムだと言っても、
それはあくまで主観(というかあなたの勝手な認識)でしかない。
0187nobodyさん2005/06/12(日) 03:21:50ID:???
ポリモーフィズムって別に普通の関数でも実現できるよね。
引数や実行される環境によって振る舞いを変えればいいわけだし。
メンテナンス性などを考えればOOPな方がいいだろうけど。

PHP4での例とすれば、PEAR::DBなんかはポリモーフィズムじゃない。
DB::connectは渡されたDSNから判断して、DB_commonを継承した
各DBのサブクラスをインスタンス化して委譲することによって
多くのDBに対応している。

↓勘違いしてたらツッコミよろ↓
01881802005/06/12(日) 04:43:28ID:???
>>183-185
微妙にワロタ

>>186
俺の言いたいのはあくまで
>PHPでOOP的な多態がどういう位置付けなのかを疑問に思っただけ。
であって
>(〜中略〜)ってことは(〜中略〜)全て多態って話になるだろ。
はただの推論なんで、そこに茶々いれられても。
(そこつっこんだわけじゃなかったならスマソ)
まー言語の開発者がポリモーフィズムを意図したかどうかに焦点があるべきなのは同意。
ただ直接聞くわけにもいかないからここで話してるわけで。


>>187
同意。たしかにそういうのもポリモーフィズムと言えると思う。
PEARに限らずPHPを使う側が意図してポリモーフィズム的な振る舞いを実装することはできる。
あとはPHPの言語仕様自体にポリモーフィズムがどう盛り込まれてるかって話。
はっきり言ってアフォな俺にはなかなかわからない。
01891872005/06/12(日) 05:42:38ID:???
>>188
>あとはPHPの言語仕様自体にポリモーフィズムがどう盛り込まれてるかって話。

俺はJavaを知らない(つーかRubyもC++も知らん)のだけど、Javaにはどのように
盛り込まれているの? インターフェイスがそうなのか? それとも抽象クラスやメソッドを
定義できること?
0190nobodyさん2005/06/12(日) 06:25:01ID:???
>>169のを使うと
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
誰かPHPのポリモーフィズムの解釈を語れよー!
誰もわかんないのかよー!
俺もわかんないよー!
ヤケクンのアゲ
0197nobodyさん2005/06/12(日) 13:48:21ID:???
>>196
みんな偉そうなこと言ってポリモーフィズムの定義を知らないんだろ。
ホント口だけだよな。
0198nobodyさん2005/06/12(日) 14:06:38ID:???
ttp://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/polymorphism.html
0199nobodyさん2005/06/12(日) 17:11:33ID:???
>>197
よし、チミのポリモーフィズムの定義とやらを聞こうじゃないか。
0200nobodyさん2005/06/12(日) 17:57:05ID:wbP1UJDj
>>198
VBかよ
0201nobodyさん2005/06/12(日) 18:08:57ID:???
>>197
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の意見が聞きたい
0202nobodyさん2005/06/13(月) 09:42:16ID:???
>>197
ワクワク
0203nobodyさん2005/06/13(月) 11:30:16ID:???
依然PHPでのポリモーフィズムは謎なわけだが。
0204nobodyさん2005/06/13(月) 11:38:44ID:???
function f(&$obj) {
  $obj->method();
}

f を呼び出したとき $obj がどのクラスなのかに応じて適切な method() が呼び出されるわけだが。
0205nobodyさん2005/06/13(月) 15:04:45ID:???
漏れもそれを言おうとしてたわけだが。
0206nobodyさん2005/06/13(月) 15:18:16ID:???
だから何なんなんだと小一時間(ry
わけだが。
0207nobodyさん2005/06/13(月) 15:43:38ID:???
この前、SRAの石井が書いたPHP+ポスグレの本読んだ。そこにMVC構造した雑誌記事管理システムのプログラムコードが載ってた。
そのコード読んで思ったんだけど、ビュークラスやDBクラスを分けてオブジェクト指向っぽく取り扱ったところで、糞分かりづらいだけでまったく意味ねえな、と。
0208nobodyさん2005/06/13(月) 16:21:03ID:???
石井!ガンガレ!
0209nobodyさん2005/06/13(月) 23:29:38ID:???
OOP的な意味でのポリモーフィズムってのは基本的に、
いろんな型のデータを区別せずに扱えますよ、
ということだと認識してる。
同じ扱いなのに、実際のふるまいがポリモってるよ!という感じ?

だもんで、型がない場合は、その時点でてけとうに
ポリモーフィズムが実現されすぎちゃって困ってる、
という状況なんだと思われ。

型で制約されている場合でも、仮想関数表なんかを管理しとけば
どっこいポリモれちゃうんですよ奥さん、と。

(もともとは関数型言語方面で、このリスト型だとどんな型の値でも
ぶらさがりますよ、とか、関数を引数の型の微妙な違いで
オーバーロードできますよ、とかいうのがポリモーフィズム
だったらしいけど、OOP方面ではふつうそういうのまで
ポリモーフィズムとは言わない、よね?)
0210nobodyさん2005/06/14(火) 03:02:54ID:???
こんなにポリモーフィズムなんて言葉が使われつづけるスレも珍しい。
0211nobodyさん2005/06/14(火) 03:17:23ID:???
>>209
同意。
実装をする側がクラスごとに適切に書いておけば、それを使う側はオブジェクトごとにいちいち区別しなくても同じように使えて正しく動く。
それがOOP的ポリモーフィズムの利点だわな。
ま、
>ポリモーフィズムが実現されすぎちゃって困ってる
のかどうかは微妙な線だが、PHPなどの型なし言語はもともとポリモーフィズム的振る舞いをしていたから、殊にPHPでOOを導入する時に「この部分がポリモーフィズムだよ」という必要がなかったってこっちゃな。
>もともとは関数型言語方面で、(・・・)、とかいうのがポリモーフィズム
ってのは初めて知った。
0212nobodyさん2005/06/14(火) 03:27:36ID:???
>>210
まー、多態性って言う方が多いだろうからね…
0213nobodyさん2005/06/14(火) 04:02:57ID:???
ソースキボンヌ
0214nobodyさん2005/06/14(火) 05:12:52ID:???
そんな小難しいモンでもないやん
違ったモノに同じ命令で言うこと聞かせられるようにすることだよ。
0215nobodyさん2005/06/14(火) 10:10:02ID:???
動的束縛が強いとそれがあたりまえになって、特に意識しなくなるからなあ
0216nobodyさん2005/06/14(火) 11:34:42ID:???
動的束縛に強いとか弱いとかあるのか?
あと>>214だと静的束縛と区別できん。
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:???
>>217
もともとここは初心者に説明するためのスレじゃないし
話の流れ的にも >>197 の講釈を待ってる間に野次馬ががやがや言ってるだけかと

素直に「動的束縛ってなんのことだかわからないので教えてください」と頭を下げれば
親切な人が教えてくれるんじゃないか
0221nobodyさん2005/06/14(火) 19:59:09ID:???
動的束縛ってなんのことだかわからないので教えてください orz
0222nobodyさん2005/06/14(火) 20:39:29ID:???
>>220は本当は知らないので、親切じゃないので教えないとか厨じみたことを言って逃げると見た。
0223nobodyさん2005/06/14(火) 22:53:10ID:???
>>218
別に同じクラスを継承する必要ないし。
0224nobodyさん2005/06/15(水) 02:40:19ID:???
ポリモーフィスムスとはちょっと違うけどさあ、
リスコフの置換原則は次のように謂う、
「派生クラスは、ユーザーが基底クラスとの違いに気付かずに、
基底クラスのインターフェイスを通じて使用できるものでなければならない。」
とゆうことは、
継承したクラスで独自にメソッド増やすのはよろしくないってこと?
02252242005/06/15(水) 02:42:17ID:???
「パブリックなメソッドを増やすのは」に訂正します
02262242005/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:???
>>230がドジってる間に、とりあえず型のある言語で静的束縛・動的束縛の解説。

◆まずは下準備として、親クラス←子クラス←孫クラスという継承関係とする。
↓のように、親クラスで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:???
なんでメソッドのオーバーライドの問題が
型のあるなしと関係あるん?
0235nobodyさん2005/06/15(水) 17:04:50ID:???
>>234
誤爆ですか?
0236nobodyさん2005/06/15(水) 20:23:54ID:???
          ,,iiii,,,,,iii,,      ,,,,,,,,,_         
  .______゙!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!!!゙゙゜       
  .゙゙゛         :        `゙゙゙゙″         
0237nobodyさん2005/06/15(水) 21:44:06ID:???
>>233
型あり/なしなんか関係内だろ。
PHPは動的束縛だよ。
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。

その明細一覧というのがが、均質な項目をイパーイあつめた単なる表のような
データであって、かつ、一種類のメソッド群でさばききれる(多態性がいらない)んであれば、
たぶんそうこまかくする理由ってみつかりにくいんじゃないか。という気はするYO。
たいして効率に影響しなくて使いやすくてメンテ等もしやすければいいんだろうけどね。
0242nobodyさん2005/06/16(木) 20:34:29ID:???
>>239
めちゃめちゃ混乱してますな。

「請求書オブジェクト」という概念は捨てた方がいいんではないかと。
全て1つのオブジェクトに突っ込んでしまうのではなく、オブジェクトを役割ごとに分けるのも必要。

検索部分は検索結果とは別個のオブジェクトにすることが多いし、
検索結果は1レコードを保持できるオブジェクトとして設計することが多いと思う。
検索オブジェクトから検索結果オブジェクトのインスタンスがたくさん返ってくるイメージ。

それらをまとめて管理したいなら、複数の検索結果オブジェクトを1つにまとめる専用の
オブジェクトを更に別個に設計したりするわけだが、検索結果が多い場合や1レコードあたりのメモリ
占有量が大きい場合は、そういう概念で設計すると検索結果を全部メモリに読んでしまい
メモリを圧迫する結果になる。
1レコードずつDBから読んでは捨て読んでは捨てした方が効率がいい場合もあるわけ。
02432392005/06/16(木) 21:43:06ID:???
>>240-242
独学の悲しさか何がわからないのかわからない程混乱してます。
もっとシンプルな例えとして「部署一覧」や、「部署コードから部署名」を検索する場合、
・部署一覧クラス(部署単体クラスの集まりをデータにもつ)
・部署クラス(部署単体のクラス)
・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:???
>>243
> ■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:???
そんな面倒なことPHPでやっても意味ないよ。
クラスに関数をまとめるだけで十分だよ。
オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。
0246nobodyさん2005/06/16(木) 23:47:48ID:???
>>245
大規模開発になると避けて通れなくなるよ。PHPのなんちゃってオブジェクト指向でも
利用する価値はある。

最近、「クラスに関数まとめるだけ」で適当に作ったサイトがつぎはぎで巨大化するにつれ
保守が間に合わなくなって破綻したのでなんとかしてくれっつー依頼が多い。
まあ逆にフレームワークとかテンプレートエンジンとか詰め込みすぎて負荷でパンクした
サイトも知ってるけど。

> オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。 

これは同意。
0247nobodyさん2005/06/16(木) 23:50:59ID:???
どうしても集合的データの扱い方についてOOPしたいぜしたいぜというなら、IteratorパターンとかVisitorパターンなぞを調べてみるも吉
0248nobodyさん2005/06/17(金) 00:02:32ID:???
追加開発で収拾つかなくなってきたら、その時点で全面的に書き直せばいい。
PHPのよさは手軽にかけることなんだから。
0249nobodyさん2005/06/17(金) 00:06:10ID:???
それはもしや伝説の秘技「道路の掘り返し」では・・・!
02502392005/06/17(金) 00:11:43ID:???
>>244
つ、ついていけない…。「これ以上どうやさしく説明すればいいんだよ」
と怒られそうですが。(丁寧に説明いただいてるは語感からわかります。
感謝です。)
■DBオブジェクトとデータにアクセスするオブジェクトって
どう違うものなのでしょうか?(あ、何か日本語も変だ)
■人事課オブジェクトを作るというのは…
今回の程度の場合、細分化して部署クラスとかを作るんじゃなくて、
(例えばそれはデータメンバの変数にしたりして)操作するクラスを
つくるという解釈でいいでしょうか。

クラスにするものの勘所が全然つかめない…。
0251nobodyさん2005/06/17(金) 00:23:58ID:???
PHP5は知らないけど、PHP4やPerlはオブジェクト指向で開発するには機能が足りなさ杉。
PHPでも工夫すればオブジェクト指向開発できるって言っても、そんな不毛な工夫するより、その言語に適した開発アプローチを取るべきだと思う。
02522392005/06/17(金) 00:27:02ID:???
age続けるのがよいかわからないのでなんとなくですがsageてみます。
>>247
「したいぜ」というか「してみたいぜ」です。みなさんは、「できるけど
やらない。」なのでしょうけど、私は「できない」のでやり方は知って
おきたいのです。
何をクラスにするのかは、案件によって違ってくるんでしょうけど、
なんというか、こう常套手段のようなものを例示してもらえないかなと
思ってるんですよ。例えばDBがあって、そこからデータを引っ張ってきて
そのデータを扱うという操作についてとか…。デザインパターンと実際の
(この例みたいなの)が結びつかないんです。
面と向かって尋ねられる人がいればもう少し理解がはやいのかなとも
思うのですがいないもので。
0253nobodyさん2005/06/17(金) 00:34:44ID:???
O/Rマッパとか使ってみれば?
0254nobodyさん2005/06/17(金) 01:16:39ID:???
>>252
とりあえず、DBへアクセスして結果を取得するクラスに関しては自作するより
PEAR::DBを使うことをおすすめする。
0255nobodyさん2005/06/17(金) 02:48:28ID:???
>>252
>こう常套手段のようなものを例示してもらえないかなと

常套手段のサンプルコードとかは、巷ではPHPよりJAVAの方がずっと多いんじゃないかな。
だからちょっとがんばってJAVAやってみるのも勘所をつかむにはいいかも。

あと私見だけど、自分でクラスつくるときには、
クライアント側(class Bushoを書く側ではなくnew Bushoってやったりメソッド呼び出す側)
の人にとってどうしたら便利か考えながらやるのがいいと思う。
今の段階ではクライアントにあたるのも自分自身だろうから、よりいっそう自分の欲望に正直にできるはず。
02562552005/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:???
> オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。
PHP5のオブジェクト指向はかなりJavaを意識して作られてると思うんだけど
それでもやっぱり物足りない感じですかね?
0258nobodyさん2005/06/17(金) 03:28:16ID:???
PHPにはまだオブジェクト指向を意識して作られたサンプルコードの解説などが少ない
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:???
>>259
PHP5でやったらStrict error
Strict Standards: Assigning the return value of new by reference is deprecated in C:\home\php\test.php on line 5
0262nobodyさん2005/06/17(金) 08:06:43ID:???
>>260
恥さらしたな。
0263nobodyさん2005/06/17(金) 08:29:16ID:???
は?マニュアルに書いてあるだろ
0264nobodyさん2005/06/17(金) 09:30:34ID:???
>>250
> ■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:???
>>264
>問題は機能の多彩さではなく、OOな考え方でプログラミングが可能かどうか。
>機能はその補助(そしてあるときはOOな考え方を強制・補正する束縛)に過ぎない。

なかなか的を得てる表現だと思った。

>それだとqueryに変なモノを渡された時に困るので、DBオブジェクトは直接
>使わないようにして、queryを出す専用のオブジェクトを作るわけ。

メソッドの引数にSQL文をとらなければいいだけだと思うが。
作成するDBクラス自体に汎用性を持たせたいなら別だけど。
OOP練習中の>>250にはやや冗長かと。
0266nobodyさん2005/06/17(金) 11:39:25ID:???
>>263
ためしに該当部分のURLさらしてみたら?
0267nobodyさん2005/06/17(金) 11:45:33ID:???
>>263
リンクぐらい書かないとね
http://jp.php.net/manual/ja/language.oop.newref.php
0268nobodyさん2005/06/17(金) 12:14:10ID:???
>>267
PHP5の話かとおもった・・・_| ̄|○
0269nobodyさん2005/06/17(金) 13:24:27ID:???
>// create a reference inside the global array $globalref
>global $globalref;
>$globalref[] = &$this;

>// 内部への参照グローバル配列 $globalref を作成
>global $globalref;
>$globalref[] = &$this;

。。。なんかこれ、日本語がやばくないか?
「グローバルな配列 $globalref の中に参照(&$this)をひとつ作る(入れる)」ってことだよね?
0270nobodyさん2005/06/17(金) 13:47:49ID:???
あー誤訳だね

ちなみにPHP5では>>259は冗長なだけで、STRICT外せば完全に同じになるわけ?
0271nobodyさん2005/06/17(金) 14:07:56ID:???
>>259
最初のはインスタンスのコピーを返すが、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プログラミング自体にオブジェクト指向開発の必要性が薄い。
WEBプログラミングっていうのは、ユーザの入力を受け取って、それをDBに入れて、DBから出したものを加工して表示する。
このシーケンシャルな処理の繰り返しに過ぎない。
JavaのStrutsを例にとっても、あれをオブジェクト指向って印象は受けない。
入力データのチェックと画面遷移の仕組みを用意してあるだけだから。だけど、WEBプログラミングにはそれで十分なんだよね。
あれ以上の機能を持たすと、オーバースペックになって使いづらくなるから。
0273nobodyさん2005/06/17(金) 14:30:50ID:???
http://jp.php.net/manual/ja/language.oop5.basic.php

ほうほう
0274nobodyさん2005/06/17(金) 14:37:07ID:???
WEBアプリでのオブジェクト指向開発の参考例って、PHPはもとよりJavaでも見かけない。
それは必要ないから、WEBアプリでは適用しづらいからだと思う。
FLASHとかAjaxみたいなのは別だろうけど、HTTPリクエストドリブンなWEBアプリだと使いどころが見つからない。
■ このスレッドは過去ログ倉庫に格納されています