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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
02432392005/06/16(木) 21:43:06ID:???
>>240-242
独学の悲しさか何がわからないのかわからない程混乱してます。
もっとシンプルな例えとして「部署一覧」や、「部署コードから部署名」を検索する場合、
・部署一覧クラス(部署単体クラスの集まりをデータにもつ)
・部署クラス(部署単体のクラス)
・DBクラス(DBへアクセスしてSQLを実行する)
が必要かなと思うのですが(間違ってますでしょうか?)
■DBクラスのSQLを実行するfunction query($sql)は
何を返すべきなんでしょう。
1.部署オブジェクトの配列(さらに部署一覧オブジェクトに読み込む)
2.部署一覧オブジェクト
3.部署名の配列。それを改めて部署オブジェクトに読み込む(さらに
 部署一覧オブジェクトに読み込む)
4.部署名の配列。それを部署一覧オブジェクトに読み込む。
■部署一覧を取得するfunction bushoList()と、部署名を検索するfindBusho($key)は
1.両方とも部署一覧クラスのメンバにする
 もし該当部署がひとつしかなくても配列がひとつしかないとして処理する
2.findBusho($key)がひとつしかないことがわかっていれば
 bushoList()は部署一覧クラス・findBusho($key)は部署クラスのメンバにする
3.両方とも部署クラスのメンバにして、複数の部署名の場合に
 部署一覧オブジェクトを生成してそれに入れ込む。
なにを悩んでいるかわかっていただけますでしょうか。
エスパー能力をあてにしてすみません、お願いします。
多分、
>>241
細かくする理由が無い場合、どういうクラスにしたらいいのかわからないです。
>>242
読んでは捨て読んでは捨てというのは具体的にどうしたらいいのか
わからないです。

単純に請求書一覧を得るとか部署一覧を得るとかなら配列を使うなりして
できるのですが、オブジェクト指向だとどうするのかがさっぱりです。
0244nobodyさん2005/06/16(木) 22:42:39ID:???
>>243
> ■DBクラスのSQLを実行するfunction query($sql)は何を返すべきなんでしょう。 

1〜4のどれでもいいのではないかと。データの内容や量、処理の内容によって
どれを選ぶかもプログラマの腕にかかってるわけで。

あと、DBオブジェクトとデータにアクセスするオブジェクトは別々に設計した方がいいのではないかと。

> ■部署一覧を取得するfunction bushoList()と、部署名を検索するfindBusho($key)は 

自分だったらDBクラスを持った部署データを専門に扱う「人事課」みたいなオブジェクトを作るかな。

$jinji = new jinji();
$bushoList = $jinji->bushoList();
$bushoList2 = $jinji->findBusho('shomu');

bushoListやfindBushoが何を返すかは最初の疑問の答えを参照。

> 読んでは捨て読んでは捨てというのは具体的にどうしたらいいのか

例えば、検索結果を全部一度に配列にぶちこむのではなく、ループの中で
1つの変数に1レコードずつ結果を代入して処理する。ループが回るごとに
その変数は上書きされるから配列にぶちこむのに比べてメモリを食わない。
0245nobodyさん2005/06/16(木) 23:30:18ID:???
そんな面倒なことPHPでやっても意味ないよ。
クラスに関数をまとめるだけで十分だよ。
オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。
0246nobodyさん2005/06/16(木) 23:47:48ID:???
>>245
大規模開発になると避けて通れなくなるよ。PHPのなんちゃってオブジェクト指向でも
利用する価値はある。

最近、「クラスに関数まとめるだけ」で適当に作ったサイトがつぎはぎで巨大化するにつれ
保守が間に合わなくなって破綻したのでなんとかしてくれっつー依頼が多い。
まあ逆にフレームワークとかテンプレートエンジンとか詰め込みすぎて負荷でパンクした
サイトも知ってるけど。

> オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。 

これは同意。
0247nobodyさん2005/06/16(木) 23:50:59ID:???
どうしても集合的データの扱い方についてOOPしたいぜしたいぜというなら、IteratorパターンとかVisitorパターンなぞを調べてみるも吉
0248nobodyさん2005/06/17(金) 00:02:32ID:???
追加開発で収拾つかなくなってきたら、その時点で全面的に書き直せばいい。
PHPのよさは手軽にかけることなんだから。
0249nobodyさん2005/06/17(金) 00:06:10ID:???
それはもしや伝説の秘技「道路の掘り返し」では・・・!
02502392005/06/17(金) 00:11:43ID:???
>>244
つ、ついていけない…。「これ以上どうやさしく説明すればいいんだよ」
と怒られそうですが。(丁寧に説明いただいてるは語感からわかります。
感謝です。)
■DBオブジェクトとデータにアクセスするオブジェクトって
どう違うものなのでしょうか?(あ、何か日本語も変だ)
■人事課オブジェクトを作るというのは…
今回の程度の場合、細分化して部署クラスとかを作るんじゃなくて、
(例えばそれはデータメンバの変数にしたりして)操作するクラスを
つくるという解釈でいいでしょうか。

クラスにするものの勘所が全然つかめない…。
0251nobodyさん2005/06/17(金) 00:23:58ID:???
PHP5は知らないけど、PHP4やPerlはオブジェクト指向で開発するには機能が足りなさ杉。
PHPでも工夫すればオブジェクト指向開発できるって言っても、そんな不毛な工夫するより、その言語に適した開発アプローチを取るべきだと思う。
02522392005/06/17(金) 00:27:02ID:???
age続けるのがよいかわからないのでなんとなくですがsageてみます。
>>247
「したいぜ」というか「してみたいぜ」です。みなさんは、「できるけど
やらない。」なのでしょうけど、私は「できない」のでやり方は知って
おきたいのです。
何をクラスにするのかは、案件によって違ってくるんでしょうけど、
なんというか、こう常套手段のようなものを例示してもらえないかなと
思ってるんですよ。例えばDBがあって、そこからデータを引っ張ってきて
そのデータを扱うという操作についてとか…。デザインパターンと実際の
(この例みたいなの)が結びつかないんです。
面と向かって尋ねられる人がいればもう少し理解がはやいのかなとも
思うのですがいないもので。
0253nobodyさん2005/06/17(金) 00:34:44ID:???
O/Rマッパとか使ってみれば?
0254nobodyさん2005/06/17(金) 01:16:39ID:???
>>252
とりあえず、DBへアクセスして結果を取得するクラスに関しては自作するより
PEAR::DBを使うことをおすすめする。
0255nobodyさん2005/06/17(金) 02:48:28ID:???
>>252
>こう常套手段のようなものを例示してもらえないかなと

常套手段のサンプルコードとかは、巷ではPHPよりJAVAの方がずっと多いんじゃないかな。
だからちょっとがんばってJAVAやってみるのも勘所をつかむにはいいかも。

あと私見だけど、自分でクラスつくるときには、
クライアント側(class Bushoを書く側ではなくnew Bushoってやったりメソッド呼び出す側)
の人にとってどうしたら便利か考えながらやるのがいいと思う。
今の段階ではクライアントにあたるのも自分自身だろうから、よりいっそう自分の欲望に正直にできるはず。
02562552005/06/17(金) 02:53:13ID:???
(続き)

>>243の前半の質問の答えは>>244の言うとおり、何がやりたいかに応じてどれでもいいと思う。
後半のに関してはfindBusho()を部署一覧クラスのメンバにして
$list = new BushoList();
$kikaku = $list->findBusho('企画');
って感じで使用したらいいんじゃないかと。

もしfindBushoが部署クラスのメンバだったら
$soumu = $kikaku->findBusho('総務'); // !?
って感じで、特定の部署から他の部署を検索(?)みたいで意味不明かなと思った。
bushoList()メソッドの使いどころは、おいどんにはよくわからんとです。

まあとにかく「クライアント側でどう使ったらいいか」をよく考えてみて。
応援してるからガンガレ!
0257nobodyさん2005/06/17(金) 03:19:33ID:???
> オブジェクト指向の勉強するなら、JavaとかRubyとかにした方がいい。
PHP5のオブジェクト指向はかなりJavaを意識して作られてると思うんだけど
それでもやっぱり物足りない感じですかね?
0258nobodyさん2005/06/17(金) 03:28:16ID:???
PHPにはまだオブジェクト指向を意識して作られたサンプルコードの解説などが少ない
0259nobodyさん2005/06/17(金) 07:29:07ID:???
このスレって質問系とかちょっと頭の悪い書き込みとかがあった時だけ回るの早いな。
どーれ試しに。。。

$obj = new MyClass();

と

$obj = & new MyClass();

の違いって何ですか?
0260nobodyさん2005/06/17(金) 07:38:56ID:???
つ [ マニュアル ]
0261nobodyさん2005/06/17(金) 07:57:27ID:???
>>259
PHP5でやったらStrict error
Strict Standards: Assigning the return value of new by reference is deprecated in C:\home\php\test.php on line 5
0262nobodyさん2005/06/17(金) 08:06:43ID:???
>>260
恥さらしたな。
0263nobodyさん2005/06/17(金) 08:29:16ID:???
は?マニュアルに書いてあるだろ
0264nobodyさん2005/06/17(金) 09:30:34ID:???
>>250
> ■DBオブジェクトとデータにアクセスするオブジェクトってどう違うものなのでしょうか?(あ、何か日本語も変だ) 

DBオブジェクトってのはデータベースに直接アクセスするモノでしょ?
どんな命令でもquery関数に渡せば実行しちゃうような。

それだとqueryに変なモノを渡された時に困るので、DBオブジェクトは直接
使わないようにして、queryを出す専用のオブジェクトを作るわけ。
部署管理なら、部署管理データを操作する専用のオブジェクトを設計する。

> 今回の程度の場合、細分化して部署クラスとかを作るんじゃなくて、

いや、部署オブジェクト(部署1つ分)のインスタンス(群)をリクエストに応じて生成するオブジェクトですね。
「こんな部署のリストください」と言ったら「はい、これとこれ」と言ってDBを勝手に検索して結果を渡して
くれるような存在。こういったオブジェクトには、部署データの更新なんかも任せれば良いかも知れない。
こうすれば、メインルーチンではDBへのSQL文をどうすればいいとか考えなくて済むし、
それもオブジェクト指向のメリット。SQL文絡みのエラーが出れば、それは「人事課オブジェクト」の
設計のせいだとすぐ分かる=バグの原因の特定が容易。

>>251
> PHPでも工夫すればオブジェクト指向開発できるって言っても、そんな不毛な工夫するより、
> その言語に適した開発アプローチを取るべきだと思う。 

全然不毛ではないよ。ある程度以上の規模になると開発効率が全く違う。
本当に不毛ならなぜPEARがほとんどOOで書かれているのかと。

Perlのようにただパッケージを拡張しただけみたいな物でも充分使いではあるよ。
問題は機能の多彩さではなく、OOな考え方でプログラミングが可能かどうか。
機能はその補助(そしてあるときはOOな考え方を強制・補正する束縛)に過ぎない。

構造化プログラミングな思考で書かれたモノと正しいOOな思考で書かれたモノでは
開発効率も保守性も全然違う。
0265nobodyさん2005/06/17(金) 11:33:13ID:???
>>264
>問題は機能の多彩さではなく、OOな考え方でプログラミングが可能かどうか。
>機能はその補助(そしてあるときはOOな考え方を強制・補正する束縛)に過ぎない。

なかなか的を得てる表現だと思った。

>それだとqueryに変なモノを渡された時に困るので、DBオブジェクトは直接
>使わないようにして、queryを出す専用のオブジェクトを作るわけ。

メソッドの引数にSQL文をとらなければいいだけだと思うが。
作成するDBクラス自体に汎用性を持たせたいなら別だけど。
OOP練習中の>>250にはやや冗長かと。
0266nobodyさん2005/06/17(金) 11:39:25ID:???
>>263
ためしに該当部分のURLさらしてみたら?
0267nobodyさん2005/06/17(金) 11:45:33ID:???
>>263
リンクぐらい書かないとね
http://jp.php.net/manual/ja/language.oop.newref.php
0268nobodyさん2005/06/17(金) 12:14:10ID:???
>>267
PHP5の話かとおもった・・・_| ̄|○
0269nobodyさん2005/06/17(金) 13:24:27ID:???
>// create a reference inside the global array $globalref
>global $globalref;
>$globalref[] = &$this;

>// 内部への参照グローバル配列 $globalref を作成
>global $globalref;
>$globalref[] = &$this;

。。。なんかこれ、日本語がやばくないか?
「グローバルな配列 $globalref の中に参照(&$this)をひとつ作る(入れる)」ってことだよね?
0270nobodyさん2005/06/17(金) 13:47:49ID:???
あー誤訳だね

ちなみにPHP5では>>259は冗長なだけで、STRICT外せば完全に同じになるわけ?
0271nobodyさん2005/06/17(金) 14:07:56ID:???
>>259
最初のはインスタンスのコピーを返すが、2番目のは参照を返す。じゃなかったっけか。

$obj = new MyClass();
$obj2 = new MyClass();
$obj->setName("hello");
$obj2->setName("world");
$obj->printName();

実行結果: hello

$obj =& new MyClass();
$obj2 =& new MyClass();
$obj->setName("hello");
$obj2->setName("world");
$obj->printName();

実行結果: world

試してないけどこんな感じでは?

>>261
てきとー訳
> Strict Standards: Assigning the return value of new by reference is deprecated in C:\home\php\test.php on line 5 
> 厳密な標準: newの戻り値を参照で割り当てるのは推奨されません。場所 C:\home\php\test.php の 5 行目

>>270
これもやってないけど、PHP4と同じ振る舞いをするんではなかろうか。
0272nobodyさん2005/06/17(金) 14:27:34ID:???
そもそもWEBプログラミング自体にオブジェクト指向開発の必要性が薄い。
WEBプログラミングっていうのは、ユーザの入力を受け取って、それをDBに入れて、DBから出したものを加工して表示する。
このシーケンシャルな処理の繰り返しに過ぎない。
JavaのStrutsを例にとっても、あれをオブジェクト指向って印象は受けない。
入力データのチェックと画面遷移の仕組みを用意してあるだけだから。だけど、WEBプログラミングにはそれで十分なんだよね。
あれ以上の機能を持たすと、オーバースペックになって使いづらくなるから。
0273nobodyさん2005/06/17(金) 14:30:50ID:???
http://jp.php.net/manual/ja/language.oop5.basic.php

ほうほう
0274nobodyさん2005/06/17(金) 14:37:07ID:???
WEBアプリでのオブジェクト指向開発の参考例って、PHPはもとよりJavaでも見かけない。
それは必要ないから、WEBアプリでは適用しづらいからだと思う。
FLASHとかAjaxみたいなのは別だろうけど、HTTPリクエストドリブンなWEBアプリだと使いどころが見つからない。
0275nobodyさん2005/06/17(金) 14:45:35ID:???
漏れの記憶によれば、はじめごろの応用例ではセッションオブジェクトとかが出てたような気が。
0276nobodyさん2005/06/17(金) 14:47:54ID:???
お、なんか発見
http://zope.jp/dictionary/SESSION%20object
0277nobodyさん2005/06/17(金) 14:52:09ID:???
型がないとか、インターフェイスがないとか、それはオブジェクト指向の本質とは関係ないかもしれない。
けれど、オブジェクト指向開発が必要なケース、大規模開発のときに、これらの機能がないのは厳しい。
あるものとしてコードを書けって言っても、そんな優秀な人ばかりじゃないし、優秀な人でもミスはするし。
それはPerlでuse strictなしで1000行のプログラム書けっていうようなもの。
これを逆にたどって言えば、PHPでオブジェクト指向開発の意義が薄いってことになる。
0278nobodyさん2005/06/17(金) 14:53:00ID:???
お!来た来た!
レベルが下がってくるとこのスレは盛り上がるんだよなw

>>272 >>274
いつの時代までそんなこと言ってるつもりだ?w
0279nobodyさん2005/06/17(金) 15:00:46ID:???
>>272
んで、PHPファイルごとにDBオープンするコード書いて使いまわしが効かなくなって
開発ごとにスクラッチから起こしたり、入力、確認、完了、エラーで4枚似たようなスクリプト
用意してデザイン変わったら4枚とも書き直しだったりするんだよね。
確認画面で値チェックして完了画面ではフリーパスなスクリプトもしょっちゅう見るし。
OOを使わずに「なるほど」と思える大規模なWebプログラムって見たことないな。

完全にオブジェクト指向にする必要性は感じないが、メインルーチンをControlに見立てて
ViewとModelを分離するだけでもかなりすっきりするし保守性も上がる。
こういう風に書いた成果物は使いまわしが効きやすいし。

「そういうのはオブジェクト指向とは呼ばない」と言うなら見解の違いだろう。
少なくともWebアプリケーションでもOOでロジックを分離するメリットはある。

俺も完全に再利用可能な汎用オブジェクトを設計するのは、一部の例外(DBアクセスなど)を
除いてWebアプリケーションでは向いてないと思うけどね。PHP用フレームワークやWeb系PEAR
ライブラリの巨大さ、煩雑さを見るまでもなく。

>>277
> それはPerlでuse strictなしで1000行のプログラム書けっていうようなもの。

え???うちは.plの新規ファイルを立ち上げると、

#!/usr/bin/perl
use strict;

が自動的に挿入されるようになってますが?それで何十万行も書いてきましたが?
なんか、strictが面倒と思ってる人ってグローバルスコープの変数や関数使いまくりの
ぐちゃぐちゃなコード書いてそうだな……。普通に書いてればstrictでもエラーなど滅多に出ないんだが。
0280nobodyさん2005/06/17(金) 15:09:39ID:???
> え???うちは.plの新規ファイルを立ち上げると、
> #!/usr/bin/perl
> use strict;
> が自動的に挿入されるようになってますが?それで何十万行も書いてきましたが?
> なんか、strictが面倒と思ってる人ってグローバルスコープの変数や関数使いまくりの
> ぐちゃぐちゃなコード書いてそうだな……。普通に書いてればstrictでもエラーなど滅多に出ないんだが。

そうだよ。だけど、use strictなしでも、変数の使い方に注意すれば、同じプログラムは書ける。
とはいっても、それはかなりプログラマーの集中力を要する。
同様に、型無し、インターフェイスなしの言語で大規模開発をするのは、難しいと思う。ってこと。
0281nobodyさん2005/06/17(金) 15:13:41ID:???
PHPのOOは単に中規模向けなんじゃないのか?大規模向けじゃなくて。
0282nobodyさん2005/06/17(金) 15:22:59ID:???
>>280
> そうだよ。だけど、use strictなしでも、変数の使い方に注意すれば、同じプログラムは書ける。 
> とはいっても、それはかなりプログラマーの集中力を要する。

いやいやいや、スコープ無視してグローバル使いまくりの方が最終的には疲れるでしょ。
保守性下がるし。ウチはuse strictでエラーが出るようなコードは他の人にも認めてないよ。
もちろん使い捨てのものとかは除く。PHPもファイル間でグローバル共有するのが好きな人が多くて困る。

> 同様に、型無し、インターフェイスなしの言語で大規模開発をするのは、難しいと思う。ってこと。

つまり、そもそも難しいのに構造化プログラミングで書いたらもっと大規模開発は難しくなる、ってことでしょー。

>>279
自己レス
> 俺も完全に再利用可能な汎用オブジェクトを設計するのは、

一度、入力→確認→完了のステップを管理するMVCモデルのクラスを設計したことが
あったんだが、それぞれ継承してメインルーチンから呼び出すと最低でも3*2+1=合計7ファイル、
フォームとかDBとか含めると1処理辺り10枚平気で超えるのでバカバカしいと思い止めた。
(まあフレームワークとか使ったモノをトレースするともっと凄い枚数出てくるけど)。

現在、メインルーチン=Controlの役割+Model+View+テンプレート+フォーム+DAOの
6枚のファイル構成が多いかな。

>>281
まあ本物の大規模開発ならPHPなぞ使わないわな。PHPで片付く案件の中での「大規模」
0283nobodyさん2005/06/17(金) 15:24:39ID:???
>>279
> >>272
> んで、PHPファイルごとにDBオープンするコード書いて使いまわしが効かなくなって
> 開発ごとにスクラッチから起こしたり、入力、確認、完了、エラーで4枚似たようなスクリプト
> 用意してデザイン変わったら4枚とも書き直しだったりするんだよね。
> 確認画面で値チェックして完了画面ではフリーパスなスクリプトもしょっちゅう見るし。

画面遷移や入力値チェックのフレームワークがあるのはいいと思うよ。
そういうフレームワークを自作するときにオブジェクト指向で作るのはいいと思う。
別にオブジェクト指向開発がまったくいらないって思ってるわけじゃないよ。

> 完全にオブジェクト指向にする必要性は感じないが、メインルーチンをControlに見立てて
> ViewとModelを分離するだけでもかなりすっきりするし保守性も上がる。
> こういう風に書いた成果物は使いまわしが効きやすいし。
> 「そういうのはオブジェクト指向とは呼ばない」と言うなら見解の違いだろう。
> 少なくともWebアプリケーションでもOOでロジックを分離するメリットはある。

Javaサーブレット+JSPとかだと、唯一のコントローラを作って、そこから別のビジネスロジックを呼び出すとか、JSPファイルを呼び出すとかするけど、
あれをそのままPHPに当てはめる必要はないと思う。
アンケートフォームで画面遷移するようなのだと、そういうのが便利かなと思うけど。
こういうのをファサードパターンとか解説してある本もあるけど、そうなの?って思うよ。
別にif文で条件分岐して、requireすればいいだけじゃん。って思う。
画面表示部分を分けたほうがいいのはその通りだけど、分離できないこともある。JSPのカスタムタグとか、あれが本当に便利な仕組みなのかな?って思う。
まあ、何百画面もあるような大規模なサイトなら便利なんだろうけど。
02842792005/06/17(金) 15:38:44ID:???
>>283
> 別にオブジェクト指向開発がまったくいらないって思ってるわけじゃないよ。 

んー、であれば大体同意。ガチガチにどれかのデザインパターンに押し込むような
真似はしなくてもいいと思う。

> 分離できないこともある。

だよね。smartyみたいに泥沼化するのは嫌なので、テンプレートからある程度View側に
文字列を取ってこれる仕組みを用意して、あとは実装依存にしてる。
大規模開発ならテンプレートエンジンを使うのもアリだけど、かえって面倒な場合が多い。

> JSPのカスタムタグとか、あれが本当に便利な仕組みなのかな?って思う。 

使ったことはないけど、あんま便利そうには見えない。
0285nobodyさん2005/06/17(金) 21:07:08ID:???
DAOの考え方ってStrutsが元?
0286nobodyさん2005/06/17(金) 22:47:57ID:???
>>279-280
おまいら、同じこと考えてるのに話が噛み合ってないように見えますよ?

>>277
意訳
「use strict なしでもキッチリしたコード書けるけど、
 間違えてもエラー返ってこないからミスしやすい。」

で、>>277はstrictが面倒と思ってるわけではなくて、むしろ逆かと。
0287nobodyさん2005/06/18(土) 00:03:14ID:???
>>286
確かにそんな気がしてきた。サンクス。
0288nobodyさん2005/06/18(土) 00:23:01ID:???
オマエラサァ
PHPでOO語るならPHP4じゃなくてPHP5を前提にしてくれる?
PHP4なんか過去のものなんだけど?
0289nobodyさん2005/06/18(土) 00:33:57ID:???
>>288
客先のサーバが全部PHP5で動くようになったら考えるよ。
0290nobodyさん2005/06/18(土) 00:40:52ID:???
PHP4でOOを行うほどPHP5に移ったとき有り難味があるとか。
それ以外PHP5になにかあったっけ?

Apache2のスレッド処理に対応したとか?
0291nobodyさん2005/06/18(土) 01:18:08ID:???
>>290
>PHP4でOOを行うほどPHP5に移ったとき有り難味があるとか。
>それ以外PHP5になにかあったっけ?

そのOOの話がこのスレの話題であるべきもののひとつだろ。
スレッド処理etcはスレ違い。

>>289
>客先のサーバが全部PHP5で動くようになったら考えるよ。

こちらでドゾ
ttp://pc8.2ch.net/test/read.cgi/php/1118038954/
0292nobodyさん2005/06/18(土) 01:36:38ID:???
>>271
>・・・
>実行結果:?world
>試してないけどこんな感じでは?

いいえ。

>これもやってないけど、PHP4と同じ振る舞いをするんではなかろうか。

いいえ。
0293nobodyさん2005/06/18(土) 08:58:17ID:???
>>292
いぇーい
0294nobodyさん2005/06/18(土) 15:57:59ID:???
PHPのマニュアルにPHPはOOPLではありませんって書いてあるのにはどういう意図があるの?
奴らは「PHPのOOは中途半端」とかいわれるのを恐れているの?
それともPHP6でOOPLになる予定なの?
0295nobodyさん2005/06/18(土) 20:41:36ID:???
>>296
PHP5は完璧にOOPLだと思うが。
0296nobodyさん2005/06/18(土) 21:42:40ID:???
気になったが、みんなの大規模とか中規模を区切る単位ってなんなの?
曖昧すぎでわからん。
0297nobodyさん2005/06/18(土) 21:46:17ID:???
>>290
SQLite標準装備、SimpleXMLで高速XML処理
0298nobodyさん2005/06/18(土) 23:39:02ID:???
>>295
俺もOOPLじゃない理由はない気がするけど。
なんでマニュアルにOOPLじゃないと書いてあんだろう?
http://www.php.net/manual/ja/language.oop.object-comparison-php5.php

どこに書いてあったか忘れてたから探すのに手こずった。
日本語版の方ではPHP4のOOPのサブカテゴリだけど英語版の方ではPHP5側に移動されてるからいつリンクが切れるかわからんな。
一応英語版はこっち。
http://www.php.net/manual/en/language.oop5.object-comparison.php
0299nobodyさん2005/06/18(土) 23:50:08ID:???
>>298
ホントだしっかり書いてあるな。
このスレの存在意義すら危うくなるな。
0300nobodyさん2005/06/18(土) 23:54:02ID:???
>>298
OOでない書き方ができてしまう言語はOOPLじゃないというポリシーなんじゃない?
0301nobodyさん2005/06/19(日) 00:01:48ID:???
>>300
当たってそうな気もする。
そうするとPHP厨はC++もOOPLと呼びたくないわけか。
0302nobodyさん2005/06/19(日) 00:43:26ID:???
早くPHP5がもっと広まってこのスレで活発な意見交換が
できるようになればいいのにな。
0303nobodyさん2005/06/19(日) 00:58:25ID:???
>>302
ならPHP5の話題キボンヌ
0304nobodyさん2005/06/19(日) 01:55:50ID:???
__get() と __set() が微妙に気に入っている漏れがいる・・・
0305nobodyさん2005/06/19(日) 04:03:28ID:kZXyYjBV
OOする時、Listクラス作る?
配列で事足りるけど、OO的に操作できないので
何か気持ち悪い V.S. 面倒の気持ちが戦っているんだけども
0306nobodyさん2005/06/19(日) 05:47:08ID:???
OO的に操作できないってどゆこと?
0307nobodyさん2005/06/19(日) 06:52:44ID:???
普通の配列だと
$obj->method()
の形で要素をいじれないでしょ?
0308nobodyさん2005/06/19(日) 07:06:01ID:???
なんか配列のラッパクラスみたいなもの(?)をつくるってことかな?
まあ>>305で言っている通り配列で事足りるわけだし、漏れは作ろうと思ったことないな。
Listクラス作っても計算量を減らせるわけでもなさそうだし。
なんなら配列をメンバにもてばそれまでって気が・・・。
Javaみたいになんでもかんでも継承して使いたい的な考え?
漏れにはよく利点がわからないけど、なんかの役に立つってなら知りたいかも。
解説キボン。
0309nobodyさん2005/06/19(日) 07:37:39ID:???
グローバル変数が嫌いな人はクラス


0310nobodyさん2005/06/19(日) 07:52:19ID:???
関数は?
0311nobodyさん2005/06/19(日) 11:07:45ID:???
もうね、いつのまにかOOPでしか出来なくなった
0312nobodyさん2005/06/19(日) 11:27:33ID:???
・・・・・・そ、そうか
よくPHPでガンガルな・・・・・・

ちなみにListってどう実装してんの?

class Node { private $data, $next; }
で$nextに参照いれるとか?

class List { private $array; }
だったりしてw
0313nobodyさん2005/06/19(日) 12:08:25ID:???
>>301
いや、逆にOO厨がPHPなんて全然OOじゃない!とか
言い出しそうなので先手を打っといたって感じがする
(あるいは既に叩かれたので書き足したとか)。

C++をOOPLじゃないと攻撃するPHPユーザは見たことないが、
PHPやC++をOOPLじゃないと攻撃するOO厨は沢山いるんじゃん?

print "abc";

こういうのもOOじゃないって怒る人いるよね。

"abc"->print();

すべからくこうすべきだと。
0314nobodyさん2005/06/19(日) 13:11:42ID:???
そうすると>>294の答えは
> 奴らは「PHPのOOは中途半端」とかいわれるのを恐れているの?
の方でおk?
0315nobodyさん2005/06/19(日) 13:28:36ID:9u3ddzIO
掲示板をオブジェクト指向で作ろうとしてるんですが
POSTのチェックはifの連続以外になんかないですか
0316nobodyさん2005/06/19(日) 13:34:42ID:???
なぜifの連続・・・?
0317nobodyさん2005/06/19(日) 13:38:10ID:???
>>316
名前がありませんとか長すぎますみたいなやつ
if(! $name) {...}
else($name > 100){...}
みたいな
0318nobodyさん2005/06/19(日) 13:48:42ID:???
それでいいじゃないの?
まあ俺だったら空欄系は空欄系で、文字列長さ系は文字列長さ系で、不正文字系は不正文字系でまとめるけど。

どうでもいいけどそのコードテキトー杉だなw
0319nobodyさん2005/06/19(日) 14:06:14ID:???
>>317
俺もそういうifの連続にはうんざりしてる。
そういうのを専門にあつかうPEARライブラリってないのかね?
0320nobodyさん2005/06/19(日) 14:15:23ID:???
strLengthCheck($str, 5, 100);

function strLengthCheck ($str, $min, $max) {
  if(strlen($data) < $min and strlen($data) > $max) {
    return "長さが変だよ";
  } else {
    return 0;
  }
}

こういうことにしても結局同じになるんだよなー
0321nobodyさん2005/06/19(日) 15:04:48ID:???
>>317
>>319
つ http://www.planewave.org/translations/quickform/html_quickform.html

ちと重いし使いにくいけどな。
こういうの参考にして自分なりにパッケージ作ってもいいし。
0322nobodyさん2005/06/19(日) 15:31:14ID:???
>>314
アドホックな使い方が出来るのがPHPの良さだし、
雑種的なものとして成長してきたから、
「必ずOOPを推奨するものでは決してありません」と言いたいのでは?
敷居の広さをアピールしているように俺は受け取ったが。
0323nobodyさん2005/06/19(日) 15:41:22ID:???
俺は長さのチェックだけ見ればこんな感じにしてる

$length_limits = array(
  'name' => array(5, 10),
  'message' => array(0, 500),
  ...); // この部分DBやファイルに入れといて取得してもいいし。

foreach ($length_limits as $key => $limits)
{
  list($min, $max) = $limits;
  $len = strlen($_POST[$key];
  if ($len < $min or $len > $max)
    // 長さが変だよ
  else
    // 変じゃないよ
}

っていうかそんなに面倒だと思ったことないけどな。
0324nobodyさん2005/06/19(日) 15:44:30ID:???
面倒っていうかifがだらだら続くのが嫌な感じ
0325nobodyさん2005/06/19(日) 15:51:46ID:???
何でifがそんなに続くんだって
0326nobodyさん2005/06/19(日) 15:58:40ID:???
>>322
一理あるな。
PHPはOOPでもいけるけど、使わなくてもいけるってのは大きな利点。
俺的にPHP5のOOはけっこうイイと思ってる。
中にはPHPはプリミティブ型がオブジェクトでないとか言う奴いそうだけど、そこまで不便でもないし。
まー型なし言語って意味で仲間のJavaScriptみたいなプリミティブ型の実装もけっこう好きだけど。
ガッチガチのOOしたいならOOPLを選べばいい。
0327nobodyさん2005/06/19(日) 16:44:14ID:???
>>322
同意。

>>325
チェックの条件を正規化してないから。でしょ多分。
んでも俺はクラス化してるけど、パスワードチェックの部分なんかはかなりif文並んでるよ。

※うちで必ずやる客が入力したパスワード検証
・英文字+αになっているか(英文字だけ、制御文字、バイナリ、日本語コードなどはNG)
・0123とかabcdとかasdfgとかqwertyとかが含まれていないか
・同じ文字が4つ以上連続していないか
・ユーザー名と同じでないか
・ユーザー名の逆順と同じでないか
・メールアドレスの左側と同じでないか
・メールアドレスの左側の逆順と(略
       : めんどくさいのでやめ

て感じで推測されやすそうなのは全部弾き飛ばしてる。大きいシステムになると
ローマ字+英語のdic使って単語の組は弾いたりするよ。
0328nobodyさん2005/06/19(日) 17:13:00ID:???
>>327
そこにあげた項目ほとんどが結局はpreg_matchの類だろ。
だったらパターンだけ配列にいれてforeachで回せばifなんか激減だろ。
あ、いや、>>327に言ってるわけじゃなくて。>>324がifじゃ嫌とかいう話だったから。
>>327はifが並んでても気にしてないみたいだから好きなだけ並べてください。
0329nobodyさん2005/06/19(日) 19:13:02ID:???
>>328
文字数のmax・minチェックは?
必須チェックもあるだろ?
日付の妥当性チェックなんてのもある。
あんたが言うほど単純なものじゃないんだよ。
0330nobodyさん2005/06/19(日) 19:20:24ID:???
WEBコンテナがないのも問題。リクエストの度にオブジェクトの作り直し。意味ナシ。
0331nobodyさん2005/06/19(日) 20:50:13ID:???
>>330
WEBコンテナってどんな概念なの?
03323282005/06/20(月) 03:52:16ID:???
>>329
パスワードのチェックを一生懸命頑張ってるのはわかったよ。
そこまでやると利用者にとってはムカつくだけの機能だけどなw
ちなみに俺はifの話をしてるだけなので。

ifは3回で済むやんその部分・・・

と言ってみる。
ちなみにもう一回言うけど、あんたがifを並べて書く分には文句ない。
>>315から始まったifダラダラが嫌な方々に対しての話だから。
それとも>>329=>>327=>>324=>>320=>>319=>>317=>>315だった?
それだったら必死こくのもうなずけるw
0333nobodyさん2005/06/20(月) 07:26:24ID:???
なんかOOPしたら
Singletonやたら多くね?
RequestやらSessionやらControllerやら、
基幹部品ほとんどSingletonになるやん。
0334nobodyさん2005/06/20(月) 10:13:11ID:???
>>333
まあ WebProgramming ってのはそういうものな気がする

漏れが1クラスで2つ以上のインスタンスを作るのって composite 系ぐらい
03353272005/06/20(月) 15:48:24ID:???
>>332
>>321と>>327だけっす。>>329は俺じゃないよう。
03363322005/06/20(月) 17:13:53ID:???
>>335
あ、そいつは失敬・・・orz
なんか俺が書いた332の文章読み返してみたら、そうとうイパイパイだな。
反省。

>>333
たしかに制御部分なんかはシングルトンばっかだけどコンテンツと直接関連するとこはけっこうインスタンスつくるな。
インスタンスつくればつくるほど(OOじゃない場合に比べて)重くなっていくのがウザイけど。
PHP5だとその辺いかがなもんだろ?
03373332005/06/20(月) 19:57:28ID:???
やっぱそうだよな〜
Singletonは実装がちょっとだけ面倒だな。
継承で実現できないから毎回同じルーチンをコピペしなきゃならないし。
>>336
4のなんちゃってOOよりは速くなってるはずだよ。
俺もインスタンスのリストも作ってるけど
DBから読んでいっぺんにオブジェクト全部作るより、
一つずつインスタンス作っては表示した方が、メモリ消費量は少ないよなぁとか思いだしたら
一層Singleton傾向が強くなっていくんだよな。
0338nobodyさん2005/06/20(月) 22:01:02ID:???
ググったら、シングルトンは安易に使うな、みたいなことが
結構書かれててビビる。
でも便利すぎるから使いまくりな俺。
大丈夫、ResultやらControllerやらConfig何個も作るなんて
アリエナイアリエナイ……
ほとんどデータ格納系となんかの基底クラスだけだ、シングルトン使ってないの。
ヤバいか。ヤバいかも。
0339nobodyさん2005/06/20(月) 23:34:21ID:???
>>338
Singletonは便利な反面、保守性を低くしがちでもあるから諸刃の剣だよな。
継承できないのもイタイ。アクセス制限もシンドイ。
でも便利・・・。
誰かもっとビューティホーなデザパタ考案汁!
とりあえず使いすぎない程度にほどほどでいった方がいいと思うけど。

>>337
基本的には一つずつインスタンス作って表示でいきたいんだけどね〜。
ちょっと特殊なソートをやるときってどうしてもまとめて読み込むしかないんだよな。
ソートが必要だと一般にDBにやらせてもどうせ同じだけメモリ食ってるだろうし。
(詳しく知らんけどたぶん)
っていうかPHPにソートをやらせると速度激減w
0340nobodyさん2005/06/20(月) 23:58:34ID:???
Singletonが便利なのは少ない変更で非グローバルに戻せること。
その逆も楽。

あっすまん。PHPだと無理だ。
0341nobodyさん2005/06/21(火) 01:22:49ID:???
コネクションプーリングないからダメポ
0342nobodyさん2005/06/21(火) 03:18:21ID:???
できなくもない。>コネクションプーリング
■ このスレッドは過去ログ倉庫に格納されています