トップページphp
435コメント132KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/12/02(金) 11:18:17ID:lnZM9OlM
サーバーサイドWebプログラミングのOOスレです。

・OOP、MVC、デザパタなどのコンセプト的な話題
・OOにまつわる言語比較(言語批判はその言語で開発してる人に失礼にあたることが多いのでなるべく禁止でお願いします)
・保守、再利用、生産性、開発環境などの実践的な話題
・Webサーバ、DBなどの外部との親和性に関する問題
・学習、教育などの方法論

などなど。

前スレ
PHPでオブジェクト指向プログラミング
http://pc8.2ch.net/test/read.cgi/php/1113724557/
0030nobodyさん2005/12/04(日) 02:35:54ID:???
出た!ポリモーフィズム!
0031nobodyさん2005/12/04(日) 14:51:34ID:???
>>30
じゃあ何て言うんだよこの馬鹿が。
0032nobodyさん2005/12/04(日) 15:22:04ID:???
>>30-31
他所へ行って構わなくてよ。
0033nobodyさん2005/12/05(月) 10:20:07ID:???
このスレ、ネタがないね。
とりあえず思ったことを書いてみるテスト。

MVCのM(MVCフレームワークに寄りかからない場合でもビジネスロジックをつっこむ部分)の設計について。
Webの場合は細かいエンティティをModelにしてしまうとかえって見通しが悪くなるから、割と大雑把なくくりでModelにした方が設計しやすい+実装しやすい+パフォーマンス的にも良いんだよね。
でもそうすると、関数でもいいものがメソッドになっただけで、ベタ書きロジックのラッパに過ぎないような実質シングルトンがいくつもできたりして。
それってオブジェクト指向という考えから反対方向に行ってしまってる。
形だけがオブジェクト指向風になってるって感じ。
もうちょっと勉強してくるわ。
0034nobodyさん2005/12/05(月) 11:12:40ID:???
もうちょっと具体的に頼む
0035nobodyさん2005/12/05(月) 18:30:47ID:???
単に設計がいまいちなだけじゃね?
ちゃんと考えて組めば、Mだけ客によって取り替えてウマーに出来ると思う。
まあ外向けとかで見栄えも気にするならMに加えてVも弄るから、分けずにMV+Cでもいいじゃんって発想?
0036nobodyさん2005/12/11(日) 16:50:09ID:TPyd81O7
PHP5でオブジェクト指向プログラミングって、
仕事ではまだほとんどやってない?
0037nobodyさん2005/12/12(月) 00:20:15ID:???
PHP 5 がまだなのかオブジェクト指向がまだなのか
どっちを聞きたいんだろ
0038nobodyさん2005/12/12(月) 05:07:04ID:???
PHP5からオブジェクト指向とったら何も残らないじゃん。
0039nobodyさん2005/12/12(月) 06:24:55ID:???
PHP5の仕様を学びながら同時にオブジェクト指向も学べるっていう
素敵本ってないですかねぇ?
0040nobodyさん2005/12/12(月) 07:15:15ID:???
>>39
OOやるならJavaのがいいと思う。
実際のところPHPだけでOO理解できた奴いるの?
0041nobodyさん2005/12/12(月) 08:01:46ID:???
まぁいいサンプルがあればいいんじゃないの?
おれは知らないけど
0042nobodyさん2005/12/12(月) 08:25:28ID:2/Uq4nev
PHP5で__CLASS__ってやるとクラス名を取得できるけど、staticメソッド内で

abstract class Hoge { static public function method() { echo "Fuga"; } }
class Fuga extends Hoge {}
Fuga::method();

これで"Fuga"って表示させる、みたいな。
0043422005/12/12(月) 08:28:10ID:2/Uq4nev
ごめん、日本語が中途半端だった。

× これで"Fuga"って表示させる、みたいな。
○ これで"Fuga"って表示させるにはどうしたらいいですか?
0044nobodyさん2005/12/12(月) 08:33:41ID:???
お前が質問したいのはそういうことじゃないだろ
0045422005/12/12(月) 08:41:37ID:???
あ、飽くまでecho "Fuga"っていうのを使わずに__CLASS__とかgetなんちゃらname()とかそういう類で"Fuga"を取得したいという意味です。
get_class($this)のstatic版みたいなのはないですかね?
0046nobodyさん2005/12/12(月) 09:03:12ID:???
ムリ
俺もこの仕様はなんとかならんものかと思ってる

但しその例だと

Fuga::method() →Fugaにない→親クラスのメソッドが呼ばれる

オーバーライドされていないため実際にはHuga::method()がコール
されるわけで親クラスの名前(Hoge)が表示されるのは正しい動作だと思う
0047nobodyさん2005/12/12(月) 09:06:42ID:???
Hugaって何だHogeだよHoge
0048nobodyさん2005/12/12(月) 09:13:38ID:???
staticはクラスメソッド的なニュアンスだしな
下で隠蔽しなきゃそのまま晒される
0049422005/12/12(月) 09:48:14ID:???
みなさんどうもです。
無理ですかねぇ。ちょっと頑張ってみたけどやっぱ無理でした。

abstract class Hoge {
static public function method() { echo self::getMyName(); }
abstract static protected function getMyName();
}

class Fuga extends Hoge {
static protected function getMyName() { return __CLASS__; }
}

Fuga::method();

staticメソッドってオーバーライドできないんですね・・・。
0050nobodyさん2005/12/12(月) 10:04:02ID:???
self::でサブクラスのメソッドが呼ばれるわけなかろ。
0051nobodyさん2005/12/12(月) 10:06:47ID:???
OO的には、staticメソッドは各クラスに固有のものだから
オーバーライドという概念自体が存在しない
0052nobodyさん2005/12/12(月) 10:10:07ID:???
>>38
オレ自身は半信半疑だけどスピード上がってるんでしょ?
0053422005/12/12(月) 10:55:39ID:???
>>50 >>51
納得。そうなんですか。継承はされるのに・・・、と考えるとむつかしいですね。
まあとりあえずできました!!

abstract class Hoge {
static public function method() {
$bt = debug_backtrace();
for ($i = 1; $i < count($bt); $i ++)
if (empty($bt[$i]["type"]) or $bt[$i]["type"] != "::" or $bt[$i]["function"] != __FUNCTION__)
break;
echo $bt[$i - 1]["class"];
}
}

class Fuga extends Hoge {
static public function method() {
parent::method();
}
}

Fuga::method();

超微妙・・・。デバッグでもなんでもないのにdebug_backtraceとか超微妙。
0054nobodyさん2005/12/12(月) 12:32:07ID:???
>>42
なんで、そういうことをしたいか?って書けば
別解がでるんじゃね?
0055422005/12/13(火) 13:04:20ID:???
>>54
返事が遅れて申し訳ない。・・・といってもその間にレス来てないけどw
実際にはデバッグの目的でログを取るのに、staticメソッド内で呼び出したサブクラス名を__CLASS__みたいに手軽に取得できないかを探し始めたのがきっかけでした。
その意味ではdebug_backtraceを発見したのでそれで問題解決なんだけど、元の質問をしたときには確か似たような問題を見た記憶があって、もうちょっと一般的な問題のように扱えるかも・・・とでしゃばってみた限りですorz
まあ時間的に少し余裕があったし、今後似たような状況(例えば可変クラスとか)も起こらないとは言えないってこともあって、色々考案してみました。

以下は一般的にはこうするのが(ベストとは言えないまでも)一番マシじゃないかなぁ〜という、ちょっとした提案
abstract class Hoge { static public function method($name = __CLASS__) { echo $name; } }
class Fuga extends Hoge { static public function method($name = __CLASS__) { parent::method($name); } }
Hoge::method();
Fuga::method();
サブクラスにメソッドの実装を強制できない点が痛いけど>>53よりマシかなって程度で。
まだマニュアルを引きつつ勉強中な身なんで、つっこみとかあったらよろしくです。
0056nobodyさん2005/12/13(火) 23:32:56ID:???
強制したきゃしろよ
0057nobodyさん2005/12/16(金) 17:53:18ID:CZKjM08D
Movable Typeの11行目の、
use MT::Bootstrap App => 'MT::App::CMS';
って、どういう意味ですか?
分かるエロくない人、どうかお教えください。
0058nobodyさん2005/12/16(金) 17:54:24ID:CZKjM08D
すみません、MT 3.2(日本語版)のmt.cgiの話です。
あと、勝手にMovable Typeがオブジェクト指向と判断してます。
0059nobodyさん2005/12/17(土) 03:49:48ID:???
>>57
エロいので教えない
0060nobodyさん2005/12/21(水) 21:11:28ID:???
Javaライクな(クラスの)パッケージ管理はPHPではでけへんの?
__autoload() を使おうとするとどうしても一つのフォルダに
クラス定義ファイルを全部ぶち込むことになるんだけど
0061nobodyさん2005/12/21(水) 22:45:40ID:???
いけたっ
うんこぷー
0062nobodyさん2005/12/22(木) 05:39:54ID:???
>>60
__autoloadの中を頑張ってつくればある意味Javaのパッケージより柔軟に色々できると思う。
今即興で考えてみたけどこんなのどう?

function __autoload($class, $newdir = "") {
 static $dirs = array();
 if ($newdir) $dirs[] = $newdir;
 if ($class) foreach ($dirs as $dir) {
  $file = "$dir/$class.class.php";
  if (file_exists($file)) { require_once $file; return; }
 }
}

function add_import_dir($dir) {
 __autoload("", $dir);
}

なんか書いてて虚しくなってきたよ・・・
0063nobodyさん2005/12/22(木) 15:26:55ID:ORKD8JMR
自クラス内のプロパティーにも
セッターゲッター介してアクセスする?
あるいは自分の中のことだから
直アクセスする?
Dotch?
0064nobodyさん2005/12/22(木) 16:04:35ID:???
>>63
自分のクラス内なんだから直アクセスでしょ。
クラス内でもセッタゲッタしたいってことは、そのプロパティによっぽど整合性が必要なんだろうから、場合によっては必要な部分だけabstractなクラスとして抽出して問題のプロパティをprivateにする。
ってそれWebプログラミングとどういう関係があるの?
0065nobodyさん2005/12/22(木) 16:56:29ID:???
宗教論争させたいだけでしょ
0066nobodyさん2005/12/22(木) 17:02:57ID:???
なんか仕込みがあるならともかく
別段論争になるようなことじゃないと思うけど
0067nobodyさん2005/12/22(木) 17:04:20ID:???
>>>64
やっぱりそっか。
さんくすこ。
>>65
そんなわけナス
0068nobodyさん2005/12/22(木) 18:58:37ID:???
大域変数にするか問題と同じだな。
0069nobodyさん2005/12/22(木) 19:19:44ID:???
>>62
手間をかけさせて悪かった
やってみる
0070nobodyさん2005/12/22(木) 22:31:30ID:???
Ruby on Railsとかいうのがお目見えしたことだし
スクリプト系はMVC的に糞ってなことにはもうならないな
0071nobodyさん2005/12/22(木) 23:00:25ID:???
パッシブは別に糞じゃないだろ
0072nobodyさん2005/12/23(金) 03:31:20ID:???
>>70
RoRはぶっちゃけあんまり流行る気しないんだが。
あれってMVC?
0073nobodyさん2005/12/23(金) 04:52:29ID:???
PHPじゃそうかもな。rubyやperlはもうコレで決まりだと思う。
0074nobodyさん2005/12/23(金) 05:24:31ID:???
いやRuby自体がWebプログラミング方面でそれほど伸びないと思う。
Rubyの方がPHPより先に世の中に知れ渡ってたらRubyの圧勝だったかもしれないが、今更PHPと比較して生産性高いとも思えないし(飽くまでWeb方面では)。
0075nobodyさん2005/12/23(金) 06:47:01ID:???
そこで、pythonですよ!
0076nobodyさん2005/12/23(金) 10:17:08ID:???
Π損はメタクラス以外見るべきところが無い希ガス
0077nobodyさん2005/12/23(金) 12:51:21ID:???
rubyは構文が特殊すぎるし、まんまオブジェクト指向だから、phpのような流行り方をすることはそもそもありえなかったと思う。
unixハッカーな人たちにはperlやrubyが今後も支持されていくでしょう。phpは違う層の人たち向け。
0078nobodyさん2005/12/23(金) 13:53:17ID:???
ちょwww
unixハッカーってなんだwww
そりゃC使いry
0079nobodyさん2005/12/23(金) 14:07:50ID:???
cは別物。phpはもっと別物だけど。
0080nobodyさん2005/12/23(金) 14:15:32ID:???
WebでOOするときってどんなクラスつくるの?
MVC以外で。
0081nobodyさん2005/12/23(金) 18:01:01ID:???
オブジェクト指向言語は、OOがphp使うような素人の馬鹿避けになってる所は有るね。
phpの生産性って、素人を安い人件費で大量に使えるってだけだからねえ。
RoRは馬鹿には理解出来ないから、流行る事は無いだろう。流行るためには馬鹿でも理解出来る事が必要だし。
0082nobodyさん2005/12/23(金) 18:18:43ID:???
RoRのレベルが高いと思ってるおばかさんが一人いるぞw
Lisp信者にもその考えの奴多いんだよなぁ。
0083nobodyさん2005/12/24(土) 02:04:43ID:???
ざっくり言ってphpユーザはレベルが低い
0084nobodyさん2005/12/24(土) 13:15:52ID:???
ユーザのレベルなんて人それぞれだし、スレ違いでは?
0085nobodyさん2005/12/24(土) 20:22:24ID:???
phpしか書けない香具師に、LispやRoRは無理。
0086nobodyさん2005/12/24(土) 21:25:57ID:???
この言いっぱなしの駄レス連発してるやつって一人でやってんの?
0087nobodyさん2005/12/25(日) 02:32:29ID:???
はいはいわろすわろす
って言ってほしいんだろきっと。
LispはまだしもRoRを難しいとか言う奴初めて見た。
PHPしかできない奴のレベルが低いってのはまあ当たり前の話だが。
0088nobodyさん2005/12/27(火) 16:43:08ID:Zix1qzzJ
>>57-58
すみません、エロくても大丈夫になりましたのでどなたか教えてください。。。

分かった事
MT/Bootstrap.pmが関係?
0089nobodyさん2005/12/27(火) 17:59:00ID:Zix1qzzJ
あ、これはただ単にハッシュを渡しているだけなのですか?^^;
0090nobodyさん2005/12/27(火) 22:04:42ID:???
スレ違いだって
0091nobodyさん2005/12/28(水) 02:23:24ID:FTSvjaED
>>90
まあアレだ、Ruby厨には聞いていないから帰れということらしい。

>>57-58
Bootstrap.pmでimport関数に%param{App}を渡していると思うのだがその辺調べてみてくれ。
0092nobodyさん2005/12/28(水) 09:12:28ID:???
ここで解説はイラネ。

配布スクリプトの読めない部分を解説しちゃる
ttp://pc8.2ch.net/test/read.cgi/php/1094842959/l50
0093nobodyさん2006/01/01(日) 02:30:26ID:???
>>85
なんというか、馬鹿丸出しな発言だな。
そもそもRoRが使えれば、Ruby使えるわけだから、
PHPしか使えないなんてことは成り立たないわけで。
逆にRoRしか使えないやつはPHP使えないしな。
0094nobodyさん2006/01/01(日) 13:35:44ID:???
でもPHP使いよりRuby使いの方が仕事出来るのが事実。
0095nobodyさん2006/01/01(日) 14:05:33ID:???
>>94
まじ?
俺、今、Rubyを勉強しているんだけど、プロになれる?
0096nobodyさん2006/01/01(日) 16:16:39ID:???
>>94
はじめからそう言えばいいのに、頭が悪いから>>85みたいな言い方になってしまったんだね。
0097nobodyさん2006/01/01(日) 16:18:04ID:???
「○○使い」なんて言語限定してる時点でそいつは使えない
0098nobodyさん2006/01/05(木) 18:20:00ID:???
RubyでWeb開発とか趣味以外でやってる人いるの?
0099nobodyさん2006/01/05(木) 18:36:44ID:???
>>98
とりあえず、仕事で使われてるのをみたことがないな
あと、Ruby関連は書籍がちゃんとしたのが少なくない?

ってかすれ違いなんで、こういうのはマ板で
01001002006/01/07(土) 17:47:26ID:???
誰も100をとってくれない件について
0101nobodyさん2006/01/07(土) 18:20:48ID:???
0x64なんてキリ番じゃない。
0102nobodyさん2006/01/08(日) 16:02:42ID:???
誤:使えない
正:使わない
0103nobodyさん2006/01/19(木) 01:21:15ID:Mz+RYmqL
試しにあげてみる
0104nobodyさん2006/01/21(土) 03:53:09ID:???
>>99 影舞
0105nobodyさん2006/01/27(金) 12:31:26ID:61WrCUJb
PHPのthrowって例外オブジェクトがどこまでも飛んでいくから便利だね。
でもスパゲティの原因になったりしない?
いったいいつcatchされるんだろう・・・?みたいな。
もしくは、ここのcatchは何のためにあるんだろう・・・?みたいな。
Javaの場合throws書かないといけないけど。
そのまま便利さを享受すべきか、全てのメソッドにthrows相当のものをコメントとして加えておくべきか、ご意見いただけると幸いですw
0106nobodyさん2006/01/28(土) 18:58:27ID:???
俺の場合は、catchした上で処理を継続できるような場合はコメントに
@throws で記述しておく。
処理を続行できないような致命的な例外の類は一切キャッチしない or
トップレベルですべての Exception を catch するようにしてる。
0107nobodyさん2006/01/29(日) 22:11:15ID:???
使い捨てなら気にせずthrowしまくるけど、ある程度規模が大きくなってきたら問答無用で@throws書いたほうがいい。
0108nobodyさん2006/01/30(月) 23:29:09ID:l8Eu1UQ7
自作のphpフレームワークを公開して見ました。

一応MVCモデルとオブジェクト指向プログラミングに基づいて作成しています。

もしよろしかったらご覧いただければ幸いです。

http://pharon.lolipop.jp/
0109nobodyさん2006/01/31(火) 01:43:20ID:???
>>108
Webサイトが思い切りテーブルレイアウトで萎えた。
普通に見出しと本文でいいじゃん。
なんか怪しげなローマ字とか使ってるし。

詳しくは読んでないけど、まずはその素人臭さを払拭しないと
使ってみる気にもなれんね。
0110nobodyさん2006/01/31(火) 10:49:03ID:???
整形済み文字にする必要性がわからん
0111nobodyさん2006/01/31(火) 11:17:28ID:???
あちこちにマルチし過ぎだしな。
まぁ、本人とも限らないが…。
0112nobodyさん2006/01/31(火) 13:18:08ID:???
pharonの読み方を教えてください
0113nobodyさん2006/01/31(火) 14:18:11ID:???
ファロン?
0114nobodyさん2006/02/02(木) 12:00:05ID:???
ファロン ファーロン 有名ピカソ
0115nobodyさん2006/02/03(金) 20:05:36ID:3T+q60Jd
たぶんファーロンじゃないかな?
0116nobodyさん2006/03/24(金) 08:23:48ID:???
過疎りすぎw
0117nobodyさん2006/03/27(月) 23:45:30ID:NOFET43q
期待age。
で、 Web サイトを PHP で組もうと思ってるんだけどオブジェクト指向でやったほうがベター?
まだ覚えてないけどな 。
0118nobodyさん2006/03/28(火) 00:50:26ID:???
>>117
PHPでOOなんて無意味><
0119nobodyさん2006/03/28(火) 08:10:30ID:???
>>118
まだこんなこと言ってるやついるんだな
0120nobodyさん2006/03/28(火) 09:41:36ID:64m8EIcO
PHPっていったら、HTMLを直に操作する軽快感が一番重要でしょ。
クラスとか使いはじめると、この足取りの軽さが激減するし、だったらJAVA使ったほうが賢いのでは。
大体WEBプログラミングでオブジェクト指向を得意げに使うこと自体が、スパゲティ大好きって言ってるようなもんだな。
0121nobodyさん2006/03/28(火) 10:23:08ID:???
>>120
「だったら Java」ってやつは最初から PHP なんか使わないか、
PHP も Java も分かってないかのどっちかだな
0122nobodyさん2006/03/28(火) 10:51:45ID:???
私も以前は PHP で OOP なんてする必要ねーよと思っていた。
特に PHP4 のクラスの実装はクソなので OOP するのも面倒だなと思っていた。

しかし、デスマってるプロジェクトに投入されて、
そのプロジェクトが index0001.php4 とか index0134.php4などと
200個くらいのファイルを羅列しているのを見たとき、
たとえ、PHP4 であろうとも OOP を導入すべきだという主張にかわったよ。

OO でなくとも、Logic と View は分けるべきだ。
できるなら、MVC でお願いします。
0123nobodyさん2006/03/28(火) 12:02:55ID:???
>>1
Javaでは当たり前なことを
なぜこんなスレタイをたてるのか。
どうせならStrutsやJSF< Tapestry, Seasar2など
フレームワーク関係のスレタイにしておけばよかったのに。
0124nobodyさん2006/03/28(火) 12:04:50ID:???
>>17
一応JavaScriptでprivateにできるテクニックはあるあしい。
ローカル変数を使って。Ajaxに使われている
Prototypeというフレームワークもどきに使われているようだ。

かなり小汚いテクニックで読みにくいソースコードだが。
0125nobodyさん2006/03/28(火) 12:05:37ID:???
>>21
PHP4と5では違う。
publicやprivate宣言を忘れているぞ
0126nobodyさん2006/03/28(火) 12:07:24ID:???
>>122
しかし、PHPは未だに名前空間が無いから
PHP5からJavaライクなオブジェクト実装が
サポートされても使い勝手は相変わらず悪い。
ini_get()してからini_set()するのはもうウンザリ。
__autoloadだか忘れたがこれをうまくつかって
Javaのimportそっくりなことできそうにみえるが、
それも使い勝手が悪い。
0127nobodyさん2006/03/28(火) 12:38:09ID:???
>>123
フレームワークのスレあるじゃん
0128nobodyさん2006/03/28(火) 12:40:59ID:???
>>124
なんかムリにprivateにしなくていいじゃんと思うようになるよ
Perl も PHP 4 も運用でカバーしてるんだし
0129nobodyさん2006/03/28(火) 12:57:27ID:???
JSの場合はJava系みたいにインスタンス変数ごとにprivateっていう考え方よりも、Cのファイルスコープstaticみたいに、ファイルごと(モジュールごと)にローカライズ(隠蔽)するのが常套手段かな。
インスタンス変数はそもそも隠蔽する対象じゃないんだな。
2.0でclassとか拡張されてるから、また変わってくると思うけど。
■ このスレッドは過去ログ倉庫に格納されています