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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
0782名無しさん@そうだ選挙に行こう2005/09/11(日) 12:25:07ID:???
PHPにはインターフェイスが実装されていますよ

ものすごく都合よく解釈した広い意味で
0783名無しさん@そうだ選挙に行こう2005/09/11(日) 14:06:04ID:???
>>749,751
非常に嘆かわしいことに、インチキなJavaの入門書には、
「JavaではC++の多重継承の代用品としてInterfaceというものがあります」
なんて、腐りきった解説が今でもあったり・・・ すごく哀しい。
0784名無しさん@そうだ選挙に行こう2005/09/11(日) 14:08:59ID:???
相当、古くに出版された本では?
Java登場初期の頃にそう言われていたのは事実。
デザインパターンとかが普及してきてから変わってきた。
0785名無しさん@そうだ選挙に行こう2005/09/11(日) 16:00:13ID:???
言われていたって、間違った本が出版されてそれを鵜呑みにしていた奴がいただけだろ。
昔はそれが常識で事実だったみたいな言い方はよくない。
0786名無しさん@そうだ選挙に行こう2005/09/11(日) 16:12:44ID:???
そもそもinterfaceが多重継承の代用になるという
発想が意味分からないな。
0787名無しさん@そうだ選挙に行こう2005/09/11(日) 16:34:34ID:???
C++使ったことないからそもそも多重継承なんて知らん。
0788名無しさん@そうだ選挙に行こう2005/09/11(日) 17:19:05ID:???
多重継承って孫クラスまでできると考えていいのでしょうか?
0789名無しさん@そうだ選挙に行こう2005/09/11(日) 18:43:04ID:???
test
0790名無しさん@そうだ選挙に行こう2005/09/11(日) 18:46:55ID:???
ttp://www.cmagazine.jp/src/kinjite/cpp/scale.html#index1
C++だが、参考になると思う。
0791nobodyさん2005/09/12(月) 19:02:44ID:???
SQLの記述で
$sql = "select * from $table"
みたいに
$sql = "select * from $this->table"
と書いたらエラーになるのってキモくね?
この気持ちをどうしたらいいですか。
0792nobodyさん2005/09/12(月) 19:51:17ID:???
>>791
後者の書き方でエラーにならないほうがキモいだろ。
0793nobodyさん2005/09/12(月) 20:19:02ID:???
>>791
$sql = "select * from {$this->table}";
0794nobodyさん2005/09/12(月) 21:17:25ID:???
定数も何らかの形で直接文字列に埋め込めると嬉しいなぁ
0795nobodyさん2005/09/12(月) 21:24:32ID:???
>>793
うおー
tnxです
0796nobodyさん2005/09/14(水) 06:17:54ID:uQ+GcINS
テーブルごとにDAO作ってたんだけど
(StatementDAO,ThreadDAO等)
結合しなきゃならないケースが出てきた。
結合の場合、DAOってどうすればいいの?
0797nobodyさん2005/09/14(水) 19:20:52ID:???
>>796
DAOというよりはDataMapperに近い考え方なのかな。んで、
「さて結合の場合はどうしよう?」ってのがO/Rマッピングの課題の1つじゃなかったっけか。

自分の場合、例えば都道府県名とかあるレコードの属性に関する情報はgetterで結合しちゃってる。
呼び出しを冗長にしたくない場合はgetDetail()なんかのメソッドを作ってそっちを結合専用にしている。

複雑な結合を含むselectが必要な場合は、そのselectがどのテーブルを基にしたものかを判断し、
そのテーブル(用のクラス)にメソッドを追加してる。
0798nobodyさん2005/09/16(金) 02:45:16ID:???
>>783
ちょっとまて。

それではclassだけで多重継承ができるという誤解を生むぞ。

A extends B, C, D,E {}
を許す結果になるぞ。

それに>>788は勘違いしている。

それから、>>775は
>>741や>>745が
「Interfaceがないと多重継承ができないからダメだ」と言っていると
勘違いしているがそんなことはどこにも書いていない。

「interfaceがないと多重継承ができない」とは書いてはあるが
それがダメだなんてことはどこにも書いていない。
勘違いしすぎ。だから>>788や>>753, >>727のような誤解をする者が出てくる。
0799nobodyさん2005/09/16(金) 03:01:56ID:agfKPRSn
>>783をはじめとしてお前ら本当にマジレスしているのか?
ネタとしてもおかしいぞ。

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:???
>>779
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:???
783は正しい
0803nobodyさん2005/09/16(金) 03:24:38ID:???
( ゚д゚)・・・
0804nobodyさん2005/09/16(金) 03:27:13ID:???
interfaceの複数インプリメンテーションは
多重継承とは言わないんじゃないか?
何も「継承」はしてないぞ。
0805nobodyさん2005/09/16(金) 03:31:47ID:???
だいたいJavaやPHP5は
複雑さを取り除くためにわざわざ多重継承を使えなくしてるのに
「多重継承の代用品としてのinterface」を用意する理由があろうか。
頭の固い若者が突然張り切って飛び込んできたという印象を受けるな。
0806nobodyさん2005/09/16(金) 03:35:09ID:???
そもそも単なる継承でさえ使う場面は非常に限られているからね
0807nobodyさん2005/09/16(金) 03:37:15ID:???
>>801
extendsとinterfaceの違いをよく考えろ。
interfaceはextendsの代用品じゃない。
783はあくまでも正しい。
0808nobodyさん2005/09/16(金) 05:01:43ID:???
つーか、PHP5ってオーバーロードできねーの?
0809nobodyさん2005/09/16(金) 05:42:34ID:???
>>808
func_get_argsとかfunc_num_argsで場合分けするしかない。
0810nobodyさん2005/09/16(金) 07:04:08ID:CbtypFEe
pearの本でてたのでかいました。
0811nobodyさん2005/09/16(金) 09:02:30ID:lrPJbkxR
>>801
どこらへんがデマ?

いや、マジで。
0812nobodyさん2005/09/16(金) 09:18:03ID:???
>>801
> このコードの意味がわからんのか。interfaceで多重継承している例だ
> class A extends B implements C, D, E, F, G{}

勘弁してよ。
C-Gからは、メソッドもプロパティも全く継承していないじゃん。できるわけがない。

C-Gは、インタフェースとしての受け口を決めたというだけで、実体としては空っぽ
なんだから。存在しないメソッドやプロパティを継承できるわけないさ。

なるほど、「インタフェースを継承している」という言い方はできなくもないが、
でも、それはここで話している『C++の多重継承』の『継承』じゃないと思うぞ?
08138122005/09/16(金) 09:24:08ID:???
で、過去のいきさつとしては・・・

C++は、仕様を拡張していく過程でよく考えないまま多重継承を盛り込んでしまって
(最初から多重継承があったわけじゃない)、後で「なんだこりゃ、こんなバカな仕様、
作り直して多重継承は廃止しろ!」という極論まで出て、そのときの大論争の中で、
「そうか、C++において多重継承が有用で、かつそれなしでは実現が困難だと思わ
れる事例というのは、実は単一継承とインタフェースの実装という形で綺麗に
まとめることができるんじゃないか。でも、一度規格に入れてしまったら、もう手遅れ
だよなぁ・・・ orz」と、いうような流れになったのが、10年くらい前のこと。

当時のC++開発者コミュニティの激論は、本にもなっているよね。

その反省のもとにJavaでは、継承とインタフェースを切り分けたわけじゃん。
そこら辺を踏まえたうえで、インタフェースも継承の一種だと主張するなら、そりゃ、
まことにごもっともなんだけど・・・ >>801 って、そこまで考えた上で言ってる?
0814nobodyさん2005/09/16(金) 09:29:22ID:???
つーか、PHPでinterface使って生産性あがるのか?
自己慢でinterface導入するなら迷惑だぞ。
0815nobodyさん2005/09/16(金) 09:44:36ID:???
生産性は落ちるかもしらんが、バグ防止と保守性は上がると思われ
0816nobodyさん2005/09/16(金) 11:13:11ID:???
PHPのinterfaceで強制できるのは、
実装すべきメソッド名とそのパラメータ数(arity)
でFA?
0817nobodyさん2005/09/16(金) 12:03:47ID:N1oYIrfo
ぶっちゃけオブジェクト指向は必要ないとおもわん?
てかPHPレベルでは設計とかもいらないだろ
俺はいきなり頭のなかにあるプログラムを書いていき
そして、修正し、うまくいかないときはその機能をすぱっと
きりすてる。デザイナーデザインしたやつも、わからないと
消すよ。ぶっちゃけ上司はそれでもわからんからOKでしょ。
0818nobodyさん2005/09/16(金) 12:23:35ID:???
>>815
具体的に。

>>816
PHPの言語仕様上だけの話ならFA。
0819nobodyさん2005/09/16(金) 14:17:10ID:???
Javaにおけるinterfaceの一番のメリットはポリモーフィズムでしょ。
PHPでは型宣言が無いためその恩恵をほとんど受け入れられない。

だから、例えば『PHPでGoFのデザインパターンを使ってみました』
なんてのは大抵のパターンにおいて意味がない。
0820nobodyさん2005/09/16(金) 14:18:29ID:???
>>817
何を作るか次第でしょう。
そりゃ単なる掲示板を作るだけなら要らない。
MVCでいうMの部分が複雑なロジックになるなら必要になってくる。
0821nobodyさん2005/09/16(金) 23:31:16ID:???
>>812
> >>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:???
821はアホな子なのか、それともわざとか?
そんなことはぜんぜんいってないだろと
0823nobodyさん2005/09/17(土) 00:09:14ID:???
>>816
TypeHinting併用で引数の型をある程度限定できるけど・・・
0824nobodyさん2005/09/17(土) 00:47:08ID:???
>>821
さすがにここまで支離滅裂な長文を書いてくれると、苦笑いするしかないな・・・
あはははは・・・

> interfaceにメソッドやフィールド(プロパティ)がないと継承(実装)が使えない

っていう内容を含むレスはおまいが初めてだよ。
0825nobodyさん2005/09/17(土) 00:59:45ID:???
>>821
interfaceをimplementsするのは「インターフェースの継承」。
classをextendsするのは「インターフェースと実装の継承」。
812のいう「『C++の多重継承』の『継承』」は、インターフェースを除く「実装の継承」のこと。
だから「全く継承していないじゃん」になるんだが、理解できてないあたり821はC++やったことないだろ?
0826nobodyさん2005/09/17(土) 02:04:59ID:???
おそらく「継承とは何ぞや」という日本語のレベルで、意思の疎通がとれてない
んだろうけど・・・ なんだかなあ
0827nobodyさん2005/09/17(土) 02:38:28ID:???
継承の意味に関して意思の疎通がとれてないのは>>821だけだったようだが
0828nobodyさん2005/09/17(土) 02:39:50ID:???
821みたいな奴とは絶対リアルで付き合いたくないと
ひしひしと思った初秋…
0829nobodyさん2005/09/17(土) 02:42:13ID:???
>>821
いっぱい釣れたネ
0830nobodyさん2005/09/17(土) 14:40:24ID:???
確実にいえることは、>>783が嘆いているような本が実在していたばかりか、
しかも嘆かわしいことに、その本の犠牲者も実在していたということだな。

>>828
821は、たぶん、職場で浮いている理由が自覚できないまま、「なぜ自分は
部下や同僚や上司からバカにされているんだろう」と、いつも自分が不当に
扱われていることに悩んでいるのかも知れない。
0831nobodyさん2005/09/17(土) 15:25:07ID:???
でもあきらかに>>812は勘違いしているよ。

↓この一文が勘違いしている証拠。

> なんだから。存在しないメソッドやプロパティを継承できるわけないさ。
0832nobodyさん2005/09/17(土) 15:31:27ID:???
>>825
おまえさ
『インターフェース継承』って言葉使わないの
それを略して継承っていうこともあるんだよ。
その程度のことで揚げ足とっておけば自分の無知を隠せるとでも
思ってるのかねインターフェース不要派は。

ようは、PHP5でクラスだけで実装多重継承ができるかどうかって話だろ。
>>812はできるんだと思い込んでいるらしいが>>799でできないとすでに証明されている。
それにもかかわらず>>812はこんな変なことを言って誤魔化している。

> C-Gは、インタフェースとしての受け口を決めたというだけで、実体としては空っぽ
> なんだから。存在しないメソッドやプロパティを継承できるわけないさ。


むしろお前らのほうがアホだろ。
0833nobodyさん2005/09/17(土) 15:45:30ID:???
classのextends = 実装継承
interfaceのimplements = インターフェース継承

これらを総称して『継承』と定義しよう


そうすればこれまでの話はすべてかみ合う。

●class
実装多重継承できない。実装単一継承のみできる。
abstractであるでないにかかわらずメソッドのオーバーライド可能。
空のクラスも継承できる。
スーパークラスにabstractになっているメソッドがある場合は必ずオーバーライドしなければならない。
●interface
インターフェース多重継承が可能、実装多重継承できない。
インターフェース実装方法はimplementsの後にインターフェース名をカンマで区切って列挙する。
空のインターフェースでも実装できる。それをマーカーインターフェースと呼ぶ。
abstractになっているメソッドをオーバーライド可能。
メソッドに実装を記述することはできない。定義のみ。
フィールドはすべてpublic static final
クラスがメソッドをもつインターフェースを実装した場合はそのクラスにかならず
そのメソッドをオーバーライドしなければならない。
0834nobodyさん2005/09/17(土) 15:47:05ID:???
>>812は
インターフェースC,D,E,F,Gに少なくとも
何かメソッド、フィールドが無ければ
class A extends B implements C, D, E, F, G{}
と書いてもエラーになると勘違いしている可能性があるね。
0835nobodyさん2005/09/17(土) 15:48:48ID:???
そして>>775は
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:???
Javaの継承は拡張って意味じゃん。extendsって書くのだもの。
継承はis-a関係が成り立ってないと駄目。
でもJavaはそれを保証する事が言語仕様上では困難。
0841nobodyさん2005/09/17(土) 17:38:50ID:???
だからinterfaceを使う。
これで同じインターフェースを実装している
実装クラス群を同じように扱える。
ところがPHPでは型宣言が無いため
関係ないたまたま同一メソッドを持ったクラスも同じように扱えてしまう
0842nobodyさん2005/09/17(土) 17:39:47ID:???
故にJavaでinterfaceや役に立つが
PHPでは役に立たないということが完全に証明できた。
0843nobodyさん2005/09/17(土) 17:41:18ID:???
> PHPでは役に立たないということが完全に証明できた。

デマですね。
0844nobodyさん2005/09/17(土) 17:43:52ID:???
>>840

> 継承はis-a関係が成り立ってないと駄目。
> でもJavaはそれを保証する事が言語仕様上では困難。
(゚Д゚)ハァ? 意味ワカンネ。
何で困難になるんだ?
is-a関係を成り立たせるために継承があるんじゃん。
そういうことはJavaでもPHP5でも変わらないんだけど。
0845nobodyさん2005/09/17(土) 17:45:06ID:???
>>841
> だからinterfaceを使う。
> これで同じインターフェースを実装している
> 実装クラス群を同じように扱える。
> ところがPHPでは型宣言が無いため
> 関係ないたまたま同一メソッドを持ったクラスも同じように扱えてしまう
(゚Д゚)ハァ?

>>842
> 故にJavaでinterfaceや役に立つが
> PHPでは役に立たないということが完全に証明できた。
(゚Д゚)ハァ?
0846nobodyさん2005/09/17(土) 17:52:20ID:???
>844
継承する側が注意を払わないと成り立たないという意味。
0847nobodyさん2005/09/17(土) 17:59:29ID:???
さぁ、そろそろ無限ループから抜け出す時間ですよ
0848nobodyさん2005/09/17(土) 18:01:26ID:???
>>842
一応こういうことが出来るんだけどね
is_a($class, 'IInterface');
0849nobodyさん2005/09/17(土) 18:02:54ID:???
そもそもinterfaceのメリットを主張してみろよw
0850nobodyさん2005/09/17(土) 18:19:55ID:???
>>849
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:???
>>835
なんでそういう解釈になるかなあ。
interfaceによる実装と多重継承を混同するなっつってんだよ。

>>836
> 「C++のようにPHPでも実装多重継承を許すべきだ」 

なんでやねん。
というか誰もinterfaceが不要なんて言ってないような気がするが。
0852nobodyさん2005/09/17(土) 19:53:28ID:???
もうキチガイはほっとけよ
あまりに無駄な議論だ
0853nobodyさん2005/09/17(土) 20:16:52ID:???
>>849
Javaの香りをPHPに持ち込むことができて、Java厨がご満悦できる。
0854nobodyさん2005/09/17(土) 20:18:58ID:???
>>836
> 「C++のようにPHPでも実装多重継承を許すべきだ」

そんな主張をしている発言はひとつも存在しないんだが・・・

どういうわけか、存在しない架空の脳内発言を勝手に作っておいて、
その架空の主張に反論しようとして、大騒ぎしている人がいるね。

スレが混乱している元凶は、それだ。
0855nobodyさん2005/09/17(土) 20:20:38ID:???
>>834
ないよ。
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
>>832
> その程度のことで揚げ足とっておけば自分の無知を隠せるとでも
> 思ってるのかねインターフェース不要派は。

825は、インタフェース不要派じゃないぜ。脳内妄想もほどほどに。
0859nobodyさん2005/09/17(土) 21:54:30ID:???
>>856
誤字脱字注意すべし。Syndromeね

interfaceはともかく、try-catchがあるんだからfinallyが欲しい
08608562005/09/17(土) 22:00:09ID:???
>>859
おっと失礼。どこにでも母音を入れてしまう「じゃぱにいずイングリッシュ」でした。
「把握ことなく」も変だ。他人に突っ込みを入れておきながら、自分がこれとは、
お恥ずかしい限り。 orz
0861nobodyさん2005/09/18(日) 18:29:03ID:???
結局PHPのinterfaceは、公布済みインターフェースを宣言するような感じのもので、
ライブラリを利用するのコードを書く側へのドキュメンテーションに使うんだろうな。
0862nobodyさん2005/09/18(日) 18:43:30ID:???
正解。
0863nobodyさん2005/09/18(日) 20:27:34ID:???
久し振りに見に来たけど
この話題、まだやってたのか…。
0864nobodyさん2005/09/19(月) 01:27:07ID:???
>>863
このスレの特徴としては、言い合いになったときに話の収拾をつけることを忘れて自己主張する香具師が多いこと。
これじゃまとまるものもまとまらんので、じっとスルーしておくしかないと思われ。
0865nobodyさん2005/09/19(月) 04:46:51ID:miiafsuD
DBの予想外のエラーって
どこで処理してますか?
俺は
DBでエラーが起きる=イレギュラーで致命的な事態が起こっているから
DBアクセスクラスの中から直接エラーページにリダイレクト
にしてるんだけど。
0866nobodyさん2005/09/19(月) 05:04:21ID:???
>>865
Exceptionを投げてcatchしたところで処理してる。
0867nobodyさん2005/09/19(月) 21:50:22ID:???
>>846
> >844
> 継承する側が注意を払わないと成り立たないという意味。
んなことPHP5でも同じことだろが。
何いっとんだおめえ。頭悪すぎ
0868nobodyさん2005/09/19(月) 22:00:31ID:???
>>851
> >>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:???
駄目だろ。PHPの今後の未来のために結論を出すことが不可欠。
0872nobodyさん2005/09/19(月) 22:29:56ID:???
>>870
俺もそう思うね。
JavaはWebアプリに特化した言語じゃないし、
PHPは大規模Webアプリに向いてない。
PHPでinterfaceを使うような開発状況(?)は限られてると思うし、
多分要らないって言う人は小規模のWebアプリ作成者、
一人で作ってる人とかだと思う。
多人数で開発行ったり、他人にメンテさせたいとか
の場合にinterfaceは効果発揮するんじゃないかな。
と素人の俺がよくわからないまま発言してみる。
0873nobodyさん2005/09/19(月) 22:47:25ID:???
>>849
今までにいくつかすでに語られているが、
●ひとつのオブジェクトに複数の型を持たせることができる。
●『具象メソッドをもたない抽象クラス』を宣言できる。
●そしてさらにそのクラス多重継承できる。
●メソッドを持たない、あることを示すマーカーインターフェースを定義できる。
●定数定義専用クラスとして使うことができる。
●デザインパターンのいくつかは、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:???
>>857
マーカーインターフェースの話を持ち出すことがレベル低いのか。
なぜレベルが低いのかね。
それが説明できなきゃお前こそが根拠もなくただ主観的に判断しているだけの
レベルの低い人間だと見なされるぞ。
0876nobodyさん2005/09/19(月) 22:55:50ID:???
>>861
はて、それだけに使うものかな。

インターフェース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を使うメリットのひとつ。
0877nobodyさん2005/09/19(月) 23:00:46ID:???
>>873
その interface が無いと実現できないデザパタって…本気で言ってるの?
0878nobodyさん2005/09/19(月) 23:07:58ID:???
>>876
ついにそれを主張したか。
まあ、それ用いる箇所ではメリットになるわな。

でも結局その方向だと現在の型宣言を省略できるPHPは糞で
全てJavaの仕様が良いんだって事になってしまうと思うんだけどなあ。
0879nobodyさん2005/09/19(月) 23:08:00ID:???
それだったらinterfaceを使わずabstract classで十分だろうって?
そう思うなら、このケースではどうかな?

抽象クラス 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:???
>>878
まて、PHPにはget_class()というクラスがある。
型が曖昧とはいえ、Javaのようにスマートにはいかないものの、
型を厳しくする手段はある。
0881nobodyさん2005/09/19(月) 23:14:34ID:???
>>877
interfaceがなくても実現できる方法はあるが
それでは柔軟性がない。
とくに>>879のような状態に陥ったら
何が何でもinterfaceを使わざるをえなくなる。
デザインパターンを上手に使うならinterfaceやastract classを上手に使い分けることだ。
0882nobodyさん2005/09/19(月) 23:16:51ID:???
>>865
PEAR::DBの真似じゃいけないの?
■ このスレッドは過去ログ倉庫に格納されています