PHPでオブジェクト指向プログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/04/17(日) 16:55:57ID:iM4mgYnJPHPによるOOPについて語りましょう。
0784名無しさん@そうだ選挙に行こう
2005/09/11(日) 14:08:59ID:???Java登場初期の頃にそう言われていたのは事実。
デザインパターンとかが普及してきてから変わってきた。
0785名無しさん@そうだ選挙に行こう
2005/09/11(日) 16:00:13ID:???昔はそれが常識で事実だったみたいな言い方はよくない。
0786名無しさん@そうだ選挙に行こう
2005/09/11(日) 16:12:44ID:???発想が意味分からないな。
0787名無しさん@そうだ選挙に行こう
2005/09/11(日) 16:34:34ID:???0788名無しさん@そうだ選挙に行こう
2005/09/11(日) 17:19:05ID:???0789名無しさん@そうだ選挙に行こう
2005/09/11(日) 18:43:04ID:???0790名無しさん@そうだ選挙に行こう
2005/09/11(日) 18:46:55ID:???C++だが、参考になると思う。
0791nobodyさん
2005/09/12(月) 19:02:44ID:???$sql = "select * from $table"
みたいに
$sql = "select * from $this->table"
と書いたらエラーになるのってキモくね?
この気持ちをどうしたらいいですか。
0794nobodyさん
2005/09/12(月) 21:17:25ID:???0796nobodyさん
2005/09/14(水) 06:17:54ID:uQ+GcINS(StatementDAO,ThreadDAO等)
結合しなきゃならないケースが出てきた。
結合の場合、DAOってどうすればいいの?
0797nobodyさん
2005/09/14(水) 19:20:52ID:???DAOというよりはDataMapperに近い考え方なのかな。んで、
「さて結合の場合はどうしよう?」ってのがO/Rマッピングの課題の1つじゃなかったっけか。
自分の場合、例えば都道府県名とかあるレコードの属性に関する情報はgetterで結合しちゃってる。
呼び出しを冗長にしたくない場合はgetDetail()なんかのメソッドを作ってそっちを結合専用にしている。
複雑な結合を含むselectが必要な場合は、そのselectがどのテーブルを基にしたものかを判断し、
そのテーブル(用のクラス)にメソッドを追加してる。
0798nobodyさん
2005/09/16(金) 02:45:16ID:???ちょっとまて。
それではclassだけで多重継承ができるという誤解を生むぞ。
A extends B, C, D,E {}
を許す結果になるぞ。
それに>>788は勘違いしている。
それから、>>775は
>>741や>>745が
「Interfaceがないと多重継承ができないからダメだ」と言っていると
勘違いしているがそんなことはどこにも書いていない。
「interfaceがないと多重継承ができない」とは書いてはあるが
それがダメだなんてことはどこにも書いていない。
勘違いしすぎ。だから>>788や>>753, >>727のような誤解をする者が出てくる。
0799nobodyさん
2005/09/16(金) 03:01:56ID:agfKPRSnネタとしてもおかしいぞ。
interfaceを使わずにPHP5で多重継承しようとしたら
こんなメッセージが出たぞ。
Parse error: syntax error, unexpected ',', expecting '{' in C:\Program Files\Apache Group\Apache2\htdocs\PHPTest\src\ExtendedClass.php on line 10
//ClassExtendsTest.php
class ClassExtendsTest {
}
//ClassExtendsTest2.php
class ClassExtendsTest2 {
}
//ExtendedClass.php
require_once("ClassExtendsTest.php");
require_once("ClassExtendsTest2.php");
class ExtendedClass extends ClassExtendsTest, ClassExtendsTest2 {
}
//Main.php
require_once("ExtendedClass.php");
$x = new ExtendedClass();
これでもPHP5でintarfaceがなくても多重継承ができるっていうならそのやり方を説明してくれ。
0800nobodyさん
2005/09/16(金) 03:12:36ID:???PHP5にもメソッドオーバーロード機能があればねえ。
同じクラス内で引数の型と数が異なる同じ名前のメソッドを複数定義できたのに
0801nobodyさん
2005/09/16(金) 03:15:04ID:???>>783のように本が間違ってインチキだのデマまき散らす奴までいるし。
>>786
このコードの意味がわからんのか。interfaceで多重継承している例だ
class A extends B implements C, D, E, F, G{}
だがこのような実装多重継承をするとJavaでもPHP5でもエラーになる。
class A extends B, C, D, E, F, G{}
>>787
そういうことを言う奴がinterfaceがいらないとか浅はかなことを言うんじゃない。
>>788
それはただの単一継承をなんども繰り返しているだけだ。
>>799の例は、
クラスExtendedClassがクラスClassExtendsTestとクラスClassExtendsTest2
とを同時に多重継承しようとしている例だ。だが、PHP5では
classによる多重継承が禁止されているためエラーとなる。
よって、「interfaceでないと多重継承できない」わけだ。
0802nobodyさん
2005/09/16(金) 03:24:27ID:???0803nobodyさん
2005/09/16(金) 03:24:38ID:???0804nobodyさん
2005/09/16(金) 03:27:13ID:???多重継承とは言わないんじゃないか?
何も「継承」はしてないぞ。
0805nobodyさん
2005/09/16(金) 03:31:47ID:???複雑さを取り除くためにわざわざ多重継承を使えなくしてるのに
「多重継承の代用品としてのinterface」を用意する理由があろうか。
頭の固い若者が突然張り切って飛び込んできたという印象を受けるな。
0806nobodyさん
2005/09/16(金) 03:35:09ID:???0807nobodyさん
2005/09/16(金) 03:37:15ID:???extendsとinterfaceの違いをよく考えろ。
interfaceはextendsの代用品じゃない。
783はあくまでも正しい。
0808nobodyさん
2005/09/16(金) 05:01:43ID:???0810nobodyさん
2005/09/16(金) 07:04:08ID:CbtypFEe0811nobodyさん
2005/09/16(金) 09:02:30ID:lrPJbkxRどこらへんがデマ?
いや、マジで。
0812nobodyさん
2005/09/16(金) 09:18:03ID:???> このコードの意味がわからんのか。interfaceで多重継承している例だ
> class A extends B implements C, D, E, F, G{}
勘弁してよ。
C-Gからは、メソッドもプロパティも全く継承していないじゃん。できるわけがない。
C-Gは、インタフェースとしての受け口を決めたというだけで、実体としては空っぽ
なんだから。存在しないメソッドやプロパティを継承できるわけないさ。
なるほど、「インタフェースを継承している」という言い方はできなくもないが、
でも、それはここで話している『C++の多重継承』の『継承』じゃないと思うぞ?
0813812
2005/09/16(金) 09:24:08ID:???C++は、仕様を拡張していく過程でよく考えないまま多重継承を盛り込んでしまって
(最初から多重継承があったわけじゃない)、後で「なんだこりゃ、こんなバカな仕様、
作り直して多重継承は廃止しろ!」という極論まで出て、そのときの大論争の中で、
「そうか、C++において多重継承が有用で、かつそれなしでは実現が困難だと思わ
れる事例というのは、実は単一継承とインタフェースの実装という形で綺麗に
まとめることができるんじゃないか。でも、一度規格に入れてしまったら、もう手遅れ
だよなぁ・・・ orz」と、いうような流れになったのが、10年くらい前のこと。
当時のC++開発者コミュニティの激論は、本にもなっているよね。
その反省のもとにJavaでは、継承とインタフェースを切り分けたわけじゃん。
そこら辺を踏まえたうえで、インタフェースも継承の一種だと主張するなら、そりゃ、
まことにごもっともなんだけど・・・ >>801 って、そこまで考えた上で言ってる?
0814nobodyさん
2005/09/16(金) 09:29:22ID:???自己慢でinterface導入するなら迷惑だぞ。
0815nobodyさん
2005/09/16(金) 09:44:36ID:???0816nobodyさん
2005/09/16(金) 11:13:11ID:???実装すべきメソッド名とそのパラメータ数(arity)
でFA?
0817nobodyさん
2005/09/16(金) 12:03:47ID:N1oYIrfoてかPHPレベルでは設計とかもいらないだろ
俺はいきなり頭のなかにあるプログラムを書いていき
そして、修正し、うまくいかないときはその機能をすぱっと
きりすてる。デザイナーデザインしたやつも、わからないと
消すよ。ぶっちゃけ上司はそれでもわからんからOKでしょ。
0819nobodyさん
2005/09/16(金) 14:17:10ID:???PHPでは型宣言が無いためその恩恵をほとんど受け入れられない。
だから、例えば『PHPでGoFのデザインパターンを使ってみました』
なんてのは大抵のパターンにおいて意味がない。
0820nobodyさん
2005/09/16(金) 14:18:29ID:???何を作るか次第でしょう。
そりゃ単なる掲示板を作るだけなら要らない。
MVCでいうMの部分が複雑なロジックになるなら必要になってくる。
0821nobodyさん
2005/09/16(金) 23:31:16ID:???> >>801
> > このコードの意味がわからんのか。interfaceで多重継承している例だ
> > class A extends B implements C, D, E, F, G{}
>
> 勘弁してよ。
> C-Gからは、メソッドもプロパティも全く継承していないじゃん。できるわけがない。
おいおい、本当にinterfaceというものがどういうものかわかっているのか。
まったく信じられん。
Javaでは空のインターフェースは問題なくコンパイルできるぞ。
よくいわれるマーカーインターフェースという奴だ。
メソッドを一切持たないinterfaceのことをマーカーインターフェースと呼ぶのだ。
Javaのマーカーインターフェースの例としてはSerializableだ。
当該のオブジェクトがシリアライズ可能であることを示すためだけに使われる。
> C-Gは、インタフェースとしての受け口を決めたというだけで、実体としては空っぽ
> なんだから。存在しないメソッドやプロパティを継承できるわけないさ。
言っておくが、上記のコードでも問題なくプログラムは動くぞ。
JavaであってもPHP5であってもだ。エラーも警告も一切出ずにな。
interfaceにメソッドやフィールド(プロパティ)がないと継承(実装)が使えないと勘違いしているとは
もはや驚くとしか言いようがない。呆れるとまでいいたくなるくらいだ。
0822nobodyさん
2005/09/17(土) 00:07:13ID:???そんなことはぜんぜんいってないだろと
0824nobodyさん
2005/09/17(土) 00:47:08ID:???さすがにここまで支離滅裂な長文を書いてくれると、苦笑いするしかないな・・・
あはははは・・・
> interfaceにメソッドやフィールド(プロパティ)がないと継承(実装)が使えない
っていう内容を含むレスはおまいが初めてだよ。
0825nobodyさん
2005/09/17(土) 00:59:45ID:???interfaceをimplementsするのは「インターフェースの継承」。
classをextendsするのは「インターフェースと実装の継承」。
812のいう「『C++の多重継承』の『継承』」は、インターフェースを除く「実装の継承」のこと。
だから「全く継承していないじゃん」になるんだが、理解できてないあたり821はC++やったことないだろ?
0826nobodyさん
2005/09/17(土) 02:04:59ID:???んだろうけど・・・ なんだかなあ
0828nobodyさん
2005/09/17(土) 02:39:50ID:???ひしひしと思った初秋…
0830nobodyさん
2005/09/17(土) 14:40:24ID:???しかも嘆かわしいことに、その本の犠牲者も実在していたということだな。
>>828
821は、たぶん、職場で浮いている理由が自覚できないまま、「なぜ自分は
部下や同僚や上司からバカにされているんだろう」と、いつも自分が不当に
扱われていることに悩んでいるのかも知れない。
0831nobodyさん
2005/09/17(土) 15:25:07ID:???↓この一文が勘違いしている証拠。
> なんだから。存在しないメソッドやプロパティを継承できるわけないさ。
0832nobodyさん
2005/09/17(土) 15:31:27ID:???おまえさ
『インターフェース継承』って言葉使わないの
それを略して継承っていうこともあるんだよ。
その程度のことで揚げ足とっておけば自分の無知を隠せるとでも
思ってるのかねインターフェース不要派は。
ようは、PHP5でクラスだけで実装多重継承ができるかどうかって話だろ。
>>812はできるんだと思い込んでいるらしいが>>799でできないとすでに証明されている。
それにもかかわらず>>812はこんな変なことを言って誤魔化している。
> C-Gは、インタフェースとしての受け口を決めたというだけで、実体としては空っぽ
> なんだから。存在しないメソッドやプロパティを継承できるわけないさ。
むしろお前らのほうがアホだろ。
0833nobodyさん
2005/09/17(土) 15:45:30ID:???interfaceのimplements = インターフェース継承
これらを総称して『継承』と定義しよう
そうすればこれまでの話はすべてかみ合う。
●class
実装多重継承できない。実装単一継承のみできる。
abstractであるでないにかかわらずメソッドのオーバーライド可能。
空のクラスも継承できる。
スーパークラスにabstractになっているメソッドがある場合は必ずオーバーライドしなければならない。
●interface
インターフェース多重継承が可能、実装多重継承できない。
インターフェース実装方法はimplementsの後にインターフェース名をカンマで区切って列挙する。
空のインターフェースでも実装できる。それをマーカーインターフェースと呼ぶ。
abstractになっているメソッドをオーバーライド可能。
メソッドに実装を記述することはできない。定義のみ。
フィールドはすべてpublic static final
クラスがメソッドをもつインターフェースを実装した場合はそのクラスにかならず
そのメソッドをオーバーライドしなければならない。
0834nobodyさん
2005/09/17(土) 15:47:05ID:???インターフェースC,D,E,F,Gに少なくとも
何かメソッド、フィールドが無ければ
class A extends B implements C, D, E, F, G{}
と書いてもエラーになると勘違いしている可能性があるね。
0835nobodyさん
2005/09/17(土) 15:48:48ID:???class A extends B, C{}
という実装多重継承をする記法をPHP5で
行ってもエラーにならないと勘違いしている可能性が非常に高い。
0836nobodyさん
2005/09/17(土) 15:51:23ID:???interface不要派の主張は
「C++のようにPHPでも実装多重継承を許すべきだ」
ということ?
0837nobodyさん
2005/09/17(土) 15:57:04ID:LyIaKOuCある言語では継承のことを拡張とよんだり汎化と呼んだり。
メソッドのことをメンバ関数、操作
フィールドのことをメンバ変数、プロパティ、属性
スーパークラスのことを親クラス、基本クラス
サブクラスのことを子クラス、拡張クラス
抽象メソッドのことを純粋仮想関数
とね。このあたりの違いが喧嘩の原因になったんだと思われ。
0838nobodyさん
2005/09/17(土) 17:12:22ID:???0839nobodyさん
2005/09/17(土) 17:12:53ID:???0840nobodyさん
2005/09/17(土) 17:37:19ID:???継承はis-a関係が成り立ってないと駄目。
でもJavaはそれを保証する事が言語仕様上では困難。
0841nobodyさん
2005/09/17(土) 17:38:50ID:???これで同じインターフェースを実装している
実装クラス群を同じように扱える。
ところがPHPでは型宣言が無いため
関係ないたまたま同一メソッドを持ったクラスも同じように扱えてしまう
0842nobodyさん
2005/09/17(土) 17:39:47ID:???PHPでは役に立たないということが完全に証明できた。
0843nobodyさん
2005/09/17(土) 17:41:18ID:???デマですね。
0844nobodyさん
2005/09/17(土) 17:43:52ID:???> 継承はis-a関係が成り立ってないと駄目。
> でもJavaはそれを保証する事が言語仕様上では困難。
(゚Д゚)ハァ? 意味ワカンネ。
何で困難になるんだ?
is-a関係を成り立たせるために継承があるんじゃん。
そういうことはJavaでもPHP5でも変わらないんだけど。
0845nobodyさん
2005/09/17(土) 17:45:06ID:???> だからinterfaceを使う。
> これで同じインターフェースを実装している
> 実装クラス群を同じように扱える。
> ところがPHPでは型宣言が無いため
> 関係ないたまたま同一メソッドを持ったクラスも同じように扱えてしまう
(゚Д゚)ハァ?
>>842
> 故にJavaでinterfaceや役に立つが
> PHPでは役に立たないということが完全に証明できた。
(゚Д゚)ハァ?
0846nobodyさん
2005/09/17(土) 17:52:20ID:???継承する側が注意を払わないと成り立たないという意味。
0847nobodyさん
2005/09/17(土) 17:59:29ID:???0849nobodyさん
2005/09/17(土) 18:02:54ID:???0850nobodyさん
2005/09/17(土) 18:19:55ID:???Object interfaces allow you to create code which specifies which methods a class must implement, without having to define how these methods are handled.
クライアント(呼びだす側)が気にすることはない
0851nobodyさん
2005/09/17(土) 19:16:15ID:???なんでそういう解釈になるかなあ。
interfaceによる実装と多重継承を混同するなっつってんだよ。
>>836
> 「C++のようにPHPでも実装多重継承を許すべきだ」
なんでやねん。
というか誰もinterfaceが不要なんて言ってないような気がするが。
0852nobodyさん
2005/09/17(土) 19:53:28ID:???あまりに無駄な議論だ
0854nobodyさん
2005/09/17(土) 20:18:58ID:???> 「C++のようにPHPでも実装多重継承を許すべきだ」
そんな主張をしている発言はひとつも存在しないんだが・・・
どういうわけか、存在しない架空の脳内発言を勝手に作っておいて、
その架空の主張に反論しようとして、大騒ぎしている人がいるね。
スレが混乱している元凶は、それだ。
0856nobodyさん
2005/09/17(土) 20:31:04ID:???「JavaのinterfaceはC++の多重継承の代用品だと書いている本は、インチキだ」
という点については、「C++の多重継承」と明記しているんだから、正しいと思うんだが。
それ以外の、どうやら各人ごとに好き勝手に定義している語義のあいまいであるほうの
『多重継承』については、誰が何を言っているのやらワケが分からんし、これ以上、
続ける価値はあるまい。そろそろお開きにしてくれ。
それにしても、存在しない主張を脳内に作って反論するのはいかがなものか。
いや、プログラマにありがちな「問題ない症候群(No-Problem Syndorome:NPS)」の
いち形態なんで、現場でしょっちゅう見聞きする病気ではあるんだが。悪意はないはず。
解くべき問題を把握ことなく、「こんなの分かりきった問題だ」と思い込んで、的外れな
コードや仕様書をいきなり書き始めて後で地獄に落ちるタイプだ。
0857nobodyさん
2005/09/17(土) 21:27:32ID:???レベル低すぎるし
0858nobodyさん
2005/09/17(土) 21:50:06ID:PCMxsCgE> その程度のことで揚げ足とっておけば自分の無知を隠せるとでも
> 思ってるのかねインターフェース不要派は。
825は、インタフェース不要派じゃないぜ。脳内妄想もほどほどに。
0859nobodyさん
2005/09/17(土) 21:54:30ID:???誤字脱字注意すべし。Syndromeね
interfaceはともかく、try-catchがあるんだからfinallyが欲しい
0860856
2005/09/17(土) 22:00:09ID:???おっと失礼。どこにでも母音を入れてしまう「じゃぱにいずイングリッシュ」でした。
「把握ことなく」も変だ。他人に突っ込みを入れておきながら、自分がこれとは、
お恥ずかしい限り。 orz
0861nobodyさん
2005/09/18(日) 18:29:03ID:???ライブラリを利用するのコードを書く側へのドキュメンテーションに使うんだろうな。
0862nobodyさん
2005/09/18(日) 18:43:30ID:???0863nobodyさん
2005/09/18(日) 20:27:34ID:???この話題、まだやってたのか…。
0864nobodyさん
2005/09/19(月) 01:27:07ID:???このスレの特徴としては、言い合いになったときに話の収拾をつけることを忘れて自己主張する香具師が多いこと。
これじゃまとまるものもまとまらんので、じっとスルーしておくしかないと思われ。
0865nobodyさん
2005/09/19(月) 04:46:51ID:miiafsuDどこで処理してますか?
俺は
DBでエラーが起きる=イレギュラーで致命的な事態が起こっているから
DBアクセスクラスの中から直接エラーページにリダイレクト
にしてるんだけど。
0867nobodyさん
2005/09/19(月) 21:50:22ID:???> >844
> 継承する側が注意を払わないと成り立たないという意味。
んなことPHP5でも同じことだろが。
何いっとんだおめえ。頭悪すぎ
0868nobodyさん
2005/09/19(月) 22:00:31ID:???> >>836
> > 「C++のようにPHPでも実装多重継承を許すべきだ」
>
> なんでやねん。
> というか誰もinterfaceが不要なんて言ってないような気がするが。
そんな誤魔化しや嘘が通用するとでも思っておるのかなw
PHPではinterfaceが不要と言っているPHP厨すぐそこにいるぞw
ほれ
>>842, >>814, >>753, >>752, >>747, >>727
他の香具師はうまいこといって不要じゃないとかいっているが
interfaceの存在意義がなんだとか言ってる奴がまだどこかにあるぞw
0869nobodyさん
2005/09/19(月) 22:02:37ID:???意味ねーことやめれ。誰も得してないぞ。
0870nobodyさん
2005/09/19(月) 22:13:13ID:???使いたくない人は使わない、
では駄目でしょうか?
0871nobodyさん
2005/09/19(月) 22:28:29ID:???0872nobodyさん
2005/09/19(月) 22:29:56ID:???俺もそう思うね。
JavaはWebアプリに特化した言語じゃないし、
PHPは大規模Webアプリに向いてない。
PHPでinterfaceを使うような開発状況(?)は限られてると思うし、
多分要らないって言う人は小規模のWebアプリ作成者、
一人で作ってる人とかだと思う。
多人数で開発行ったり、他人にメンテさせたいとか
の場合にinterfaceは効果発揮するんじゃないかな。
と素人の俺がよくわからないまま発言してみる。
0873nobodyさん
2005/09/19(月) 22:47:25ID:???今までにいくつかすでに語られているが、
●ひとつのオブジェクトに複数の型を持たせることができる。
●『具象メソッドをもたない抽象クラス』を宣言できる。
●そしてさらにそのクラス多重継承できる。
●メソッドを持たない、あることを示すマーカーインターフェースを定義できる。
●定数定義専用クラスとして使うことができる。
●デザインパターンのいくつかは、interfaceが無ければ実現できないものがある。
例 : Prototypeパターン(代替手段はある),
Mediatorパターン, Strategyパターン, Observerパターン, Stateパターン,
Proxyパターン, Commandパターン
そのほかにもメリットはまだまだあるが語りきれない。
0874nobodyさん
2005/09/19(月) 22:47:43ID:???それから、クラスにする必要が無いものはインターフェースにしておくと良いときがよくある。
インターフェースにしておくことであるクラスAにこのクラスThisClassを実装したがったが
すでに他にクラスSuperAによって継承されている。そんなときクラスThisClassではなく
インターフェースThisInterfaceに切り替えることで、インターフェースThisInterfaceを
あるクラスAに実装することでができる。
class A extends SuperA implements ThisInterface {}
デザインパターンにはそういったサンプルがいくつもある。
逆に、インターフェースではなく抽象クラスのほうが良い場合もある。
抽象クラスにしておけば、不要なインターフェースどうしの多重継承を防ぐことができる。
注 : インターフェースどうしは、『多重継承』ができる。
interface A{}
interface SubA1 extends A{}
interface SubA2 extends A{}
interface SubSubA extends SubA1, SuA2{}
こんなダイヤモンド継承じみたこともできる。(これ自体には特に意味は無いが)
interfaceを使うメリットをもっと詳しくしりたければデザインパターンについて勉強して来い。
0875nobodyさん
2005/09/19(月) 22:50:18ID:???マーカーインターフェースの話を持ち出すことがレベル低いのか。
なぜレベルが低いのかね。
それが説明できなきゃお前こそが根拠もなくただ主観的に判断しているだけの
レベルの低い人間だと見なされるぞ。
0876nobodyさん
2005/09/19(月) 22:55:50ID:???はて、それだけに使うものかな。
インターフェースXを定義したとして
interface X{}
あるクラスYがインターフェースXを実装したとする。
class Y implements X{}
そしてあるクラスAで
イカのようにインターフェースを呼び出す
class A {
public function do(){
$x = new Y();
}
}
このオブジェクト$xをどこで使うか?
このオブジェクトを呼び出すメソッド作る。
そこではPHP5から可能になってメソッド引数の型を
限定できる機能。
public doMethod(X $x){
}
これに使うことができる。
class A {
public function do(){
$x = new Y();
doMethod($x);
}
private doMethod(X $x){
}
}
こんな感じでだ。これもinterfaceを使うメリットのひとつ。
0878nobodyさん
2005/09/19(月) 23:07:58ID:???ついにそれを主張したか。
まあ、それ用いる箇所ではメリットになるわな。
でも結局その方向だと現在の型宣言を省略できるPHPは糞で
全てJavaの仕様が良いんだって事になってしまうと思うんだけどなあ。
0879nobodyさん
2005/09/19(月) 23:08:00ID:???そう思うなら、このケースではどうかな?
抽象クラス Cを定義したとして
abstract class C{
private $string;
public final function getString(){
return $this->string;
}
public final function setString($string){
$this->string = $string;
}
abstract protected function doSomething();
}
以下のようにクラスXを定義した。
class X{}
このクラスXを、
抽象クラスCを継承したクラスYに継承させようとした。
ところがPHP5では多重継承できない。以下のコードはエラーになる。
class Y extends C, X{
//(ry
}
そこでクラスXをインターフェースXに置き換えた。
interface X{}
class Y extends C implements X {
(ry
}
こんな感じになると嫌でもinterfaceを使わざるをえなくなる。
0880nobodyさん
2005/09/19(月) 23:12:35ID:???まて、PHPにはget_class()というクラスがある。
型が曖昧とはいえ、Javaのようにスマートにはいかないものの、
型を厳しくする手段はある。
0881nobodyさん
2005/09/19(月) 23:14:34ID:???interfaceがなくても実現できる方法はあるが
それでは柔軟性がない。
とくに>>879のような状態に陥ったら
何が何でもinterfaceを使わざるをえなくなる。
デザインパターンを上手に使うならinterfaceやastract classを上手に使い分けることだ。
0883nobodyさん
2005/09/19(月) 23:24:16ID:???しょっぼ!
0884nobodyさん
2005/09/19(月) 23:32:37ID:???■ このスレッドは過去ログ倉庫に格納されています