PHPでオブジェクト指向プログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/04/17(日) 16:55:57ID:iM4mgYnJPHPによるOOPについて語りましょう。
0413nobodyさん
2005/06/27(月) 00:51:05ID:???できなくてもeval()使えば確実。
0414nobodyさん
2005/06/27(月) 01:58:50ID:???のように一度作ったオブジェクトを削除するにはどうしたらいいんですか?
unsetだとだめっぽいんですけど。
0415nobodyさん
2005/06/27(月) 05:13:50ID:???0417nobodyさん
2005/06/27(月) 08:45:57ID:???いつの間にかアメリカの歴史の話になっている。
恐るべきスレだな・・・。
みんなもWebProgばっかやってちゃダメだぞ。
0418nobodyさん
2005/06/27(月) 20:12:48ID:???別に速度は変わらないんでしょうか。
0419nobodyさん
2005/06/27(月) 21:33:03ID:???0420nobodyさん
2005/06/27(月) 22:20:41ID:???Thx, eval関数の中でnewすることで作ったよ!
PHP4は型制限が緩いから俺様フレームワーク作るのは結構簡単だーね。
他人に使ってもらって使いやすいってのは難しいけど。
インターフェイスとか無いし。
PHP5で追加されたんだっけ。
0421nobodyさん
2005/06/28(火) 08:50:18ID:???速度に関しては何とも言えんな。
PHP5のオブジェクト指向に関する利点は、カプセル化、抽象クラスとインターフェース、__autoloadあたりの「機能」面だと思う。
オブジェクトの参照をうまく扱うようになったみたいだからメモリの使用量は減ると思うけど、その恩恵が得られるのは大量のオブジェクトを生成した場合くらいだな。
まあ元々Webプログラミングではオブジェクトを無闇にガンガン生成しないってのが鉄則だから、メモリに関しても速度に関してと同様に大して利点と言えないかもね。
0422nobodyさん
2005/06/28(火) 08:55:01ID:???あのさぁ、マニュアルに思いっきり載ってるんだけど。
http://www.php.net/manual/ja/language.oop5.patterns.php
俺ならevalではなくnew $classnameだな。
0424422
2005/06/28(火) 09:59:34ID:???Mojavi3ではファクトリーの実装でINIファイルをパースして、適切なクラス名のオブジェクトを生成するPHPのコードを自動生成してるみたいだ。
INIを編集しない限りは生成されたPHPファイルをそのままrequireしてるね。
ま、Mojaviの場合はシングルトン実装するために結局はnewInstance($class)メソッドの中で
$object = new $class();
とやってるけど。
っていうかPHP5イイな。
シングルトンをラクラク継承できる。
>>423
はい。>>423の勘違いぶりよりは幾分マシですが。
0425nobodyさん
2005/06/28(火) 11:04:43ID:???0427nobodyさん
2005/06/28(火) 13:05:11ID:???0428nobodyさん
2005/06/28(火) 13:29:41ID:???staticな$instanceは、継承したところで基底クラスにしか存在しないだろ?
0429nobodyさん
2005/06/28(火) 13:56:05ID:???0430nobodyさん
2005/06/28(火) 14:03:58ID:???継承したクラスからgetInstanceすると、すべて同じインスタンスをgetしてしまうから、
継承は出来ないんじゃないの?
424は自分でやってみてから言ってるのか?
0431nobodyさん
2005/06/28(火) 14:06:54ID:???0432nobodyさん
2005/06/28(火) 14:28:51ID:???0433nobodyさん
2005/06/28(火) 14:31:48ID:???0434424
2005/06/28(火) 14:42:27ID:???基本的に基底クラスとそこから派生したクラス全てに関して、プログラムのなかで一つしかインスタンスが存在しないものを考えてた。
class Singleton
{
private static $instance = null;
protected function __construct() {}
public static final function newInstance( $className )
{
if ( self::$instance !== null )
throw new Exception( '2つ目のインスタンス' );
self::$instance = new $className();
if ( ! ( self::$instance instanceof Singleton ) )
throw new Exception( 'クラス名が変' );
return self::$instance;
}
public static final function getInstance()
{
if ( ! isset( self::$instance ) )
throw new Exception( 'まだ生成されてない' );
return self::$instance;
}
}
派生クラスで個別にインスタンスほしいなら、finalを消して>>431のようにやればできるけど、それじゃこの親クラス意味ないね・・・。
コンストラクタに引数渡したい場合ちとツライが、Mojaviでは引数を共通の方法(連想配列)で渡すことで対処してた。
0435nobodyさん
2005/06/28(火) 15:21:04ID:???protectedなスタティックメソッドつかえばなんとかなるかな?(てきとう)
0436424
2005/06/28(火) 16:07:50ID:???class ChildSingleton extends Singleton
{
public function saySomething()
{
echo 'something';
}
}
$obj = Singleton::newInstance( 'ChildSingleton' );
$obj->saySomething();
// 以下は全てエラー
$obj2 = new Singleton();
$obj3 = new ChildSingleton();
$obj4 = Singleton::newInstance( 'Singleton' ); // 2つめのインスタンス
$obj5 = Singleton::newInstance( 'ChildSingleton' ); // 同様
その他のメソッドもスタティックではなく、通常のインスタンスメソッドでOK。
ちなみに今の状態だと、Singletonクラスの派生クラスにpublicなコンストラクタを書くと、そいつはシングルトンでなくなる。
それを禁止したい場合は、基底クラスのコンストラクタをfinalにすればよい。
0437nobodyさん
2005/06/28(火) 17:45:05ID:???そこが穴になりそうな予感。でもそんなことなかったらすまぬ。
↓ここの例だと、基底クラスのコンストラクタが必ず呼ばれることを利用して派生クラスを縛ってる。
http://www.hyuki.com/techinfo/singleton.html
0440nobodyさん
2005/06/28(火) 21:32:15ID:HyE/S+PBモジャはRequestオブジェクトに一括してほりこんでるけど。
俺はRequestとResultも分けてるから、
Errorクラスも別に作った方がキレイかなとも思う。
しかしErrorはResultの一部とも考えられるし…とか思うと
無駄に迷う。
0441nobodyさん
2005/06/28(火) 22:06:19ID:cNCUVPCu0442nobodyさん
2005/06/28(火) 22:10:50ID:???0443nobodyさん
2005/06/28(火) 22:51:32ID:???mojaviのようにビューへ処理の結果が通知されるようになっている。エラーならエラーと。
んで、エラーの内容はResultにぶち込んでる。
大規模な開発になったら考えるけど、あまり変に凝らない方が結局
保守しやすいコードになったりする。
0444nobodyさん
2005/06/28(火) 23:34:22ID:???0445nobodyさん
2005/06/28(火) 23:36:32ID:???あ、そうか。つーか「コンストラクタにfinal」の意味が飲み込めなかったが、それが裏技的にアリなわけか。
そうするとコンストラクタはテンプレメソッドにしておいて、派生クラスごとの初期化には
コンストラクタから一定の初期化メソッドを呼ぶようにすればよいとかそういう感じかな
0446nobodyさん
2005/06/28(火) 23:37:30ID:???確かにOOPの罠の一つは「凝りすぎる」ことだと思う
純文学的プログラミングに陥ると
いつまでたっても完成しないもんなぁ…
0448nobodyさん
2005/06/29(水) 00:49:31ID:???彼が書いたWikiのソースコードを読んでみたことがあるんだが、
とてもじゃないけどOOを理解してる人のコードじゃなかったね。
昔のコードなのかもしんないけど、名前空間がとっ散らかってて
ロジックも一貫性がなくて悪いコードの見本みたいな感じだった。
>>446
コードを書くたびにどんどん仕事量が減っていくようなら正しいプログラミングが出来てる。
汎用ライブラリを作ったはいいけど、何だかんだで案件をこなすたびに書き直しを余儀なくされて
バージョンが分散してどれがどれやら分からなくなっちゃってる人、自分が書いたコードなのに、
時間が経つと内容が把握するのに時間が掛かっちゃう人は何かが間違ってる。
あと凝ることは大事だと思うけど、OOに囚われるあまり手段が目的化しちゃってる人は多いね。
「1)納期に間に合って2)正確に動いて3)保守が簡単」ならば手段は問わないわけで。
その手段としてOOが提供されているのであって、OOであることを目的にしちゃいかん。
「上の3つの要素を満たすコードを書いた結果、たまたまOOになってた」ってのが正解。
0449nobodyさん
2005/06/29(水) 03:51:33ID:???ちょっと前までPerlでガリガリ系のプログラマがPHPに以降し始めて
OOPを必死で習得しようとしてるのかな。(俺もそうだけど)
一世を風靡したKENTさんなんてビジネスロジックとプレゼンテーションの
分離すら理解できてないみたいだけど今は苦労してるんだろうな。
もう隠居したかなw
0454nobodyさん
2005/06/29(水) 07:57:21ID:???本家のサイトにはチュートリアルみたいなのないし、ググってもモジャ2が中心で・・・。
日本語か英語で解説してあるサイトが知りたいです。
よろしくお願いします。
>>363
Viewの中にあるdecorate()メソッドはどういうときに使うのですか?
モジャパッケージ内のクラスでも使用している箇所はないようなのですが。
0455nobodyさん
2005/06/29(水) 10:34:58ID:???> ちょっと前までPerlでガリガリ系のプログラマがPHPに以降し始めて
> OOPを必死で習得しようとしてるのかな。(俺もそうだけど)
PerlでもOO的な書き方はできるし、(Jcode.pmがOO的なので
大抵のPerl書きはOOの恩恵にあずかってるはず)、逆にPHPも
ロジックが混在した汚いコードは多いよ。一概に言えないんでは?
0456nobodyさん
2005/06/29(水) 11:45:23ID:???どう分けるのかがいまいち分からなかった。
MからCに制御を戻さずにそのままVに移してたから一つのクラスになってた。
Mojavi見てやっとイメージが掴めた。
あと体得してきたノウハウ↓
・オブジェクトを擬人化して考える
・インターフェイスから考える(インターフェイスが出来たら実装は出来たようなもん)
0458nobodyさん
2005/06/29(水) 12:33:25ID:???俺は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こういうのうまいことする方法ってないですか
0461nobodyさん
2005/06/29(水) 19:04:41ID:YzX/r9GnAjaxの記事が気になって買いにいったら
PHPのフレームワークについてかなり詳しく書いてた
そこで俺は勘違いに気付いたのだが
Actionクラスはプレゼンテーション層だから
あまりロジックは書かない方がいいんだな。
Actionに書いた方がいいのかとロジッククラスをバラして
もりもり書いてたよw
0462nobodyさん
2005/06/29(水) 19:08:09ID:???コマンド実行は
フィルタと本質的な違いはないからでは?>ExecutionFilter
俺はソース見た時、なるほどなぁ〜と思ったよ。
0463nobodyさん
2005/06/29(水) 19:56:34ID:???ってなかなか便利だな。各オブジェクトにこいつだけ渡せばいいもんな。
0464458
2005/06/29(水) 20:11:59ID:???やべ、俺も誤解してた部分あるかも。
頭に入れとこ。THX。
>>462
フィルタってキタナイやつをストップさせて、キレイなやつを通してやるのが目的じゃないの?
コマンド実行ってのはどうとらえたらよいのだろうか・・・?
まーMojaviのソースって、手本になるような美しさがあるかは別として、発想力に富んだ内容だと思う。
うなづける部分が多いね。
>>463
同意。Contextってネーミングもウマイ。
俺的にはgetAction()欲しかった。
自分で追加するのは簡単だけど、Mojavi3完成時に辻褄合わなくなるのも嫌だしな。
俺は根性なしだ・・・。
0466461
2005/06/29(水) 21:20:57ID:???ごっちゃにしてる奴も多いと思う。
今ロジックの中でRequest読んでデータ処理するように書いてたんだが、
Requestは多分プレゼンテーション層かな?
Action段階で取り出して、ロジックに渡した方がいいのかな。
今度はActionとロジックの区分けに悩みはじめたよw
0467nobodyさん
2005/06/29(水) 21:40:13ID:???中間層がWeb層とビジネスロジック層に分かれてるとか。
てことはやっぱりRequestはActionだろうな…ハァむづい。
0468nobodyさん
2005/06/29(水) 23:37:36ID:???View = プレゼンテーション
Control = コントローラー
ではないのか?
0471nobodyさん
2005/06/30(木) 05:29:25ID:???業務のキモとしてのデータの取り扱い方という形だけになるんだと思う。
ビジネスロジック呼ぶものがそれ以外にもあったとしてもね。
0473nobodyさん
2005/06/30(木) 07:45:00ID:???0474nobodyさん
2005/06/30(木) 08:59:34ID:???0475nobodyさん
2005/06/30(木) 09:01:20ID:???0476nobodyさん
2005/06/30(木) 09:13:29ID:???好き嫌いはあるだろうけど。
0477nobodyさん
2005/06/30(木) 09:17:08ID:???なんとなくまとまってるような気がするべ
0478nobodyさん
2005/06/30(木) 15:37:35ID:???0479nobodyさん
2005/06/30(木) 15:48:51ID:???ソース見たら、11行目、metaのcopyrightのところが文字化けしてんな。
MSBが立ってる文字が3バイトあるのでUTF-8の「©」でも突っ込んだんではないかと。
0480nobodyさん
2005/07/01(金) 00:13:28ID:???これ書いたの漏れなんだけど、なぜphpでMVCにこだわるの?
その答えは散乱しちゃうから、上のスレにレスくれれば良いとして
MVCについて出来る範囲で答えますよ。
漏れはphpは最近始めたばかりで、今まではJavaばっかり。
>>466
>今度はActionとロジックの区分けに悩みはじめたよw
教科書のような説明だと、Actionにロジック書くのはNGだけど書いても
嫌がられない場合もあるよ。
それはロジックが大したこと無いとき。MVCで、なんで役割ごとにバラバラ
にするかって?それは、再利用性、保守性を上げるため。
再利用もしないし、コードの見通しが悪くなるほど量も無いし、
変更も頻繁に入らない。そんなコードは堂々とActionに書いちゃって良いと
思うよ。
0481nobodyさん
2005/07/01(金) 00:28:02ID:???>Actionクラスはプレゼンテーション層だから
>あまりロジックは書かない方がいいんだな。
別にそんなことはない。
0482nobodyさん
2005/07/01(金) 00:36:04ID:???0483nobodyさん
2005/07/01(金) 00:38:57ID:???だからそういうふうに書けばいいんじゃないの?
0484nobodyさん
2005/07/01(金) 02:57:45ID:???Actionクラスを再利用するケースなんてないと思うけどな。
再利用するくらいなら、そのActionにマッピングされたURLを使い回せばいいし。
0485nobodyさん
2005/07/01(金) 12:31:12ID:???0487nobodyさん
2005/07/02(土) 02:01:02ID:???evalの動的クラス定義おもろいな
テンプレートだけ作れば、actionもviewも用意しなくてもいいようにでけた。
0497nobodyさん
2005/07/02(土) 16:14:50ID:???$class()でいいやん。
>テンプレートだけ作れば、actionもviewも用意しなくてもいいようにでけた。
身の毛もよだつキモさだな。
0498nobodyさん
2005/07/02(土) 17:50:42ID:???0499nobodyさん
2005/07/02(土) 18:47:26ID:???0500nobodyさん
2005/07/02(土) 18:52:16ID:???0501nobodyさん
2005/07/02(土) 18:55:39ID:???0502nobodyさん
2005/07/02(土) 21:52:19ID:???パスワードと確認用パスワード
を比べるみたいな設定ってどうやったらいいの?
0503nobodyさん
2005/07/02(土) 22:02:22ID:???0505nobodyさん
2005/07/03(日) 14:01:39ID:???0506nobodyさん
2005/07/03(日) 17:26:50ID:???0507nobodyさん
2005/07/03(日) 18:15:06ID:???注意していても万が一ってのがある品・・
0508nobodyさん
2005/07/03(日) 19:58:15ID:???0509nobodyさん
2005/07/03(日) 20:07:47ID:???掲示板なら管理画面と本体みたいな感じでいいんですか?
0510nobodyさん
2005/07/04(月) 00:00:07ID:???てかモジュールいらなくね?とすら思う
0511nobodyさん
2005/07/04(月) 13:52:14ID:???0512nobodyさん
2005/07/04(月) 15:34:12ID:???使えるけど使わない
使う必要すらない
使う奴のほうがチキン
>>511は何にevalを使ってらっしゃるの?
■ このスレッドは過去ログ倉庫に格納されています