PHPでOOP ..
[2ch|▼Menu]
82:nobodyさん
07/06/12 06:55:41 e4tfCBN5
79は勘違いしてるが、彼がいいたいのはPearのDBクラスのことだろう

83:nobodyさん
07/06/12 09:31:07
82が勘違いだろ。
単にPDOだろ

84:1 ◆SWtzLesEmM
07/06/12 10:24:12
>>73
情報提供どうもありがとうございます。
独習PHPは、図書館でかりて読んでみました。
オブジェクト構文の説明は分かりやすいと思いました。

>>79
DBにアクセスするクラスも勉強のため練習で作ってみようと思いました。
その次に、O/Rマッパーの使い方を練習してみることになるでしょうか?

>>82
PHP5に標準で用意されているPDOのことですね。
URLリンク(jp2.php.net)
PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。
PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。


85:nobodyさん
07/06/12 10:56:05
mysqliとどっちがいい?

86:nobodyさん
07/06/12 17:53:32
ふとおもったんだが、>>1はできるんじゃないのか。

87:nobodyさん
07/06/17 01:20:06
被害者増やさないように書いておく。
「PHPデザインパターン入門」は買うな。

最近買った中で最低レベルの悪書。

どっかの英語ページを機械翻訳したようなトンチンカンな用語説明にまじって
何故かApacheとPHPのインストール方法だけが丁寧な日本語で書かれている。
あとはデザインパターン図が羅列してあるだけ。解説ほぼ無し。
3流大学生のコピペ論文を彷彿とさせる。
こんなの真剣に呼んでも絶対わかるようにはならない。

OOP用語の説明は何故かちゃんとしてないのに
php.iniにページさかれてるけど
網羅して無くて中途半端でページ稼ぎとしか思えない。

中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。

88:nobodyさん
07/06/17 01:28:20
なんか良く読むと、この本は解説の日本語が
オブジェクト指向で書かれてる気がした。

多分最初にパターン名を記載した時点で、作者の頭の中では
記載されてるページを呼び出してるんだろうと思えてきた。

解説するための日本語はプロシージャ指向で書いてくれと
小一時間問い詰めたい。

この本理解するには色んな本を買って、全部理解した後じゃないと
読めない。意味ねえじゃん。

89:nobodyさん
07/06/17 01:54:28
軽いフレームワークいじって使うのが一番いいオブジェクト指向の勉強だよ

90:nobodyさん
07/06/17 14:22:50
ウェブアプリにオブジェクト指向なんていらないよ。どうせ文字列を加工してデータベースのテーブルのカラムに並べるだけなんだから。

91:nobodyさん
07/06/17 18:51:52
じゃどういうときに必須なんよ

92:nobodyさん
07/06/24 17:09:42
オブジェクト指向と言う言葉にまどわされず、
クラスの勉強をすればいいんだよ。 

単に、呼び出してるだけだから。 

93:nobodyさん
07/06/24 19:32:38
PEARをサンプルみながら見よう見まねでインスタンス作って
なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね
functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな
PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る

94:nobodyさん
07/06/25 12:32:57
>>93
プロパティに入れれ

95:1 ◆SWtzLesEmM
07/07/06 14:33:24
>>68
>拡張がやりやすい(やりやすく作ることが出来る)
そうみたいですね。
URLリンク(www.amazon.co.jp)
「オブジェクト指向でなぜつくるのか」
という本にも、クラスを使うメリットが同じように説明されていました。(・∀・)

>>74
Javaの本だと
URLリンク(www.amazon.co.jp)
「やさしいJava」をすすめられました。

>>86
(σ・Д・)σプログラミング初心者ですΣ(゚Д゚*)=3

>>89
Zend Frameworkの正式版が出ましたね☆
URLリンク(framework.zend.com)
シンプルなフレームワークを検索したら、CodeIgniterというのがありました。
URLリンク(userguide.cilab.info)


96:nobodyさん
07/07/08 18:20:46 XFKJF1H9
最近このスレが怖くて見れん俺ガイル
なんでそんな成長早いんだよ・・・おかしいだろ・・・orz

97:テレビできたよー
07/07/10 15:53:51 ZIdzImz8
class TV {
 var $channel;
 var $state;
 var $singleton;
 
 function TV() {
  $this->channel = 1;
  $this->state = false;
 }
 
 function on() {
  if(!$this->state) {
   $this->state = true;
   echo "電源オン<br />";
   $this->reflect();
  } else {
   echo "既に電源はオンになっています<br />";
  }
 }
 
 function off() {
  if($this->state) {
   $this->state = false;
   echo "電源オフ<br />";
  } else {
   echo "既に電源はオフになっています<br />";
  }
 }

98:テレビできたよー
07/07/10 15:54:22 ZIdzImz8
 function reflect($c = null) {
  if($this->state) {
   if(!empty($c)) {
    $this->channel = $c;
   }
   
   echo $this->channel . " チャンネルを写します<br />";
  } else {
   echo "電源が入っておりません<br />";
  }
 }
}

$tv = new TV;
$tv->on();
$tv->reflect(8);
$tv->on();
$tv->on();
$tv->off();
$tv->off();
$tv->reflect(5);
$tv->on();


99:nobodyさん
07/07/11 10:41:20
例外投げるようにすれば?

100:1 ◆SWtzLesEmM
07/07/11 12:59:29
例外処理
URLリンク(www.phppro.jp)

2. PHPで例外処理
URLリンク(www.phppro.jp)

PHP5の基本 > 例外処理
URLリンク(www.shigeweb.jp)

phpspot - 例外処理
URLリンク(phpspot.net)

PHP4ではエラー処理といえば、
if ( ($err = func()) != "" ) {
  die("エラーです");
}
のように戻り値のチェックをしていましたが、エラーというものは、呼び出し側がエラー制御を行うのではなく、呼ばれた側で、どういうエラーがあったか、というものがあった方が自然で、呼ばれた側がエラー処理を行うため、モジュールの場合より再利用性が高くなるでしょう。
更に上記では、どういうエラーが起こってエラーが出ているのかということが想像しにくいですね。
そこで try〜catch です。

■例外処理
URLリンク(www.atmarkit.co.jp)
プログラミングにエラー処理は避けて通れない事項だ。
とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。
その煩雑さを回避するため、文法として例外処理を持っている言語もある。
PHP5もそれに倣って、言語仕様として例外処理をサポートした。
文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。

↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか?
=戻り値をチェックするというのは、古いやり方なんでしょうか?


101:1 ◆SWtzLesEmM
07/07/11 13:07:20
>>96
PHPプロのメルマガ読んで、知ったかぶりなだけですw
お互いがんばりましょう☆(・∀・)


102:nobodyさん
07/07/11 14:16:38
いやさ,まず公式マニュアルを読む癖を付けようぜ

103:nobodyさん
07/07/11 14:44:53
MVCじゃないとOOPなんて意味ないですかr

104:nobodyさん
07/07/11 17:30:14
( д)      ...。。

105:nobodyさん
07/07/12 02:57:31
MVCもデザインパターンの一種じゃなかったっけ?

106:nobodyさん
07/07/12 08:06:18
>>100
なんかphpspotのその文はおかしいな。
エラー処理は例外を使おうがそうじゃなかろうが変わらない。
呼ばれた側はどういうエラーがあったか返す責任があるし、
呼んだ側は返ってきたエラーをチェックする責任がある。
エラーが起きた時の挙動を自分で決めれるならその場で処理すれば良いし、
そこではまだ決められないならさらに上位へreturnなりthrowすれば良い。



107:nobodyさん
07/07/14 15:28:38 w3CTKtks
OOPってのはアプリケーションをモノに見立てて、それを構成している部品をクラスとして定義する、ってとこまではなんとなく理解した。

例外処理?なにそれうまいの?

108:nobodyさん
07/07/14 18:34:23
ダンボールの味がするお

109:nobodyさん
07/07/14 19:32:25
おまいらオブジェクト指向に騙されてるよ。ただのデータ型に過ぎない。

110:nobodyさん
07/07/14 19:46:31 w3CTKtks
今、習作としてプロフィールスクリプト(っていうのも大袈裟なぐらいショボイやつ)を書いてるんだけど、どうにも悩む。悩む。
とりあえず、
-質問と答え(Entry)
--セッタ(SetQuestion,SetAnswer)
--ゲッタ(GetQuestion,GetAnswer)
-それらのEntryを編集したり、操作したりする(ManageEntry)
--POSTされたデータにEntryの値を変更する(EditEntry)
-プロフィール自体(Profiel)
--質問と答えを出力(ViewProfiel)
こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。
とくにManageEntryのとことか。
ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え?
OOPムズイ、ナキタイ


スレ汚しスマソ

111:nobodyさん
07/07/14 21:29:40
どんな物を作ってるのかよく分からないけど
ぱっと見で確実に言える事は、個別のクラスが多すぎ。
半分くらい継承とメソッドの追加で済みそう。
今のままだと拡張もやり難そう。

プロフィールが"profiel"なのはつっこんだ方が良いのかな。

CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを
使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。

112:nobodyさん
07/07/14 22:22:33 w3CTKtks
継承とメソッドの追加ってどうやるんですか><;
正直どうやったらいいのか全くわからん。
プロフィール?え?あ?あはあは。

113:nobodyさん
07/07/15 00:13:47
きめぇ

114:nobodyさん
07/07/15 00:19:07
Synfony はつっこんだ方(ry

115:1 ◆SWtzLesEmM
07/07/26 10:21:49
>>106
>呼ばれた側はどういうエラーがあったか返す責任があるし、
>呼んだ側は返ってきたエラーをチェックする責任がある。

なるほど〜(・∀・)
呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね!
大変参考になりました。


116:1 ◆SWtzLesEmM
07/07/26 10:29:09
掲示板の続きを作りました。
DBにアクセスする機能をクラスにしてみました。
URLリンク(kameleon.s241.xrea.com)

動作サンプル
URLリンク(kameleon.s241.xrea.com)

なんか、>>55さんのアドバイスの形になってませんが…orz
とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/

117:1 ◆SWtzLesEmM
07/07/26 10:50:37
>>110
おー、ガンバレ〜〜〜☆

>>111
(1) Entryクラス
文章を「書き込む」メソッド、「読む」メソッド、「書き換える(編集)」メソッド、「削除する」メソッドが用意されている。

(2) Entryクラスを継承して、質問用のクラスを用意
=質問のデータだけを操作できる

(3) Entryクラスを継承して、答え用のクラスを用意
=答えのデータだけを操作できる

というかんじになるんでしょうか?
どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)


118:nobodyさん
07/07/26 10:57:58
どうしてPDOをry

119:nobodyさん
07/07/27 00:44:20
おんにゃにょこの
おっぱい
ぷぴにぷにだにょ〜

120:nobodyさん
07/07/28 17:35:02
夏だな

121:nobodyさん
07/07/30 03:51:10
function &foo {
echo "ほげ"


こういうやつ、「リファレンスを返す」っていうんですか?
これはどういう処理をしているんでしょうか?
どこかで定義されているfoo()という関数に何かしているんですか?

122:nobodyさん
07/07/31 07:40:25
高機能な参照関数だな

123:nobodyさん
07/08/01 06:30:28 abLVM2kM
>>87
買ってしまっていたよ。Iteratorまで読んだけど、
分かったような分からないような気分。

説明が少ない&下手なのは分かった。

124:nobodyさん
07/08/01 22:18:22
分からない人に分かるように書いてないという意味では同意。
書いてあることを全て理解していこうとするとこんがらがってくるしね。
まぁいい頭の体操になったけど。
あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。

125:522
07/08/26 13:53:57 QzPwO1Nh
>>117
なんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110と同じような感じになっちゃいましたとさ・・・
「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><

126:nobodyさん
07/08/26 14:28:30
お前が「モノ」をどう捉えるか次第だよ

127:nobodyさん
07/08/28 02:25:00
結局どうやってデータを保持したら、人間にとって分かりやすいか、コンピュータにとってやさしいかってことだろ。

128:nobodyさん
07/10/03 02:51:35
オブジェクト指向は木構造を再現しようとしているだけ。
インスタンスだのオブジェクトだのは枝、茎、葉、花、果実を作るというだけ。
mainでは結果(果実)だけをとりたいから枝やら茎やらは見えなくしとけってことだろ?

129:nobodyさん
07/10/03 16:27:59
>>128
まあそんな感じだ

130:nobodyさん
07/10/03 23:45:33
まぁ、ファイルの管理方法も木構造だし、インターネットなんていっても網状でなく、
サーバーを経由した木構造になってることから演算機が理解しやすいデータ構造は木構造である。
こういってしまっても過言ではないと思う。


例えば、手続き型は東京の小さなバイク便が地方への配達を頼まれても東京発で請け負うみたいなもの。
それに対して、OODはヤ○ト運輸が東京で頼まれた配達を一旦、地方の配送センターに送るようなもの。
配達する対象が少なければ、バイク便に頼んだ方が早いかもしれないけど、数が多くなるとヤ○ト運輸。

131:nobodyさん
07/10/05 01:16:19
うん、ここ数日でオブジェクト思考勉強してて分かったこと。
ちなみに128==130==漏れです。

・オブジェクト指向は木構造
・目的は種の存続、繁栄
・ここでのフローは一つずつだが、間にどれだけの枝が挟まるかは設計次第

クラス設計
 種(プリプロセッサ)から芽が出る(この時点では手続き型でも、OODでもない)
 根クラス…main関数、もしくはmainクラスの設計、遺伝子(設計の違いで木になるかどうかが決定)
 幹クラス…根から養分を吸い上げる(大まかな工程の分類)

オブジェクト生成
 枝クラス…効率的に日光を取得できるよう枝を伸ばす(コンストラクタ)
 葉クラス…光合成を行い、自己生産を行う(メソッド)
 葉緑素クラス…目立たない頑張り屋さん(ライブラリ)
 花クラス…実となるか枯れ落ちるか(オブジェクト)

実行結果
 果実クラス…土に還り、新たな種となりました(プロジェクト成功)

132:nobodyさん
07/10/05 20:07:34
なんかすぐ動いて実用的で簡単なサンプルください

133:nobodyさん
07/10/05 20:35:14
package hoge;


my $class=shift;

$ENV{'TZ'} = "JST-9";
my ($sec,$min,$hour,$mday,$mon,$year) = gmtime(time + 9*60*60);
my $obj={'sec'->$sec, 'min'->$min, 'hour'->$hour, 'mday'->$mday, 'mon'->$mon, 'year'->$year};

return bless $obj, $class;

1;



適当に書いてみた。あとは時間をゴニョゴニョするだけ、普通に作ったほうがメリット大きい気もするがキニシナイ!!
ヨウカソマソ参上===[・∀・]ノシ

134:131
07/10/05 23:40:29
実際に設計して、作ってみるとオブジェクト指向の本質は"同じことは出来るだけ"しない。
この論理で動いてるような気がしてきた。何でもかんでもオブジェクトにするのではなく、
運搬の頻度が激しいデータ、プログラム中で何度も使用するデータをオブジェクトにする。
そんな感じで合ってるのかな?あと、変数の受け渡しは原則、参照で行うみたいな。

135:131
07/10/06 13:37:33
何となく掴めてきた。もっかい木構造で表してみる。

根: プリプロセッサ、送信データ(実行役)
幹: main(効率よく栄養=処理を振り分ける)

[クラス]・・・大規模にもなるとこれが幾重にもネストされる。
  枝: コンストラクタ(葉に栄養=処理を割り振る、葉で生成された養分=オブジェクトを幹に伝える)
  葉: メソッド(オブジェクト=養分を生成する)
  花: オブジェクト(実行結果=果実の手前)

果実: 実行結果(主の繁栄=実行結果が真)

ちなみに実行結果が偽となるのは幹から花に至るまででエラーが起こった場合。


漏れルール
mainは基本的にクラスに指示を与える以外しない。

コンストラクタでオブジェクトの用意を行う。
メンバメソッドはオブジェクトの加工を行う。
コンストラクタからオブジェクトを返す。

mainは次に必要なオブジェクトを作るクラスへ処理を回す。

136:nobodyさん
07/10/07 12:52:54
日曜日1GET!
始めまして
まだPHP3ヶ月目ですが早くもオブジェクト指向で挫折><
ちなみに
・「基礎PHP」
・「PHP5であなたもウェブアプリが作れる!」
・「速効!図解プログラミングPHP + MySQL」
を参考書にしています。

分かりやすかったのは基礎PHPです。
掲示版からスケジュール管理に移るところで
Smarty関連を追加するため承継とか出てきてなるほどと思いました。

ただソース理解しても自分では何もできないんですけどねw

137:nobodyさん
07/10/07 19:12:30
掲示板の改良はどうします?


138:nobodyさん
07/10/07 21:04:45
丸投げします

139:nobodyさん
07/10/07 21:09:36
OOPで作ったやつの
ソースとかうpったら
なんか色々言ってもらえるんかな?
このスレでは

140:nobodyさん
07/10/07 21:46:16
>>139
自分も変なソースですけど味見してもらえます?
恥ずかしいです><

141:nobodyさん
07/10/08 09:30:37
>>133
これをどうやって使えばいいんですか

142:nobodyさん
07/10/08 19:27:30
なかなか面白いブログを発見しました。
ぜひ皆さんに見てもらって意見聞きたいな^^

URLリンク(blogs.itmedia.co.jp)


143:nobodyさん
07/10/09 22:34:59
MVCのコントローラについてどこまでクラスにするか迷っています・・・

144:nobodyさん
07/10/10 16:06:50
ハァ?

145:nobodyさん
07/10/12 03:46:51
意味わかんね
どこまでクラス?

146:nobodyさん
07/11/12 13:32:18
まずはモデルでしょ

147:nobodyさん
07/12/13 08:37:25 Q/a8rTy0
SPLって使ってる人実在するの?

URLリンク(jp2.php.net)

148:nobodyさん
07/12/14 02:09:52
例外はよく使う

149:nobodyさん
07/12/19 01:29:29
>>147
読み込んでも八割がた無駄なので使わない

150:nobodyさん
07/12/23 12:51:26
かしゆか誕生日おめでとう!
URLリンク(www.tkma.co.jp)


151:nobodyさん
07/12/24 10:55:41
>>149
つりですか?

152:nobodyさん
07/12/29 00:05:37 4ZpocZiG
MVCのCってどうやって書けばいいのかわからんぜ。

153:nobodyさん
07/12/29 02:00:56
その概念中でコントローラーが理解出来ないってやつ初めてみた

とりあえずView上で必要な操作を徹底的にControllerに切り離すが良い。
そしてModelからデータを引き出して必要があれば書き込み更新してやりなさい。

154:nobodyさん
07/12/31 19:44:35
ユーザークラスで新規登録処理をして、そのときにユーザークラスの中で
プロフィールクラスのオブジェクトを作ってプロフィールの登録もする

これってしいて言えば何パターン?

155:nobodyさん
07/12/31 19:47:57
ワンパターン

156:nobodyさん
08/01/01 00:16:32
パターンというかコンポジションでそ

157:nobodyさん
08/01/29 11:18:04
模範解答は無いけれど、以下の相互変換を行うクラス(ChStr)をみんなで
作ってみるという案はどうかな?
そして、これが出来たら、ログファイルに保存などの機能をつけ、
wikiみたいに編集が出来る機能を追加していくという感じに。

<編集>
-------------------------------------------------------------
= 2ch
'''2ch'''とは、総合掲示板のことである。
link:[URLリンク(www.2ch.net])<)">URLリンク(www.2ch.net<)
-------------------------------------------------------------

158:1 ◆SWtzLesEmM
08/01/29 11:29:32
>>157
OOPの勉強というよりも、どちらかというと正規表現の勉強になるでしょうか?
wikiのパーサーつくるなら、既存のwikiスクリプトや、PEARのText_Wikiが参考になるかもしれませんね。

URLリンク(www.phppro.jp)
PEAR::Text_Wiki 1.2.0RC1 リリース 2006年10月11日
URLリンク(labs.cybozu.co.jp)
Text_PukiWikiリリース

159:nobodyさん
08/01/29 11:43:55
>>158
C++のOOPの勉強として、文字列を簡単に扱うことが出来るクラスを
自作してみるという演習があったので、それをPHPでもやってみようかなと
思ったものです。
Cでは、文字列を結合したり、splitしたりするのが結構大変なので、
この演習が役に立ったなと思っていたのです。
PHPの場合は、関数を使えばそれで終わってしまうので、もう少し
ひねりを入れたものを考えて見ました。

正規表現を練習するというよりも、正規表現とhtmlの相互変換をする
クラスがあると、プログラムをする際、便利だなという事が実感
出来るのでは?という意味合いです。

(例)正規表現を格納し、html出力する過程。
$text に textarea タグの文字列を格納する。
$str = new ChStr($text);
echo "<html><body>";
$str->Write_html();
echo "</body></html>";

ほら、このクラスがあるとレイアウトを変えたりが、やり易い上に
再利用性が高いでしょ?みたいな。

160:1 ◆SWtzLesEmM
08/01/29 11:47:24
OOPの参考になる解説がありました。

PHPのclass、オブジェクト指向プログラミングに関する質問です。
URLリンク(q.hatena.ne.jp)

2番の回答者の解説が分かりやすいと思いました。
6番の回答者のサンプルコードも参考になりましたが、これは「インターフェース」の利用方法ではありませんね。><

インターフェイス
URLリンク(www.phppro.jp)
あるクラスが実装する必要があるメソッドの種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。
インターフェイスはキーワードinterfaceにより定義され、通常のクラスと同様に定義することができますが、メソッドの実装は全く定義されません。

161:1 ◆SWtzLesEmM
08/01/29 12:00:16
>>159
なるほど!(・∀・)
文字列を扱う処理は、いろんなところで出番がありそうですね!
wikiの文法(表記方法)が使える掲示板とか作れそう^^

162:nobodyさん
08/01/29 12:04:23
ChStr クラス の設計はこんな感じかな。

メンバ
private $m_str; // 正規表現文字列を格納する。

コンストラクタ
ChStr($str) // 正規表現の文字列を受け取る。

private メソッド
ch_to_html() // 正規表現をhtmlに変換する。

public メソッド
Write_html() // 格納している文字をhtmlで出力する。
Write_text() // 格納している文字を正規表現で出力する。

---------------------------------------------------
本当は、ログファイルへの保存や読み取りなどを機能として
考え、そのあたりまで含めたクラスの設計をした方が
いいんだろうけれど、まずは簡潔にする方向でいきます。
で、後々拡張の方向で。

163:1 ◆SWtzLesEmM
08/01/29 12:04:44
PHPのインターフェースは、Javaとかのインターフェースとはちょっと違っているみたいですねー。><
(…使ったことないので実感がありませんが^^)

PHPでは実装済みのinterfaceを多重に実装できない
URLリンク(blog.xole.net)
URLリンク(blog.xole.net)

164:1 ◆SWtzLesEmM
08/01/29 12:25:09
>>162
こんなかんじのプログラムと似ているかもしれませんねー。

60行で作るPHP用テンプレートエンジン
URLリンク(anond.hatelabo.jp)
>テンプレートの中身を置換する
>function convert_string($s)

↑置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
= 文字サイズ変更、''' 強調、link: リンクとかの記法の置換を担当するprivateメソッド

165:1 ◆SWtzLesEmM
08/01/29 12:34:03
OOPの参考になる解説がありました。

関数、オブジェクト、クロージャ
URLリンク(d.hatena.ne.jp)
>オブジェクトは、データに処理がくっついたものです。
>array.map()のように、後に後に処理を追加していく書き方は、順にコードを追えるため読みやすく、また書きやすいです。

クロージャっていう仕組みは、PHPにはないですね?><
大は小を兼ねる…クロージャの代わりにオブジェクトが使えればとりあえずOKかな?(・∀・)

166:nobodyさん
08/01/29 13:15:31
>>161
>wikiの文法(表記方法)が使える掲示板とか作れそう^^

PEARのText_Wiki使えばよくね?

167:nobodyさん
08/01/29 13:18:38
>>164
> 置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
本来ならば、そうなるでしょうね。それらはすべてprivateで作っておいて、
外部には、一つのインターフェースのみ(この例の場合はWrite_html()がそれに該当)
公開となるでしょう。
記号ごとに別々にメソッドを定義しておけば、記号とhtmlの関係が変わる時は、
どのメソッドを触ればよいかが分かるし、それを変更したことで、
他のメソッドには影響は無かったりします。
(これが構造化プログラムの場合は、目的のソースと目的ではないソースを
見極めるところから始まります。)

-------------------------------------------------------------------------
この ChStr に汎用性を持たせる場合は、Write_html()というよりも、
Get_html()とし、html文字列を return する事になるでしょう。
そうすると、別なプログラムで、「出力結果をファイルに保存する」という
使い方も出来ます。しかし、今回は初回なので、Write_html()とし、
メソッド内部で echo 使うことにします。

168:nobodyさん
08/01/29 13:22:48
>>166
学ぶために具体的に物を作るのと、実用性を考えて物を作るのは
別だと思う。なので、今回はこれでいいと考えている。
現に、初心者向けの書籍に載っているソースの実用性はゼロだ。

169:nobodyさん
08/01/29 13:59:05
とりあえず、全体構成の確認のために書いてみた。
ch_to_html()は、追記の必要性がある。
[chstr.php]
<?php
class ChStr {
// メンバ
var $m_str_reg; // 正規表現文字列を格納する。
var $m_str_html; // html文字列を格納する。
// コンストラクタ
// 正規表現の文字列を受け取る。
function ChStr($regstr) {
$this->m_str_reg = $regstr;
$this->ch_to_html();
}
// private メソッド
// 正規表現をhtmlに変換する。
function ch_to_html() {
// 改行を<BR>に変更する。
// nl2br($this->m_str_reg) 使った方がいいかも
$this->m_str_html = ereg_replace("\n","<BR>",$this->m_str_reg);
}
// public メソッド
// 格納している文字をhtmlで出力する。
function Write_html() {
echo $this->m_str_html;
}
// 格納している文字を正規表現で出力する。
function Write_text() {
echo $this->m_str_reg;
}
}
?>

170:nobodyさん
08/01/29 14:03:31
[index.html] 最初に開くファイル。
<html><body>
<form method="POST" action="./text.php"><textarea name="reg_text" cols=40 rows=4>
あああああ
いいいいい
ううううう
</textarea><br>
<input type=submit value=" 送 信 "></form>
</body></html>


[text.php]
<html><body>
<?php
include("./chstr.php");
$in_text = $_POST["reg_text"];
$chst = new ChStr($in_text);
$chst->Write_html();
?>
</body></html>

171:1 ◆SWtzLesEmM
08/01/29 14:10:04
>>166
確かにそうなんですが、「勉強のため」という目的もあるので、自分で作ってみるというのもありでしょうか?^^
でも、答えが分かっている問題を解くのは楽ですね。>Text_wiki

車輪の再発明 - Wikipedia
Wikipedia項目リンク
車輪の再発明とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を意味する
ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある


172:1 ◆SWtzLesEmM
08/01/29 14:19:35
wikiとか文字列を処理する仕組みは、「パーサー」とか「構文解析」っていうみたいですね(´∀`)

構文解析 - Wikipedia
Wikipedia項目リンク

今までにいろんな仕組みが考えられてきたみたい。
…本格的にやると奥が深そうだけど、一度仕組みを勉強しておいたら、いろいろ使えそうな予感!(・∀・)

↓wikiの仕組みを自分で作っている方は結構いるみたいですねー。

PHP用の汎用WikiParser作り中
URLリンク(tdiary.ishinao.net)
RandomNote/PHPについて
URLリンク(tbox.jpn.org)

173:nobodyさん
08/01/29 14:21:38
今後の課題と予定
・ch_to_html() の中身を書く。
・[text.php] の機能を充実(テキストファイルに保存するなど)させ、wikiを作る。
・上記とは別に、 ChStr クラスを使い、BBSを作る。
・ChStr クラスに clear()、SetStr() 等のメソッドをつけ加え、汎用性を持たせる。

174:1 ◆SWtzLesEmM
08/01/29 14:38:20
URLリンク(tbox.jpn.org)
RandomNoteのMain.phpは参考になるでしょうか?

preg_match
preg_replace
array_push
array_pop
などの関数を使って、文字列の切り貼りをしてるんですねー。

175:nobodyさん
08/01/29 14:39:05
OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
メソッドの中でstringをreturnせずにecho使うのは>>167で書いてるように汎用性って面もあるけど
処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ

176:nobodyさん
08/01/29 15:39:09
>>175
> OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
OOPについて説明するとなると、具体的なソースコードとは離れた方が
良くなったりしますからね。
(クラスの使い方書いているように見えるとしても、)PHPでclassを
組む場合のメリットみたいな位置づけで学んでいこうと思っています。

> 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
確かに汎用性以外にそういう目的もありますね。
次のものでstringで返すように書き換えます。

177:nobodyさん
08/01/29 18:16:08
htmlのformのコードもクラス化するのが本当の流れんだろうけれどな。
いきなりそれをやると分かりにくくなるかな・・・

178:に ◆lKs5QMUHoA
08/01/29 19:20:19
ChStrクラスのサンプルソースを投稿してた者ですが、
今までnobodyさんで書いてたけど、分かりにくくなるかと思ったので
酉入れるようにしてみます。

>>5に書いてあるように、オブジェクト指向は「変数を保持できる事」が
メリットだと思うのですが、これがWebアプリだとどうも実感が無かったりします。
リッチクライアントだと、マウスのクリックに合わせて、メソッドが呼び出され、
そのアプリケーションが終了するまでの間、各種オブジェクトの中の変数に
状態が保持されるという構造なので、そのメリットが感じられるのですが、
Webアプリでは、POSTする度にオブジェクトの変数の状態はリセット
されてしまうので、クラスを書いたとしても、結局はグローバル変数から
各種オブジェクトの変数に代入するみたいなコードを書かなくては
ならなくなってしまうので、このメリットがあるのかと思ってしまうのです。

これは、勉強不足だからなのでしょうか。。。

179:nobodyさん
08/01/29 22:51:04
>>160
他の人の話のほうがよっぽど核心を突いてるよ

180:nobodyさん
08/01/29 23:05:47
>>160のはてなのリンクの4番目の話、2chの別の板でも
読んだことがあるけれど、この話本当なの?
具体的に何処でどういう商売をしての話なんだろうか。
アプリケーションを売る話?それとも開発環境用のソフトを売る話?

181:nobodyさん
08/01/30 21:59:22
ピュアな意味でオブジェクトを操作したいなら
ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ

<?php

require_once("hiroyuki.class.php");

$hiroyuki = unserialize($_SESSION["hiroyuki"]

182:nobodyさん
08/01/31 07:20:40 NaJ3keB3
>>178
ユーティリティクラスの再実装みたいな事を熱心にやっても
あまり意味が無いと思いますよ。

まさにあなたの言う「いちいち書くのがめんどくさい」のを回避する為に
OOPがあるんだと思います・・・

OOPの勉強なら、簡単なWEBフレームワークを自作するのが一番良いよ。
知識の無い段階でいきなりPHPでOOPって無理だと思いますよ。

背伸びせず、まずjavaやC#を学習する方が近道かもしれないよ。

183:nobodyさん
08/01/31 08:15:31
.NET 以降の VisualBasic ってどうなの?

184:nobodyさん
08/01/31 17:31:43
MVCモデルにそって、ユーザの入力データと、CSVファイルのデータを
読み込んで表示させるというものを作ってみました。

ファイル:全部で5つ。index.phpを実行する。
cfcontrol.php
cfview.php
index.php
cfmodel.php
csv.txt

[csv]
aaa,bbb,ccc

[index.php]
<?php
include("./cfcontrol.php");
$form_str = $_POST["form"];
$in_str = $_POST["key"];
$form = new CFControl($form_str, $in_str);
?>

185:nobodyさん
08/01/31 17:32:35
[cfcontrol.php]
<?php
include("./cfview.php");
include("./cfmodel.php");
class CFControl{
function CFControl($form_str, $in_str){
if( ($form_str == "")or($form_str == "in") ){
$form = new CFView("index.php","in","");
$form->Write_HTML();
}elseif($form_str == "out"){
$da = new CFModel();
$dat = $da->ReadDat($in_str);
$form = new CFView("index.php","out", $dat);
$form->Write_HTML();
}
}
}
?>

186:nobodyさん
08/01/31 17:33:57
[cfmodel.php]
<?php
class CFModel{
var $m_csv_file;
// コンストラクタ
function CFModel(){
// 読み込むCSVファイルを指定
$this->m_csv_file = "csv.txt";
}
// データを取り出す。
function ReadDat($str){
$INFILE = fopen($this->m_csv_file,"r");
$line = fgets($INFILE, 1024);
fclose($INFILE);
$line = $line . ", " . $str;
return $line;
}
}
?>

187:nobodyさん
08/01/31 17:37:50
[cfview.php](1/2)
<?php
class CFView{
var $m_file; // POSTするファイル名
var $m_type; // 表示するフォームの種類。in か out
var $m_line; // 表示するデータ
// コンストラクタ
function CFView($file, $type, $line){
$this->m_file = $file;
$this->m_type = $type;
$this->m_line = $line;
}
// private
function in_html(){
echo "<html><body>";
echo '<form method="POST" action="' . $this->m_file . '">';
echo '<input type="hidden" name="form" value="out">';
echo '<input type="text" name="key"><input type="submit" value="送信">';
echo "</form></body></html>";
}

188:nobodyさん
08/01/31 17:39:35
[cfview.php](2/2)
// private
function out_html(){
echo "<html><body>";
echo '<form method="POST" action="' . $this->m_file . '">';
echo '<input type="hidden" name="form" value="in">';
echo "$this->m_line<br>";
echo '<input type="submit" value="戻る"></form></body></html>';
}
// public
function Write_HTML(){
if($this->m_type == "in"){
$this->in_html();
}elseif($this->m_type == "out"){
$this->out_html();
}
}
}
?>

189:nobodyさん
08/01/31 17:51:38
フレームワーク使えば?

190:に ◆lKs5QMUHoA
08/01/31 19:03:23
とりあえず、MVCに分けて枠組みを作ってみたけれど、
これをより抽象化させていって、「継承して使ってください」という
方向にするのか、それとも最初はクラスの数を増やさないように
しながら簡単なアプリケーションを作る方向にするべきか。
どっちの方向に持っていったほうがいいのか迷うな。。。

ま、そんなことを考える暇があったら手を動かしてみろという
話なのかもしれないが。。

191:nobodyさん
08/01/31 19:08:05
>>190
自分で考えるのも良いが、君が今やっていることを
やってしまっているのが、フレームワークだ。

まず既存のフレームワークがどうなっているのか参考しろ。

192:nobodyさん
08/01/31 19:44:25
俺も初心者だからこれが最善とは言い切れないけど
newするときに全部引数で渡すってのはナシじゃね?
分かりやすいところだけ書き出すと
[index.php]
$form = new CFControll();
[cfcontrol.php]
コンストラクタ()
{
 $form_str = $_POST['form'];
 $in_str = $_POST['key'];
 if(inだったら){
  $view = new CFView();
  $view->m_type = 'in';
  $view->Write_HTML();
 }
}
[cfview.php]
メンバ変数
var $m_file = 'index.php';
var $m_type = false;
var $m_line = null;

193:192
08/01/31 19:50:52
フレームワーク使ってみろっていうのは賛成
疎結合にとかDRYにっていうのがだんだんわかってきた
理解したところで戻ってきて〜の方が結果的に早そう
俺はまだ勉強中だからそこまで行ってないけど

194:に ◆lKs5QMUHoA
08/01/31 19:56:23
>>192
> $view = new CFView();
> $view->m_type = 'in';
これみたいに、直接メンバにアクセスするのは構造的に良くないと聞いたことが
あるよ。「データをやり取りするのは、インターフェースを通じて」という原則を
守るべきだと。
そうしなければ、CFViewクラスを改変する人は、そのクラスを使っている人の
コードを考慮して、メンバの値や変数名を自由に変える事が出来なくなるから。

なので、私は、コンストラクタで値を渡しても良いし、コンストラクタで値を渡して
いなければ、値を渡すためのインターフェースを使って渡すようにする仕様が
適当かなと思っている。

195:192
08/01/31 20:08:35
汚染されちゃうけどコンストラクタで全部の値渡すよりはましじゃないかなあ
あとコンパイルするときに全部チェックしてくれる言語とそうじゃない言語ってのもある
phpなんだしゆるーくやればいいじゃん なんていうと怒られるかw

196:に ◆lKs5QMUHoA
08/01/31 20:13:09
今調べて知ったのだが、オーバーロードは PHP ではできないらしい。
だったら、コンストラクタで値を渡すよりも、インターフェースで値を
設定するような仕組みになるだろうね。
コンストラクタだと、一度値を設定したら、そのオブジェクトが破棄される
まで、再度設定が出来なくなるから。

197:nobodyさん
08/01/31 20:22:00
メンバ変数へのアクセスはsetter/getterを使う。これは議論の余地なし。
それを用意した上でコンストラクタに引数を渡すなら渡せば良い。
複雑で多くの設定をしなきゃならない時以外、
newした直後に使える状態になっている方が使いやすい。
> $view = new CFView();
> $view->m_type = 'in';
これをセットで書かなきゃならないなら、
> $view = new CFView('in');
と書きたい。



198:に ◆lKs5QMUHoA
08/01/31 20:26:00
私は>>197さんの意見に同意だ。
「このモジュールを使う場合、このように書いてくださいね。」
というコードは、なるべく少ない方がいいからね。
なので、とりあえず設定の値はコンストラクタにいれるという
設計で書いてみた。

199:に ◆lKs5QMUHoA
08/01/31 20:31:34
とりあえず、フレームワークを使ってみろという話が出ているが、
具体的にどのフレームワークを使って、どんなプログラムを書いて
みたらいいのか迷うなぁ。

とりあえずはこのあたりに載ってるものの、「和モノ」あたりからかな。
スレリンク(php板:3番)

フレームワーク自体の自作の話もいくつかあるみたいだ。
URLリンク(codezine.jp)

200:192
08/01/31 20:36:05
viewに渡すデータはセッタで渡したくならない?
あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の仕事なんじゃないかなと思うんだけど違うかな

201:192
08/01/31 20:42:33
いや、見直したらそう書いてた
ごめん気にしないで

202:に ◆lKs5QMUHoA
08/01/31 20:46:31
>>200
> viewに渡すデータはセッタで渡したくならない?
表示させるデータはセッタがいいだろうね。

> あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の
> 仕事なんじゃないかなと思うんだけど違うかな
>>185のソースがそれにあたるものだと思ってたけど。
if( ($form_str == "")or($form_str == "in") ){
 省略
}elseif($form_str == "out"){
 省略
}
コントローラは、POSTしてきた値を見て、必要なModelやViewを
選択し、実行する役割なので、それを実現したつもり。

203:に ◆lKs5QMUHoA
08/01/31 21:58:27
厳密にMVCを分けることは出来ない場合もあるということだけど、
CFControlクラスで、CFViewを使って表示する内容までもを
指定していする処理を書いていたのは間違いかな?

検索結果の表示や、データの更新の場合は、
Control→Model→View だけど、
ボタンを押した時の画面の展開のみの場合は、
Contol→View という流れとなり、Viewオブジェクトを
生成するクラスが異なるという処理でいいのかな?

204:に ◆lKs5QMUHoA
08/02/01 07:38:53
「とりあえずはフレームワークを使ってみろ」という返事がきそうだけど、
各クラスの役割は以下のような感じでいいかな?

Control
・POSTでデータを受け取り、その値に不正なものが無いかをチェック。
・変なところからのアクセスではないかをチェック。
・$_POST["Form"]の値をみて、それに必要な画面と処理を判断する。

Model
・SQLを発行し、データを受け取る。
・データをViewクラスに渡す。

View
・フォームを表示する。(フォームごとにクラスを分けたほうがいいのかは迷うな)
・データを1件受け取り、tableタグでレイアウトを調整し、表示する。

205:nobodyさん
08/02/01 09:44:17
とりあえずはフレームワークを使ってみろ

206:nobodyさん
08/02/01 11:08:23
自分なりに調べて見つけたPHPのサンプルを使った解説ページも
読むとwebアプリについて学べるのではないかと思っている。
やることが多くなったけれど、とりあえずは以下の3本だてで
勉強してみることになるのかな。

MVCに分けて、簡単なアプリを自作する。
(ログイン、メニュー、検索条件指定、検索結果、データ編集などの画面があるもの)

和モノフレームワークを使って学ぶ。
簡単なアプリを自作する。
スレリンク(php板:3番)

サンプルで理解! フォームデータの受け渡し
URLリンク(www.atmarkit.co.jp)

207:nobodyさん
08/02/01 12:06:10
ちいたんのソース見てみたけれど、
class CObject ってあって、必ずそれが継承されて作られてるよね。
これの都合って何なんだろう。(メリットは何?)
javaも.NETもこういう基本クラスがあるよね。

208:nobodyさん
08/02/01 12:19:15
全部のクラスに共通するメソッド等が実装できる

209:nobodyさん
08/02/01 13:06:22
>>208
サンクス。
でも、オーバーロードが出来ない場合は逆に足かせになる可能性もあるね。
例えば、継承されているクラスが沢山ある状況でObjectクラスに
メソッドを追加する場合とか。

210:nobodyさん
08/02/01 16:28:22
喋るのはコントローラとモデル
コントローラとビュー
基本的にはね

211:nobodyさん
08/02/01 16:49:11
少ない数のクラスを書いたり読んだりする程度であれば、すぐに分かるのだが、
フレームワークレベルのクラス構造となると、その構成が全く分からなくなって
来るんだよなぁ。何かコツのようなものはあるのかな?

処理の内容を追いかけると、次々に別のクラスに処理を渡す構造になっていて、
最後はあっけない、みたいな感じだ。

フレームワークを作る場合のクラスの設計手法を身につけるなどしないと
いけないのかも。
メンバに定義はしていないけれど、メソッドではその変数をエラーが
出ないように処理が書かれているっていう書き方は多いようだ。
そうしておけば、そのフレームワークを使う人は、クラスを継承して
メンバに値を代入するだけで良い。

212:nobodyさん
08/02/01 18:37:23
このサイト、説明は分かるのだが、具体的に作っているコードは
MVCのうちどれにあたるのかがいまいちです。
URLリンク(www.stackasterisk.jp)

Result.php は、Viewにあたるものという解釈でいいんですよね?

213:nobodyさん
08/02/01 18:47:22
PHPでMVC関連のサイトを紹介で貼っておきます。

特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (1/4)
URLリンク(www.itmedia.co.jp)

214:nobodyさん
08/02/01 18:50:51
2004年って・・・・・・・

215:nobodyさん
08/02/01 20:08:38
OOPに取り付かれている人のブログ

ハタさんのブログ : : php
URLリンク(blog.xole.net)


216:nobodyさん
08/02/02 07:42:39
PHPでね、イベントドリブンなWEBフレームワークとか自作してみるといいかも。

例えば、サブミットボタンの処理ハンドラがオーバーライドで記述可能で
そこでフォーム値をモデルに渡して処理させるみたいなやつ・・

「POST」や「GET」とかローレベルの概念は全て隠蔽されてて
フレームワークにイベント発生時のロジックだけ記述して終わりみたいなの・・・

そしてPHPであれこれ試行錯誤したあと、ASP.NETとか参考にするとね
PHPでOOPするバカらしさに気付くかもしれない・・・OTL

217:に ◆lKs5QMUHoA
08/02/02 08:25:40
ASP.NET は、ちょっとだけやってみたことあるけど、概念的に違和感が
あって、やらなくなったな。
ある程度Webアプリを学んだ事のある人には便利なんだろうけれど、
初めて学ぶ人には、ドキュメントが少なすぎだし、いきなりイベントドリブンで
やるのはどうかと思った。

で、まずは、Webアプリの基礎をやるという意味合いでPerlをやってみた。
で、今はPHPをやっている。PHPそのものがOOPに完全な対応をしていない
ので、これで大規模なアプリを組むことも無いかなと思っている。
対応したとしても、それからノウハウが出てくるので、さらに数年先になる。

でも、学ぶ時は、既存のモジュールを使って早くやるのよりも、モジュール
なしの状態で、モジュールを作ってみる方がいいので、とりあえず今は
PHPでOOPです。

218:nobodyさん
08/02/02 09:56:37
>>217
多分、その違和感のある概念がOOPの本質だと思うよ。
そしてその概念は、洗礼された実装に触れることでしか
身につかないとも思うんだ。

初心者こそイベントドリブンを真っ先に学習したほうがいいよ。
最終的に、理解し易く安全な実装方法に結びつくと思うからね。

PHPでOOPで実装ってケースはありだとは思うけど、
概念は別で学習した方が効率的だと思うんだ。

219:nobodyさん
08/02/02 13:32:52
OOPに取り付かれているとか良くわからんw

普通にプログラミングしていると使うだろ?

switchに取り付かれているとかそういうレベルに聞こえるんだが。


220:nobodyさん
08/02/02 15:21:16
MVCモデルでプログラミングする場合、Model から View へ処理を渡す経緯は、
どっちが正しいのかな?
・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
 Control クラスが、Model からデータを受け取り、View クラスへデータを渡し、
 描画指示を出す。
・Model クラスのメソッド内で、View クラスのインスタンスを生成する。
 Model クラスが、Viewクラスへデータを渡し、描画指示を出す。
 Control クラスは、View クラスを一切操作しない。

それとも、こういうところまでは理論的には定めていないので、
ケースバイケースであり、どちらがよいというものは無いということかな?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5368日前に更新/227 KB
担当:undef