- 1 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:35:52 ID:???]
- PHPを使ってプログラミングするとき、
プロシージャ指向(手続き型、構造化プログラミング)でもできますが、 オブジェクト指向を使った場合の恩恵を享受するために、 PHPでオブジェクト指向プログラミングの勉強をしてみましょう。 <目的> PHP5でオブジェクト指向プログラミングを行なうための知識を習得する。 (PHP4のOOPもOK、このスレが1000に行く前にPHP6が出たらPHP6のOOPもOK) <方向性> ・このスレは、プログラミング初心者、PHP初心者の勉強の場として利用することを前提にします。 ・PHPのOOPの話題に限定します。 (Ruby、Python、Javaなど他言語のOOPについては、その言語のスレッドでお願いします。) ・PHPのOOP学習に役立つ本、WEBサイトの紹介をお願いします。 <その他> ・略記は、「OO」=「オブジェクト指向」、「OOP」=「オブジェクト指向プログラミング」でお願いします。 ・質問をする人はなるべくトリップを付けましょう。 ・荒らし、煽り、叩き、気違いは無視・無干渉でお願いします。 このスレで、今日から貴方もOOP!!!\(^o^)/
- 108 名前:nobodyさん mailto:sage [2007/07/14(土) 18:34:23 ID:???]
- ダンボールの味がするお
- 109 名前:nobodyさん mailto:sage [2007/07/14(土) 19:32:25 ID:???]
- おまいらオブジェクト指向に騙されてるよ。ただのデータ型に過ぎない。
- 110 名前:nobodyさん [2007/07/14(土) 19:46:31 ID:w3CTKtks]
- 今、習作としてプロフィールスクリプト(っていうのも大袈裟なぐらいショボイやつ)を書いてるんだけど、どうにも悩む。悩む。
とりあえず、 -質問と答え(Entry) --セッタ(SetQuestion,SetAnswer) --ゲッタ(GetQuestion,GetAnswer) -それらのEntryを編集したり、操作したりする(ManageEntry) --POSTされたデータにEntryの値を変更する(EditEntry) -プロフィール自体(Profiel) --質問と答えを出力(ViewProfiel) こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。 とくにManageEntryのとことか。 ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え? OOPムズイ、ナキタイ スレ汚しスマソ
- 111 名前:nobodyさん mailto:sage [2007/07/14(土) 21:29:40 ID:???]
- どんな物を作ってるのかよく分からないけど
ぱっと見で確実に言える事は、個別のクラスが多すぎ。 半分くらい継承とメソッドの追加で済みそう。 今のままだと拡張もやり難そう。 プロフィールが"profiel"なのはつっこんだ方が良いのかな。 CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを 使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。
- 112 名前:nobodyさん [2007/07/14(土) 22:22:33 ID:w3CTKtks]
- 継承とメソッドの追加ってどうやるんですか><;
正直どうやったらいいのか全くわからん。 プロフィール?え?あ?あはあは。
- 113 名前:nobodyさん mailto:sage [2007/07/15(日) 00:13:47 ID:???]
- きめぇ
- 114 名前:nobodyさん mailto:sage [2007/07/15(日) 00:19:07 ID:???]
- Synfony はつっこんだ方(ry
- 115 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:21:49 ID:???]
- >>106
>呼ばれた側はどういうエラーがあったか返す責任があるし、 >呼んだ側は返ってきたエラーをチェックする責任がある。 なるほど〜(・∀・) 呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね! 大変参考になりました。
- 116 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:29:09 ID:???]
- 掲示板の続きを作りました。
DBにアクセスする機能をクラスにしてみました。 kameleon.s241.xrea.com/dokuwiki/doku.php?id=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B 動作サンプル kameleon.s241.xrea.com/oop/bbs2/index.php なんか、>>55さんのアドバイスの形になってませんが…orz とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/
- 117 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:50:37 ID:???]
- >>110
おー、ガンバレ〜〜〜☆ >>111 (1) Entryクラス 文章を「書き込む」メソッド、「読む」メソッド、「書き換える(編集)」メソッド、「削除する」メソッドが用意されている。 (2) Entryクラスを継承して、質問用のクラスを用意 =質問のデータだけを操作できる (3) Entryクラスを継承して、答え用のクラスを用意 =答えのデータだけを操作できる というかんじになるんでしょうか? どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)
- 118 名前:nobodyさん mailto:sage [2007/07/26(木) 10:57:58 ID:???]
- どうしてPDOをry
- 119 名前:nobodyさん mailto:sage [2007/07/27(金) 00:44:20 ID:???]
- おんにゃにょこの
おっぱい ぷぴにぷにだにょ〜
- 120 名前:nobodyさん mailto:sage [2007/07/28(土) 17:35:02 ID:???]
- 夏だな
- 121 名前:nobodyさん mailto:sage [2007/07/30(月) 03:51:10 ID:???]
- function &foo {
echo "ほげ" } こういうやつ、「リファレンスを返す」っていうんですか? これはどういう処理をしているんでしょうか? どこかで定義されているfoo()という関数に何かしているんですか?
- 122 名前:nobodyさん mailto:sage [2007/07/31(火) 07:40:25 ID:???]
- 高機能な参照関数だな
- 123 名前:nobodyさん [2007/08/01(水) 06:30:28 ID:abLVM2kM]
- >>87
買ってしまっていたよ。Iteratorまで読んだけど、 分かったような分からないような気分。 説明が少ない&下手なのは分かった。
- 124 名前:nobodyさん mailto:sage [2007/08/01(水) 22:18:22 ID:???]
- 分からない人に分かるように書いてないという意味では同意。
書いてあることを全て理解していこうとするとこんがらがってくるしね。 まぁいい頭の体操になったけど。 あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。
- 125 名前:522 [2007/08/26(日) 13:53:57 ID:QzPwO1Nh]
- >>117
なんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110と同じような感じになっちゃいましたとさ・・・ 「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><
- 126 名前:nobodyさん mailto:sage [2007/08/26(日) 14:28:30 ID:???]
- お前が「モノ」をどう捉えるか次第だよ
- 127 名前:nobodyさん mailto:sage [2007/08/28(火) 02:25:00 ID:???]
- 結局どうやってデータを保持したら、人間にとって分かりやすいか、コンピュータにとってやさしいかってことだろ。
- 128 名前:nobodyさん mailto:sage [2007/10/03(水) 02:51:35 ID:???]
- オブジェクト指向は木構造を再現しようとしているだけ。
インスタンスだのオブジェクトだのは枝、茎、葉、花、果実を作るというだけ。 mainでは結果(果実)だけをとりたいから枝やら茎やらは見えなくしとけってことだろ?
- 129 名前:nobodyさん mailto:sage [2007/10/03(水) 16:27:59 ID:???]
- >>128
まあそんな感じだ
- 130 名前:nobodyさん mailto:sage [2007/10/03(水) 23:45:33 ID:???]
- まぁ、ファイルの管理方法も木構造だし、インターネットなんていっても網状でなく、
サーバーを経由した木構造になってることから演算機が理解しやすいデータ構造は木構造である。 こういってしまっても過言ではないと思う。 例えば、手続き型は東京の小さなバイク便が地方への配達を頼まれても東京発で請け負うみたいなもの。 それに対して、OODはヤ○ト運輸が東京で頼まれた配達を一旦、地方の配送センターに送るようなもの。 配達する対象が少なければ、バイク便に頼んだ方が早いかもしれないけど、数が多くなるとヤ○ト運輸。
- 131 名前:nobodyさん mailto:sage [2007/10/05(金) 01:16:19 ID:???]
- うん、ここ数日でオブジェクト思考勉強してて分かったこと。
ちなみに128==130==漏れです。 ・オブジェクト指向は木構造 ・目的は種の存続、繁栄 ・ここでのフローは一つずつだが、間にどれだけの枝が挟まるかは設計次第 クラス設計 種(プリプロセッサ)から芽が出る(この時点では手続き型でも、OODでもない) 根クラス…main関数、もしくはmainクラスの設計、遺伝子(設計の違いで木になるかどうかが決定) 幹クラス…根から養分を吸い上げる(大まかな工程の分類) オブジェクト生成 枝クラス…効率的に日光を取得できるよう枝を伸ばす(コンストラクタ) 葉クラス…光合成を行い、自己生産を行う(メソッド) 葉緑素クラス…目立たない頑張り屋さん(ライブラリ) 花クラス…実となるか枯れ落ちるか(オブジェクト) 実行結果 果実クラス…土に還り、新たな種となりました(プロジェクト成功)
- 132 名前:nobodyさん mailto:sage [2007/10/05(金) 20:07:34 ID:???]
- なんかすぐ動いて実用的で簡単なサンプルください
- 133 名前:nobodyさん mailto:sage [2007/10/05(金) 20:35:14 ID:???]
- 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 mailto:sage [2007/10/05(金) 23:40:29 ID:???]
- 実際に設計して、作ってみるとオブジェクト指向の本質は"同じことは出来るだけ"しない。
この論理で動いてるような気がしてきた。何でもかんでもオブジェクトにするのではなく、 運搬の頻度が激しいデータ、プログラム中で何度も使用するデータをオブジェクトにする。 そんな感じで合ってるのかな?あと、変数の受け渡しは原則、参照で行うみたいな。
- 135 名前:131 mailto:sage [2007/10/06(土) 13:37:33 ID:???]
- 何となく掴めてきた。もっかい木構造で表してみる。
根: プリプロセッサ、送信データ(実行役) 幹: main(効率よく栄養=処理を振り分ける) [クラス]・・・大規模にもなるとこれが幾重にもネストされる。 枝: コンストラクタ(葉に栄養=処理を割り振る、葉で生成された養分=オブジェクトを幹に伝える) 葉: メソッド(オブジェクト=養分を生成する) 花: オブジェクト(実行結果=果実の手前) 果実: 実行結果(主の繁栄=実行結果が真) ちなみに実行結果が偽となるのは幹から花に至るまででエラーが起こった場合。 漏れルール mainは基本的にクラスに指示を与える以外しない。 コンストラクタでオブジェクトの用意を行う。 メンバメソッドはオブジェクトの加工を行う。 コンストラクタからオブジェクトを返す。 mainは次に必要なオブジェクトを作るクラスへ処理を回す。
- 136 名前:nobodyさん mailto:sage [2007/10/07(日) 12:52:54 ID:???]
- 日曜日1GET!
始めまして まだPHP3ヶ月目ですが早くもオブジェクト指向で挫折>< ちなみに ・「基礎PHP」 ・「PHP5であなたもウェブアプリが作れる!」 ・「速効!図解プログラミングPHP + MySQL」 を参考書にしています。 分かりやすかったのは基礎PHPです。 掲示版からスケジュール管理に移るところで Smarty関連を追加するため承継とか出てきてなるほどと思いました。 ただソース理解しても自分では何もできないんですけどねw
- 137 名前:nobodyさん mailto:sage [2007/10/07(日) 19:12:30 ID:???]
- 掲示板の改良はどうします?
- 138 名前:nobodyさん mailto:sage [2007/10/07(日) 21:04:45 ID:???]
- 丸投げします
- 139 名前:nobodyさん mailto:sage [2007/10/07(日) 21:09:36 ID:???]
- OOPで作ったやつの
ソースとかうpったら なんか色々言ってもらえるんかな? このスレでは
- 140 名前:nobodyさん mailto:sage [2007/10/07(日) 21:46:16 ID:???]
- >>139
自分も変なソースですけど味見してもらえます? 恥ずかしいです><
- 141 名前:nobodyさん mailto:sage [2007/10/08(月) 09:30:37 ID:???]
- >>133
これをどうやって使えばいいんですか
- 142 名前:nobodyさん mailto:sage [2007/10/08(月) 19:27:30 ID:???]
- なかなか面白いブログを発見しました。
ぜひ皆さんに見てもらって意見聞きたいな^^ blogs.itmedia.co.jp/tamaki/2006/06/post_57ab.html
- 143 名前:nobodyさん mailto:sage [2007/10/09(火) 22:34:59 ID:???]
- MVCのコントローラについてどこまでクラスにするか迷っています・・・
- 144 名前:nobodyさん mailto:sage [2007/10/10(水) 16:06:50 ID:???]
- ハァ?
- 145 名前:nobodyさん mailto:sage [2007/10/12(金) 03:46:51 ID:???]
- 意味わかんね
どこまでクラス?
- 146 名前:nobodyさん mailto:sage [2007/11/12(月) 13:32:18 ID:???]
- まずはモデルでしょ
- 147 名前:nobodyさん [2007/12/13(木) 08:37:25 ID:Q/a8rTy0]
- SPLって使ってる人実在するの?
jp2.php.net/manual/ja/ref.spl.php
- 148 名前:nobodyさん mailto:sage [2007/12/14(金) 02:09:52 ID:???]
- 例外はよく使う
- 149 名前:nobodyさん mailto:sage [2007/12/19(水) 01:29:29 ID:???]
- >>147
読み込んでも八割がた無駄なので使わない
- 150 名前:nobodyさん mailto:age [2007/12/23(日) 12:51:26 ID:???]
- かしゆか誕生日おめでとう!
www.tkma.co.jp/tjc/j_pop/perfume/profile.html
- 151 名前:nobodyさん mailto:sage [2007/12/24(月) 10:55:41 ID:???]
- >>149
つりですか?
- 152 名前:nobodyさん [2007/12/29(土) 00:05:37 ID:4ZpocZiG]
- MVCのCってどうやって書けばいいのかわからんぜ。
- 153 名前:nobodyさん mailto:sage [2007/12/29(土) 02:00:56 ID:???]
- その概念中でコントローラーが理解出来ないってやつ初めてみた
とりあえずView上で必要な操作を徹底的にControllerに切り離すが良い。 そしてModelからデータを引き出して必要があれば書き込み更新してやりなさい。
- 154 名前:nobodyさん mailto:sage [2007/12/31(月) 19:44:35 ID:???]
- ユーザークラスで新規登録処理をして、そのときにユーザークラスの中で
プロフィールクラスのオブジェクトを作ってプロフィールの登録もする これってしいて言えば何パターン?
- 155 名前:nobodyさん mailto:sage [2007/12/31(月) 19:47:57 ID:???]
- ワンパターン
- 156 名前:nobodyさん mailto:sage [2008/01/01(火) 00:16:32 ID:???]
- パターンというかコンポジションでそ
- 157 名前:nobodyさん mailto:age [2008/01/29(火) 11:18:04 ID:???]
- 模範解答は無いけれど、以下の相互変換を行うクラス(ChStr)をみんなで
作ってみるという案はどうかな? そして、これが出来たら、ログファイルに保存などの機能をつけ、 wikiみたいに編集が出来る機能を追加していくという感じに。 <編集> ------------------------------------------------------------- = 2ch '''2ch'''とは、総合掲示板のことである。 link:[www.2ch.net] ------------------------------------------------------------- <出力> ------------------------------------------------------------- <b><font size="+1">2ch</font></b><br> <b>2ch</b>とは、総合掲示板のことである。<br> link:<a href="www.2ch.net">www.2ch.net</a><br> -------------------------------------------------------------
- 158 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 11:29:32 ID:???]
- >>157
OOPの勉強というよりも、どちらかというと正規表現の勉強になるでしょうか? wikiのパーサーつくるなら、既存のwikiスクリプトや、PEARのText_Wikiが参考になるかもしれませんね。 www.phppro.jp/news/172 PEAR::Text_Wiki 1.2.0RC1 リリース 2006年10月11日 labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/18 Text_PukiWikiリリース
- 159 名前:nobodyさん mailto:age [2008/01/29(火) 11:43:55 ID:???]
- >>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 mailto:age [2008/01/29(火) 11:47:24 ID:???]
- OOPの参考になる解説がありました。
PHPのclass、オブジェクト指向プログラミングに関する質問です。 q.hatena.ne.jp/1187962431 ↑ 2番の回答者の解説が分かりやすいと思いました。 6番の回答者のサンプルコードも参考になりましたが、これは「インターフェース」の利用方法ではありませんね。>< インターフェイス www.phppro.jp/phpmanual/php/language.oop5.interfaces.html あるクラスが実装する必要があるメソッドの種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。 インターフェイスはキーワードinterfaceにより定義され、通常のクラスと同様に定義することができますが、メソッドの実装は全く定義されません。
- 161 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:00:16 ID:???]
- >>159
なるほど!(・∀・) 文字列を扱う処理は、いろんなところで出番がありそうですね! wikiの文法(表記方法)が使える掲示板とか作れそう^^
- 162 名前:nobodyさん mailto:age [2008/01/29(火) 12:04:23 ID:???]
- ChStr クラス の設計はこんな感じかな。
メンバ private $m_str; // 正規表現文字列を格納する。 コンストラクタ ChStr($str) // 正規表現の文字列を受け取る。 private メソッド ch_to_html() // 正規表現をhtmlに変換する。 public メソッド Write_html() // 格納している文字をhtmlで出力する。 Write_text() // 格納している文字を正規表現で出力する。 --------------------------------------------------- 本当は、ログファイルへの保存や読み取りなどを機能として 考え、そのあたりまで含めたクラスの設計をした方が いいんだろうけれど、まずは簡潔にする方向でいきます。 で、後々拡張の方向で。
- 163 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:04:44 ID:???]
- PHPのインターフェースは、Javaとかのインターフェースとはちょっと違っているみたいですねー。><
(…使ったことないので実感がありませんが^^) PHPでは実装済みのinterfaceを多重に実装できない blog.xole.net/article.php?id=589 blog.xole.net/article.php?id=597
- 164 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:25:09 ID:???]
- >>162
こんなかんじのプログラムと似ているかもしれませんねー。 60行で作るPHP用テンプレートエンジン anond.hatelabo.jp/20071030034313 >テンプレートの中身を置換する >function convert_string($s) ↑置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか? = 文字サイズ変更、''' 強調、link: リンクとかの記法の置換を担当するprivateメソッド
- 165 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:34:03 ID:???]
- OOPの参考になる解説がありました。
関数、オブジェクト、クロージャ d.hatena.ne.jp/brazil/20060131/1138692196 >オブジェクトは、データに処理がくっついたものです。 >array.map()のように、後に後に処理を追加していく書き方は、順にコードを追えるため読みやすく、また書きやすいです。 クロージャっていう仕組みは、PHPにはないですね?>< 大は小を兼ねる…クロージャの代わりにオブジェクトが使えればとりあえずOKかな?(・∀・)
- 166 名前:nobodyさん mailto:sage [2008/01/29(火) 13:15:31 ID:???]
- >>161
>wikiの文法(表記方法)が使える掲示板とか作れそう^^ PEARのText_Wiki使えばよくね?
- 167 名前:nobodyさん mailto:age [2008/01/29(火) 13:18:38 ID:???]
- >>164
> 置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか? 本来ならば、そうなるでしょうね。それらはすべてprivateで作っておいて、 外部には、一つのインターフェースのみ(この例の場合はWrite_html()がそれに該当) 公開となるでしょう。 記号ごとに別々にメソッドを定義しておけば、記号とhtmlの関係が変わる時は、 どのメソッドを触ればよいかが分かるし、それを変更したことで、 他のメソッドには影響は無かったりします。 (これが構造化プログラムの場合は、目的のソースと目的ではないソースを 見極めるところから始まります。) ------------------------------------------------------------------------- この ChStr に汎用性を持たせる場合は、Write_html()というよりも、 Get_html()とし、html文字列を return する事になるでしょう。 そうすると、別なプログラムで、「出力結果をファイルに保存する」という 使い方も出来ます。しかし、今回は初回なので、Write_html()とし、 メソッド内部で echo 使うことにします。
- 168 名前:nobodyさん mailto:age [2008/01/29(火) 13:22:48 ID:???]
- >>166
学ぶために具体的に物を作るのと、実用性を考えて物を作るのは 別だと思う。なので、今回はこれでいいと考えている。 現に、初心者向けの書籍に載っているソースの実用性はゼロだ。
- 169 名前:nobodyさん mailto:age [2008/01/29(火) 13:59:05 ID:???]
- とりあえず、全体構成の確認のために書いてみた。
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さん mailto:age [2008/01/29(火) 14:03:31 ID:???]
- [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 mailto:sage [2008/01/29(火) 14:10:04 ID:???]
- >>166
確かにそうなんですが、「勉強のため」という目的もあるので、自分で作ってみるというのもありでしょうか?^^ でも、答えが分かっている問題を解くのは楽ですね。>Text_wiki 車輪の再発明 - Wikipedia ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E 車輪の再発明とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を意味する ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある
- 172 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 14:19:35 ID:???]
- wikiとか文字列を処理する仕組みは、「パーサー」とか「構文解析」っていうみたいですね(´∀`)
構文解析 - Wikipedia ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90%E5%99%A8 今までにいろんな仕組みが考えられてきたみたい。 …本格的にやると奥が深そうだけど、一度仕組みを勉強しておいたら、いろいろ使えそうな予感!(・∀・) ↓wikiの仕組みを自分で作っている方は結構いるみたいですねー。 PHP用の汎用WikiParser作り中 tdiary.ishinao.net/20050323.html RandomNote/PHPについて tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt
- 173 名前:nobodyさん mailto:age [2008/01/29(火) 14:21:38 ID:???]
- 今後の課題と予定
・ch_to_html() の中身を書く。 ・[text.php] の機能を充実(テキストファイルに保存するなど)させ、wikiを作る。 ・上記とは別に、 ChStr クラスを使い、BBSを作る。 ・ChStr クラスに clear()、SetStr() 等のメソッドをつけ加え、汎用性を持たせる。
- 174 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 14:38:20 ID:???]
- tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt
RandomNoteのMain.phpは参考になるでしょうか? preg_match preg_replace array_push array_pop などの関数を使って、文字列の切り貼りをしてるんですねー。
- 175 名前:nobodyさん mailto:sage [2008/01/29(火) 14:39:05 ID:???]
- OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
メソッドの中でstringをreturnせずにecho使うのは>>167で書いてるように汎用性って面もあるけど 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
- 176 名前:nobodyさん mailto:age [2008/01/29(火) 15:39:09 ID:???]
- >>175
> OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして OOPについて説明するとなると、具体的なソースコードとは離れた方が 良くなったりしますからね。 (クラスの使い方書いているように見えるとしても、)PHPでclassを 組む場合のメリットみたいな位置づけで学んでいこうと思っています。 > 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ 確かに汎用性以外にそういう目的もありますね。 次のものでstringで返すように書き換えます。
- 177 名前:nobodyさん mailto:age [2008/01/29(火) 18:16:08 ID:???]
- htmlのformのコードもクラス化するのが本当の流れんだろうけれどな。
いきなりそれをやると分かりにくくなるかな・・・
- 178 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/29(火) 19:20:19 ID:???]
- ChStrクラスのサンプルソースを投稿してた者ですが、
今までnobodyさんで書いてたけど、分かりにくくなるかと思ったので 酉入れるようにしてみます。 >>5に書いてあるように、オブジェクト指向は「変数を保持できる事」が メリットだと思うのですが、これがWebアプリだとどうも実感が無かったりします。 リッチクライアントだと、マウスのクリックに合わせて、メソッドが呼び出され、 そのアプリケーションが終了するまでの間、各種オブジェクトの中の変数に 状態が保持されるという構造なので、そのメリットが感じられるのですが、 Webアプリでは、POSTする度にオブジェクトの変数の状態はリセット されてしまうので、クラスを書いたとしても、結局はグローバル変数から 各種オブジェクトの変数に代入するみたいなコードを書かなくては ならなくなってしまうので、このメリットがあるのかと思ってしまうのです。 これは、勉強不足だからなのでしょうか。。。
- 179 名前:nobodyさん mailto:sage [2008/01/29(火) 22:51:04 ID:???]
- >>160
他の人の話のほうがよっぽど核心を突いてるよ
- 180 名前:nobodyさん mailto:sage [2008/01/29(火) 23:05:47 ID:???]
- >>160のはてなのリンクの4番目の話、2chの別の板でも
読んだことがあるけれど、この話本当なの? 具体的に何処でどういう商売をしての話なんだろうか。 アプリケーションを売る話?それとも開発環境用のソフトを売る話?
- 181 名前:nobodyさん mailto:sage [2008/01/30(水) 21:59:22 ID:???]
- ピュアな意味でオブジェクトを操作したいなら
ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ <?php require_once("hiroyuki.class.php"); $hiroyuki = unserialize($_SESSION["hiroyuki"]
- 182 名前:nobodyさん [2008/01/31(木) 07:20:40 ID:NaJ3keB3]
- >>178
ユーティリティクラスの再実装みたいな事を熱心にやっても あまり意味が無いと思いますよ。 まさにあなたの言う「いちいち書くのがめんどくさい」のを回避する為に OOPがあるんだと思います・・・ OOPの勉強なら、簡単なWEBフレームワークを自作するのが一番良いよ。 知識の無い段階でいきなりPHPでOOPって無理だと思いますよ。 背伸びせず、まずjavaやC#を学習する方が近道かもしれないよ。
- 183 名前:nobodyさん mailto:sage [2008/01/31(木) 08:15:31 ID:???]
- .NET 以降の VisualBasic ってどうなの?
- 184 名前:nobodyさん mailto:sage [2008/01/31(木) 17:31:43 ID:???]
- 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さん mailto:sage [2008/01/31(木) 17:32:35 ID:???]
- [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さん mailto:sage [2008/01/31(木) 17:33:57 ID:???]
- [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さん mailto:sage [2008/01/31(木) 17:37:50 ID:???]
- [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さん mailto:sage [2008/01/31(木) 17:39:35 ID:???]
- [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さん mailto:sage [2008/01/31(木) 17:51:38 ID:???]
- フレームワーク使えば?
- 190 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 19:03:23 ID:???]
- とりあえず、MVCに分けて枠組みを作ってみたけれど、
これをより抽象化させていって、「継承して使ってください」という 方向にするのか、それとも最初はクラスの数を増やさないように しながら簡単なアプリケーションを作る方向にするべきか。 どっちの方向に持っていったほうがいいのか迷うな。。。 ま、そんなことを考える暇があったら手を動かしてみろという 話なのかもしれないが。。
- 191 名前:nobodyさん mailto:sage [2008/01/31(木) 19:08:05 ID:???]
- >>190
自分で考えるのも良いが、君が今やっていることを やってしまっているのが、フレームワークだ。 まず既存のフレームワークがどうなっているのか参考しろ。
- 192 名前:nobodyさん mailto:sage [2008/01/31(木) 19:44:25 ID:???]
- 俺も初心者だからこれが最善とは言い切れないけど
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 mailto:sage [2008/01/31(木) 19:50:52 ID:???]
- フレームワーク使ってみろっていうのは賛成
疎結合にとかDRYにっていうのがだんだんわかってきた 理解したところで戻ってきて〜の方が結果的に早そう 俺はまだ勉強中だからそこまで行ってないけど
- 194 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 19:56:23 ID:???]
- >>192
> $view = new CFView(); > $view->m_type = 'in'; これみたいに、直接メンバにアクセスするのは構造的に良くないと聞いたことが あるよ。「データをやり取りするのは、インターフェースを通じて」という原則を 守るべきだと。 そうしなければ、CFViewクラスを改変する人は、そのクラスを使っている人の コードを考慮して、メンバの値や変数名を自由に変える事が出来なくなるから。 なので、私は、コンストラクタで値を渡しても良いし、コンストラクタで値を渡して いなければ、値を渡すためのインターフェースを使って渡すようにする仕様が 適当かなと思っている。
- 195 名前:192 mailto:sage [2008/01/31(木) 20:08:35 ID:???]
- 汚染されちゃうけどコンストラクタで全部の値渡すよりはましじゃないかなあ
あとコンパイルするときに全部チェックしてくれる言語とそうじゃない言語ってのもある phpなんだしゆるーくやればいいじゃん なんていうと怒られるかw
- 196 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:13:09 ID:???]
- 今調べて知ったのだが、オーバーロードは PHP ではできないらしい。
だったら、コンストラクタで値を渡すよりも、インターフェースで値を 設定するような仕組みになるだろうね。 コンストラクタだと、一度値を設定したら、そのオブジェクトが破棄される まで、再度設定が出来なくなるから。
- 197 名前:nobodyさん mailto:sage [2008/01/31(木) 20:22:00 ID:???]
- メンバ変数へのアクセスはsetter/getterを使う。これは議論の余地なし。
それを用意した上でコンストラクタに引数を渡すなら渡せば良い。 複雑で多くの設定をしなきゃならない時以外、 newした直後に使える状態になっている方が使いやすい。 > $view = new CFView(); > $view->m_type = 'in'; これをセットで書かなきゃならないなら、 > $view = new CFView('in'); と書きたい。
- 198 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:26:00 ID:???]
- 私は>>197さんの意見に同意だ。
「このモジュールを使う場合、このように書いてくださいね。」 というコードは、なるべく少ない方がいいからね。 なので、とりあえず設定の値はコンストラクタにいれるという 設計で書いてみた。
- 199 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:31:34 ID:???]
- とりあえず、フレームワークを使ってみろという話が出ているが、
具体的にどのフレームワークを使って、どんなプログラムを書いて みたらいいのか迷うなぁ。 とりあえずはこのあたりに載ってるものの、「和モノ」あたりからかな。 pc11.2ch.net/test/read.cgi/php/1197383840/3 フレームワーク自体の自作の話もいくつかあるみたいだ。 ttp://codezine.jp/a/article.aspx?aid=104
- 200 名前:192 mailto:sage [2008/01/31(木) 20:36:05 ID:???]
- viewに渡すデータはセッタで渡したくならない?
あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の仕事なんじゃないかなと思うんだけど違うかな
- 201 名前:192 mailto:sage [2008/01/31(木) 20:42:33 ID:???]
- いや、見直したらそう書いてた
ごめん気にしないで
- 202 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:46:31 ID:???]
- >>200
> viewに渡すデータはセッタで渡したくならない? 表示させるデータはセッタがいいだろうね。 > あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の > 仕事なんじゃないかなと思うんだけど違うかな >>185のソースがそれにあたるものだと思ってたけど。 if( ($form_str == "")or($form_str == "in") ){ 省略 }elseif($form_str == "out"){ 省略 } コントローラは、POSTしてきた値を見て、必要なModelやViewを 選択し、実行する役割なので、それを実現したつもり。
- 203 名前:に ◆lKs5QMUHoA mailto:sage [2008/01/31(木) 21:58:27 ID:???]
- 厳密にMVCを分けることは出来ない場合もあるということだけど、
CFControlクラスで、CFViewを使って表示する内容までもを 指定していする処理を書いていたのは間違いかな? 検索結果の表示や、データの更新の場合は、 Control→Model→View だけど、 ボタンを押した時の画面の展開のみの場合は、 Contol→View という流れとなり、Viewオブジェクトを 生成するクラスが異なるという処理でいいのかな?
- 204 名前:に ◆lKs5QMUHoA mailto:sage [2008/02/01(金) 07:38:53 ID:???]
- 「とりあえずはフレームワークを使ってみろ」という返事がきそうだけど、
各クラスの役割は以下のような感じでいいかな? Control ・POSTでデータを受け取り、その値に不正なものが無いかをチェック。 ・変なところからのアクセスではないかをチェック。 ・$_POST["Form"]の値をみて、それに必要な画面と処理を判断する。 Model ・SQLを発行し、データを受け取る。 ・データをViewクラスに渡す。 View ・フォームを表示する。(フォームごとにクラスを分けたほうがいいのかは迷うな) ・データを1件受け取り、tableタグでレイアウトを調整し、表示する。
- 205 名前:nobodyさん mailto:sage [2008/02/01(金) 09:44:17 ID:???]
- とりあえずはフレームワークを使ってみろ
- 206 名前:nobodyさん mailto:sage [2008/02/01(金) 11:08:23 ID:???]
- 自分なりに調べて見つけたPHPのサンプルを使った解説ページも
読むとwebアプリについて学べるのではないかと思っている。 やることが多くなったけれど、とりあえずは以下の3本だてで 勉強してみることになるのかな。 MVCに分けて、簡単なアプリを自作する。 (ログイン、メニュー、検索条件指定、検索結果、データ編集などの画面があるもの) 和モノフレームワークを使って学ぶ。 簡単なアプリを自作する。 pc11.2ch.net/test/read.cgi/php/1197383840/3 サンプルで理解! フォームデータの受け渡し ttp://www.atmarkit.co.jp/flinux/rensai/mysql5_03/mysql5_03a.html
- 207 名前:nobodyさん mailto:sage [2008/02/01(金) 12:06:10 ID:???]
- ちいたんのソース見てみたけれど、
class CObject ってあって、必ずそれが継承されて作られてるよね。 これの都合って何なんだろう。(メリットは何?) javaも.NETもこういう基本クラスがあるよね。
- 208 名前:nobodyさん mailto:sage [2008/02/01(金) 12:19:15 ID:???]
- 全部のクラスに共通するメソッド等が実装できる
|

|