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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
0449nobodyさん2005/06/29(水) 03:51:33ID:???
最近特にWebプログラミングにおけるOO化が進んでる気がする。
ちょっと前までPerlでガリガリ系のプログラマがPHPに以降し始めて
OOPを必死で習得しようとしてるのかな。(俺もそうだけど)
一世を風靡したKENTさんなんてビジネスロジックとプレゼンテーションの
分離すら理解できてないみたいだけど今は苦労してるんだろうな。
もう隠居したかなw
0450nobodyさん2005/06/29(水) 04:50:32ID:???
>>446の場合はただスキルが足りないだけだと思う。
0451nobodyさん2005/06/29(水) 06:28:54ID:???
>>450がOOPを使いこなすための目から鱗なコメントを準備中ですので、
みなさん、お楽しみに!
0452nobodyさん2005/06/29(水) 07:05:05ID:???
必死な>>446がきましたよ
04534512005/06/29(水) 07:34:24ID:???
はっはっはっ!
漏れは>>446じゃないがなw
0454nobodyさん2005/06/29(水) 07:57:21ID:???
誰かモジャ3の使い方を解説しているサイト知りませんか?
本家のサイトにはチュートリアルみたいなのないし、ググってもモジャ2が中心で・・・。
日本語か英語で解説してあるサイトが知りたいです。
よろしくお願いします。

>>363
Viewの中にあるdecorate()メソッドはどういうときに使うのですか?
モジャパッケージ内のクラスでも使用している箇所はないようなのですが。
0455nobodyさん2005/06/29(水) 10:34:58ID:???
>>449
> ちょっと前までPerlでガリガリ系のプログラマがPHPに以降し始めて 
> OOPを必死で習得しようとしてるのかな。(俺もそうだけど)

PerlでもOO的な書き方はできるし、(Jcode.pmがOO的なので
大抵のPerl書きはOOの恩恵にあずかってるはず)、逆にPHPも
ロジックが混在した汚いコードは多いよ。一概に言えないんでは?
0456nobodyさん2005/06/29(水) 11:45:23ID:???
俺もMVCを自分なりに考えてやってた頃はVとMを
どう分けるのかがいまいち分からなかった。
MからCに制御を戻さずにそのままVに移してたから一つのクラスになってた。
Mojavi見てやっとイメージが掴めた。
あと体得してきたノウハウ↓
・オブジェクトを擬人化して考える
・インターフェイスから考える(インターフェイスが出来たら実装は出来たようなもん)
0457nobodyさん2005/06/29(水) 11:48:29ID:???
>>454
APIリファレンス見ながら地道にソース読んでいくしかないと思う
0458nobodyさん2005/06/29(水) 12:33:25ID:???
Mojaviのソースは確かに参考になるね。
俺はStrutsとか触ったことないからよくわかってないのかもしれないけど、なるほどと思えるところがたくさんあった。

しかしMojavi3でどうしても解せないのがActionやViewのexecuteが、Controllerの中ではなくFilterの中で呼ばれていることだな。
いやむしろExecutionFilterの存在自体が謎だ・・・。
Controllerの中でやってしまえばよかったのでは?
まーこれに関してはMojavi内部での処理なのでどーでもいいといえばどーでもいいのだが。

あとFilter書くとき、条件が通ったら$filterChain->execute()呼んで、ダメだったときは$controller->forward()ってのもちと解りづらい気がするが、ちまたのMVCでもそういうものなの?

もう一つついでに、Viewとか他のクラスの中からその時々のActionをContextから直に取得できないのがツライな。
$this->getContext()->getController()->getActionStack()->getLastEntry()->getAction();
ってちょっと待ってくれよ・・・。
取得しないほうが吉ってことなのかな?
それとも俺なんか見逃してる?
0459nobodyさん2005/06/29(水) 17:30:50ID:EqNehqGX
データベース使うとSELECTとかWHEREとかそういうのがダラダラしちゃうんですけど
こういうのうまいことする方法ってないですか
0460nobodyさん2005/06/29(水) 18:00:50ID:???
>>459
おーい!スレがちがいますよーっ!
SQLを隠蔽したクラスを作るor使いましょう。
0461nobodyさん2005/06/29(水) 19:04:41ID:YzX/r9Gn
おまいら!最近出たWeb+DBプレスはおすすめですよ
Ajaxの記事が気になって買いにいったら
PHPのフレームワークについてかなり詳しく書いてた
そこで俺は勘違いに気付いたのだが
Actionクラスはプレゼンテーション層だから
あまりロジックは書かない方がいいんだな。
Actionに書いた方がいいのかとロジッククラスをバラして
もりもり書いてたよw
0462nobodyさん2005/06/29(水) 19:08:09ID:???
>>458
コマンド実行は
フィルタと本質的な違いはないからでは?>ExecutionFilter
俺はソース見た時、なるほどなぁ〜と思ったよ。
0463nobodyさん2005/06/29(水) 19:56:34ID:???
MojaviのContextクラスのアイデア(基幹オブジェクトの参照のコンテナ)
ってなかなか便利だな。各オブジェクトにこいつだけ渡せばいいもんな。
04644582005/06/29(水) 20:11:59ID:???
>>461
やべ、俺も誤解してた部分あるかも。
頭に入れとこ。THX。

>>462
フィルタってキタナイやつをストップさせて、キレイなやつを通してやるのが目的じゃないの?
コマンド実行ってのはどうとらえたらよいのだろうか・・・?
まーMojaviのソースって、手本になるような美しさがあるかは別として、発想力に富んだ内容だと思う。
うなづける部分が多いね。

>>463
同意。Contextってネーミングもウマイ。
俺的にはgetAction()欲しかった。
自分で追加するのは簡単だけど、Mojavi3完成時に辻褄合わなくなるのも嫌だしな。
俺は根性なしだ・・・。
0465nobodyさん2005/06/29(水) 20:47:55ID:???
>>461
ガーン
俺も勘違いしてた。
ロジックは別に書くべきなのか。
04664612005/06/29(水) 21:20:57ID:???
そうそう、MVCと三層構造って別パラダイムなんだよな。
ごっちゃにしてる奴も多いと思う。
今ロジックの中でRequest読んでデータ処理するように書いてたんだが、
Requestは多分プレゼンテーション層かな?
Action段階で取り出して、ロジックに渡した方がいいのかな。
今度はActionとロジックの区分けに悩みはじめたよw
0467nobodyさん2005/06/29(水) 21:40:13ID:???
どうも四層になってるらしい。
中間層がWeb層とビジネスロジック層に分かれてるとか。
てことはやっぱりRequestはActionだろうな…ハァむづい。
0468nobodyさん2005/06/29(水) 23:37:36ID:???
Model = ビジネスロジック
View = プレゼンテーション
Control = コントローラー
ではないのか?
0469nobodyさん2005/06/30(木) 02:18:44ID:???
>>468
「Model = ビジネスロジック」ってのは間違ってまっせ。
0470nobodyさん2005/06/30(木) 03:26:39ID:???
>>469
じゃあModelとは何よ?
0471nobodyさん2005/06/30(木) 05:29:25ID:???
MVCのモデルの中に閉じ込められるビジネスロジックというのは、
業務のキモとしてのデータの取り扱い方という形だけになるんだと思う。
ビジネスロジック呼ぶものがそれ以外にもあったとしてもね。
0472nobodyさん2005/06/30(木) 07:04:12ID:???
>>471
Modelのその他の役割は?
0473nobodyさん2005/06/30(木) 07:45:00ID:???
そんな難しい話してないで感覚で作ろうぜ
0474nobodyさん2005/06/30(木) 08:59:34ID:???
MojaviってStrutsの劣化コピーだよ。
0475nobodyさん2005/06/30(木) 09:01:20ID:???
GUIのあるアプリケーションのMVCとWEBのMVCを一緒に考えるのはおかしい。
0476nobodyさん2005/06/30(木) 09:13:29ID:???
結城浩はオブジェクト指向プログラミングに関する書籍で実績がある人だから。
好き嫌いはあるだろうけど。
0477nobodyさん2005/06/30(木) 09:17:08ID:???
http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/app-arch/app-arch2.html
なんとなくまとまってるような気がするべ
0478nobodyさん2005/06/30(木) 15:37:35ID:???
SafafiでMojaviJapanのサイトを見ると化けまくりな件について
0479nobodyさん2005/06/30(木) 15:48:51ID:???
>>478
ソース見たら、11行目、metaのcopyrightのところが文字化けしてんな。
MSBが立ってる文字が3バイトあるのでUTF-8の「©」でも突っ込んだんではないかと。
0480nobodyさん2005/07/01(金) 00:13:28ID:???
http://pc8.2ch.net/test/read.cgi/php/1117945031/669
これ書いたの漏れなんだけど、なぜphpでMVCにこだわるの?
その答えは散乱しちゃうから、上のスレにレスくれれば良いとして
MVCについて出来る範囲で答えますよ。

漏れはphpは最近始めたばかりで、今まではJavaばっかり。

>>466
>今度はActionとロジックの区分けに悩みはじめたよw 
教科書のような説明だと、Actionにロジック書くのはNGだけど書いても
嫌がられない場合もあるよ。
それはロジックが大したこと無いとき。MVCで、なんで役割ごとにバラバラ
にするかって?それは、再利用性、保守性を上げるため。
再利用もしないし、コードの見通しが悪くなるほど量も無いし、
変更も頻繁に入らない。そんなコードは堂々とActionに書いちゃって良いと
思うよ。
0481nobodyさん2005/07/01(金) 00:28:02ID:???
>>461
>Actionクラスはプレゼンテーション層だから
>あまりロジックは書かない方がいいんだな。

別にそんなことはない。
0482nobodyさん2005/07/01(金) 00:36:04ID:???
50行くらいならActionの中に書いてもいいよ
0483nobodyさん2005/07/01(金) 00:38:57ID:???
mojaviの場合はaction自体も再利用しやすいじゃん。
だからそういうふうに書けばいいんじゃないの?
0484nobodyさん2005/07/01(金) 02:57:45ID:???
>>483
Actionクラスを再利用するケースなんてないと思うけどな。
再利用するくらいなら、そのActionにマッピングされたURLを使い回せばいいし。
0485nobodyさん2005/07/01(金) 12:31:12ID:???
諸君、Actionには何を書くんですか?
0486nobodyさん2005/07/01(金) 20:29:53ID:???
>>485
ビジネスロジック
0487nobodyさん2005/07/02(土) 02:01:02ID:???
前に誰かいってたけど
evalの動的クラス定義おもろいな
テンプレートだけ作れば、actionもviewも用意しなくてもいいようにでけた。
0488nobodyさん2005/07/02(土) 02:33:30ID:???
>>487
そうするとテンプレートのファイル名まで命名規則が必要だな
0489nobodyさん2005/07/02(土) 02:35:01ID:???
>>484
>>375
0490nobodyさん2005/07/02(土) 02:36:08ID:???
>>488
必要もなにも、普通規則つけてるだろ
0491nobodyさん2005/07/02(土) 02:46:23ID:???
>>487
> evalの動的クラス定義おもろいな
そこにevalを使いたがる香具師の心境がわからん罠
0492nobodyさん2005/07/02(土) 02:49:21ID:???
>>487
なんか恐ろしい穴になりそう
0493nobodyさん2005/07/02(土) 04:11:31ID:???
>>492
allowedActionListでも作れば無問題
0494nobodyさん2005/07/02(土) 06:23:41ID:???
>>487
キモ過ぎ。
あんたとは一緒に仕事したくないな。
0495nobodyさん2005/07/02(土) 06:28:06ID:???
>>494
もっと説得力のある批判なら受付可
0496nobodyさん2005/07/02(土) 06:48:22ID:???
>>487は本当に独り言の好きな香具師だな、
と漏れも独り言を言ってみる。
0497nobodyさん2005/07/02(土) 16:14:50ID:???
>evalの動的クラス定義おもろいな
$class()でいいやん。

>テンプレートだけ作れば、actionもviewも用意しなくてもいいようにでけた。
身の毛もよだつキモさだな。
0498nobodyさん2005/07/02(土) 17:50:42ID:???
↑new $class()とevalの根本的な違いが分かってない奴
0499nobodyさん2005/07/02(土) 18:47:26ID:???
evalイラネ
0500nobodyさん2005/07/02(土) 18:52:16ID:???
evalには無限の可能性がある
0501nobodyさん2005/07/02(土) 18:55:39ID:???
その通り。可読性を下げる可能性までもある
0502nobodyさん2005/07/02(土) 21:52:19ID:???
mojavi3で新規登録とかでよくある
パスワードと確認用パスワード
を比べるみたいな設定ってどうやったらいいの?
0503nobodyさん2005/07/02(土) 22:02:22ID:???
夢広がりんぐevalメディア
0504nobodyさん2005/07/02(土) 22:21:14ID:???
>>502
Action::validate()の中でやるかValidator書くかのどちらかかと思ふ。
0505nobodyさん2005/07/03(日) 14:01:39ID:???
evalは実行パフォーマンスも悪いし、ちゃんと対策ほどこさないと任意のコード実行される恐れがあります。
0506nobodyさん2005/07/03(日) 17:26:50ID:???
というわけで、まだeval使いたいアフォな人いますか?
0507nobodyさん2005/07/03(日) 18:15:06ID:???
eval なんて確実に自分が書いた変数しか入らない場合でしか怖くて使えない。
注意していても万が一ってのがある品・・
0508nobodyさん2005/07/03(日) 19:58:15ID:???
お前の関数ほど恐ろしいものは無いのにな。
0509nobodyさん2005/07/03(日) 20:07:47ID:???
mojaviって何を基準にモジュールを変えるもんなんですか?
掲示板なら管理画面と本体みたいな感じでいいんですか?
0510nobodyさん2005/07/04(月) 00:00:07ID:???
確かにモジュール分割悩むよな
てかモジュールいらなくね?とすら思う
0511nobodyさん2005/07/04(月) 13:52:14ID:???
eval使えない奴はチキン野郎
0512nobodyさん2005/07/04(月) 15:34:12ID:???
使えない奴なんか見たことない
使えるけど使わない
使う必要すらない
使う奴のほうがチキン
>>511は何にevalを使ってらっしゃるの?
0513nobodyさん2005/07/04(月) 15:37:50ID:???
>>512
うるせえカマ野郎
0514nobodyさん2005/07/04(月) 18:06:37ID:???
Mojavi3でActionやModelの中でControllerを取得する場合、
$controller = $this->getContext()->getController();
と
$controller = Controller::getInstance();
のどっちがいいと思いますか?
他のシングルトンなオブジェクト(UserとかRequestとか)もどうしようか迷います。
0515nobodyさん2005/07/04(月) 19:25:59ID:???
$controller = $this->getContext()->getController();
がお作法通り。
基本的にContextタンの管理物はContextタンにお伺いを立てるが筋。
0516nobodyさん2005/07/04(月) 19:32:25ID:???
>>512みたいな阿呆がでるのはゆとり教育のせいか?
0517nobodyさん2005/07/04(月) 20:31:14ID:???
eval使いは屑。
プログラマを騙るな雑魚。
0518nobodyさん2005/07/04(月) 20:41:48ID:???
>>517
そういきり立つなよ。

キレ易いのもゆとり教育世代の特徴だな。
0519nobodyさん2005/07/05(火) 05:33:21ID:???
>>515
なるほど、そういうことですか。
Controller::getInstance()はMojavi内部で使用されるものととらえておけばいいのかな?
なんかちゃんとしたドキュメントがまだないから、Mojavi内部用なのか我々ユーザー向けに提供されたインターフェイスなのか迷うことが多いな。
getActionとかgetViewとか新しいインスタンスを生成しちゃうし、おそらく内部用だよね。
でもgetModelもインスタンス生成だけど、こっちはおそらくユーザー用だし。
なかなか難しい・・・。

>>517は言葉は悪いが同意。
evalは保守性、可読性、共に下げる原因になる。
何でもできる「自由さがアダになった点」ではグローバル変数と同類。
ちなみにnew $classname;との比較としてevalを語るならいいが、evalの優位性も語らず不毛に単体で支持するのはスレ違い。
0520nobodyさん2005/07/05(火) 07:32:14ID:???
だまってろ池沼
0521nobodyさん2005/07/05(火) 08:11:32ID:???
>>520
荒らすな。ウザイ
0522nobodyさん2005/07/05(火) 09:21:23ID:???
黙れクソガキ
0523nobodyさん2005/07/05(火) 09:55:45ID:???
>>522
必死杉厨キモ(ry
0524nobodyさん2005/07/05(火) 09:55:56ID:???
最近言語障害者がこのスレにはびこってるな。
消えてくれるとありがたいのだが。
0525nobodyさん2005/07/05(火) 10:47:54ID:???
バーカバーカ
プップププー
0526nobodyさん2005/07/05(火) 11:02:44ID:???
>>523

マジでキモイなオマエ
0527nobodyさん2005/07/05(火) 11:50:08ID:???
>>526 クルシソウダネ
0528nobodyさん2005/07/05(火) 12:05:24ID:???
Mojavi3を使い始めたんですが、UserやRequestを自作した場合、どのように設定したらよいのかわかる人いますか?
0529nobodyさん2005/07/05(火) 22:05:20ID:???
フレームワーク使ったOOPでいいのは
ログが取りやすいことだな〜
特にDBのクエリログは激しく便利
0530nobodyさん2005/07/06(水) 04:14:18ID:???
PHPのオブジェクト機能を教えて下さい。
0531nobodyさん2005/07/06(水) 07:22:48ID:???
>>530
なんだその質問はw
0532nobodyさん2005/07/06(水) 16:46:25ID:???
同意
0533nobodyさん2005/07/06(水) 16:48:12ID:???
PHPのオブジェクト指向ってなんですか?
PHPでオブジェクトってどう使ったらいいのですか?
0534nobodyさん2005/07/06(水) 19:43:38ID:???
>>533
マニュアルを読んで納得して使う。
0535nobodyさん2005/07/06(水) 20:46:36ID:???
なんかビギナーっぽいんで
オブジェクト指向自体の勉強から始めた方がいいと思う
本屋にGO
0536nobodyさん2005/07/06(水) 21:04:32ID:???
ぶっちゃけオブジェクト指向・デザインパターン・フレームワーク
を知らない奴はプログラマを騙らないで欲しい。
0537nobodyさん2005/07/06(水) 21:51:21ID:???
たしかにマニュアル読んでしか使ってないし、ビギナーでもあるし、プログラマを騙らないので
オブジェクト指向・デザインパターン・フレームワークを教えて下さい。後で本も買いますので。
0538nobodyさん2005/07/06(水) 22:52:07ID:???
そんなのこんなところで教えられるもんでもないだろ
どんだけコンパクトな知識やねんw
OOなんて知の最高峰みたいなモンで
ほとんど哲学の領域にまで踏み込んでるのに
0539nobodyさん2005/07/06(水) 23:35:43ID:???
わかりました、後で本買って読んでみます。

ところでPHPでオブジェクト指向っぽいサンプルコードをどのたかちょこっと
書込んでいただけないでしょうか。本と照らし合わせてなにが
オブジェクト指向たらんのか調べてみようと思うしだいです。
0540nobodyさん2005/07/06(水) 23:54:56ID:J6s2TI5S
>>539
あちこちにあるだろ。
ググるなりすればすぐに見つかるからてめぇで探せ。

それができないようなヤツにプログラミングなど無理。
05415402005/07/06(水) 23:55:22ID:???
ごめん、sage忘れた。
05425402005/07/06(水) 23:57:28ID:???
>>536
20年前からアセンブラ一筋の人が漏れの師匠なのだが
その人はプログラマと呼んじゃいかんのか?
0543nobodyさん2005/07/06(水) 23:57:39ID:???
>>539
{>>539}->read(new book(OOP))->try(new things);
0544nobodyさん2005/07/07(木) 06:13:15ID:???
>>543
わざわざありがとうございます。
とりあえず>>540に指摘されましたので、Webを散策して勉強中です。

メソッドが自分自身の参照や新たなインスタンスを戻り値として返す場合
>>543みたいに「インスタンス変数->メソッド()->メソッド();」
みたいなメソッドコールを連結して記述できるのは、PHP5だけですか?
PHP4だと、Parse errorが出てしまいました。
しかたないので、メッソドの戻り値を代入したテンポラリインスタンスを用意して
メッソドコールしましたけど、なんか美しくないんですよね。
とりあえず、今は、>>543風に示すとこんな状態です。

{>>539}->read(new web(OOP,PHP))->try(new environment(PHP4));
0545nobodyさん2005/07/07(木) 06:13:59ID:???
ちなみに作ってみたコード
<?PHP
 class test{
  var $value;
  function test($argv){
   $this->value = $argv;
  }
  function set($argv){
   $this->value = $argv;
   return $this;
  }
  function show(){
   return $this->value;
  }
 }

 $test = new test("Hello World<br>");
 print $test->show();
 //print $test->set("Hello OOP World")->show();
 $tmp = $test->set("Hello OOP World<br>");
 print $tmp->show();
?>
0546nobodyさん2005/07/07(木) 06:43:42ID:???
自分と同じクラスのインスタンスが文字列の代わりに指定された場合も実装してみました。
<?PHP
 class test{
  var $value;
  function test($argv){
   return $this->set($argv);
  }
  function set($argv){
   $this->value = $this->is_class($argv)?$argv->show():$argv;
   return $this;
  }
  function show(){
   return $this->value;
  }
  function is_class($obj){
   $status;
   if(get_class($obj)==get_class($this)){
    $status = 1;
   }
   return $status;
  }
 }

 $test1 = new test("Hello OOP World<br>");
 $test2 = new test($test1);
 print $test2->show();
?>
0547nobodyさん2005/07/07(木) 06:51:25ID:???
>>544
悲しいけど、PHP4ではそれが現実なのよね
0548nobodyさん2005/07/07(木) 06:51:33ID:???
is_classはこれだけでよかったですね。

return get_class($obj)==get_class($this);
■ このスレッドは過去ログ倉庫に格納されています