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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
0153nobodyさん2005/06/09(木) 12:11:24ID:???
>>152
そこまでなるのに、どれくらいの年月がかかった?
0154nobodyさん2005/06/09(木) 13:46:36ID:???
まぁ、>>144が、ここまで自信に満ちて相手を批判できるってことは
当然、客先の了解を取って、トンネル開けて2chに書き込んでたんだろう。

もし、無許可でやってたとしたら、皆が言うように恥ずかしい奴だが。
0155nobodyさん2005/06/09(木) 13:48:31ID:???
あゴメン
>>148ね
0156nobodyさん2005/06/09(木) 15:47:57ID:???
>>151
同意。
というわけでスレにそった話題で。
0157nobodyさん2005/06/09(木) 16:17:25ID:???
>>150
> やっぱり何の保険もない奴は雇わないに限るな

保険?何の話だ?保証の間違いか?

>>154
> 当然、客先の了解を取って、トンネル開けて2chに書き込んでたんだろう。

当たり前じゃないですか。というか「トンネル開けて」ってSSHの意味分かってないのかも
知れんが、仮想端末越しにブラウズしてるだけだぞ?

> 社内規定でわざわざ閉じているのに、それを中の人が無視してどうするのかと思う

会社のIPアドレスで余計なことして欲しくないから閉じてるんであって、
会社とは全く関係ないマシンから独立に書き込む分には何の問題も生じないでしょ。
その辺はちゃんと了解も取ってあるし。
0158nobodyさん2005/06/09(木) 16:40:55ID:???
PHP5.0.3でオブジェクト指向な感じでWikiを作ったのだけれど、
ソース晒したら意見もらえるかな。

最近OOPの勉強を始めたので、出来る人から見ればクソみたいなソースかもしれませんが…
0159nobodyさん2005/06/09(木) 20:58:08ID:???
>>148
PROXYなんか当たり前の話だろ何言ってんだお前?
2ちゃんねるで情報収集?馬鹿かお前?
程度の低さが知れるなwお前みたいなのがWebプログラマを騙るなよ。
一緒にされたらかなわん。

>>149
>WebやOOPが本職がじゃない
ハァ?OOPって職なんですか?
なんだこのレベルの低さはw
もう書き込むなよ恥ずかしいだけだから。
0160nobodyさん2005/06/09(木) 21:13:46ID:???
>>159
下らん罵り合いは他所でやってくれ。鬱陶しいよ。
0161nobodyさん2005/06/10(金) 00:31:40ID:???
PHP5はクソって話題になったら困るから、わざとそらしてるんだろ。
>>157なんてイタくて見てられないくらいだもんな。釣りでしょ。
0162nobodyさん2005/06/10(金) 00:53:16ID:???
埋め
0163nobodyさん2005/06/10(金) 00:56:44ID:???
埋め
0164nobodyさん2005/06/10(金) 02:18:25ID:???
>>159
> PROXYなんか当たり前の話だろ何言ってんだお前?

Proxyが珍しいとは言ってないけど。
外部へのフィルタリングにProxyサーバなんて立てるか今時?って言ってるんだよ。

> 2ちゃんねるで情報収集?馬鹿かお前?

零細企業なら必要ないかも知れんけどな。ある程度大きいところになると
こういうトコに自社情報がリークしてたりは日常茶飯事なのよ。そういうのチェックする
部門だってあるぞ。あとググった結果が2chだったってことも別に珍しくないんだが。

あと、本職=専門って意味な。辞書引いてみ。
0165nobodyさん2005/06/10(金) 03:25:40ID:???
いったいお前ら何にそんな興奮してるんだ?
0166nobodyさん2005/06/10(金) 06:17:15ID:???
たしかに。あまりにくだらんから読み飛ばしてるが。
0167nobodyさん2005/06/10(金) 11:24:28ID:???
>>114
> メソッドのオーバーライドはデフォルトで動的束縛

ここが意味不明。
「オーバーライド」は継承時の実装上書きのこと。
継承が不要だと言いたいときになぜ出てくる?
0168nobodyさん2005/06/10(金) 15:10:20ID:???
>>167
>継承が不要だと言いたいときになぜ出てくる?

誰もそんなこと言ってない
つっこみいれるなら会話の流れ嫁
0169nobodyさん2005/06/10(金) 15:46:15ID:???
ところでPHPって変数に型とかないけど、ポリモーフィズムっていうのか?

class Oya { public function func() { return "親クラス"; } }
class Ko extends Oya { public function func() { return "子クラス"; } }

$obj = new Oya;
echo $obj->func(); // ここでは$objは親クラス
$obj = new Ko;
echo $obj->func(); // ここでは$objは子クラス

これはポリモーフィズムではないよな。
0170nobodyさん2005/06/10(金) 16:14:54ID:???
バーカ。
0171nobodyさん2005/06/10(金) 16:25:48ID:???
そもそもポリモーフィズムは型に依存した概念じゃないし。

Javaしかやったことないから分からないんだろうな。
>>169 は数学も形で覚えるタイプ。
01721692005/06/10(金) 17:13:23ID:???
>>171
ポリモーフィズムを敷衍しすぎ。
OOPでのポリモーフィズムの話だろ。
0173nobodyさん2005/06/10(金) 21:11:21ID:???
126 :nobodyさん :2005/06/08(水) 07:48:50 ID:???
ポリモーフィズムとか言わないけどね

この馬鹿について語らないか?
0174nobodyさん2005/06/10(金) 22:00:43ID:???
意味が分からないから語れない
(現場ではあまり)ポリモーフィズムとか言わないけどね
という意味か?
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があって、そこからデータを引っ張ってきて
そのデータを扱うという操作についてとか…。デザインパターンと実際の
(この例みたいなの)が結びつかないんです。
面と向かって尋ねられる人がいればもう少し理解がはやいのかなとも
思うのですがいないもので。
■ このスレッドは過去ログ倉庫に格納されています