のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,969人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    元スレPHPでOOP

    php覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : - cake + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    151 = :

    >>149
    つりですか?

    152 :

    MVCのCってどうやって書けばいいのかわからんぜ。

    153 = :

    その概念中でコントローラーが理解出来ないってやつ初めてみた

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

    154 = :

    ユーザークラスで新規登録処理をして、そのときにユーザークラスの中で
    プロフィールクラスのオブジェクトを作ってプロフィールの登録もする

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

    155 = :

    ワンパターン

    156 = :

    パターンというかコンポジションでそ

    157 = :

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

    <編集>
    -------------------------------------------------------------
    = 2ch
    '''2ch'''とは、総合掲示板のことである。
    link:[http://www.2ch.net]
    -------------------------------------------------------------

    <出力>
    -------------------------------------------------------------
    <b><font size="+1">2ch</font></b><br>
    <b>2ch</b>とは、総合掲示板のことである。<br>
    link:<a href="http://www.2ch.net">http://www.2ch.net</a><br>
    -------------------------------------------------------------

    158 = :

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

    http://www.phppro.jp/news/172
    PEAR::Text_Wiki 1.2.0RC1 リリース 2006年10月11日
    http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/18
    Text_PukiWikiリリース

    159 = :

    >>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 = :

    OOPの参考になる解説がありました。

    PHPのclass、オブジェクト指向プログラミングに関する質問です。
    http://q.hatena.ne.jp/1187962431

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

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

    161 = :

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

    162 = :

    ChStr クラス の設計はこんな感じかな。

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

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

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

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

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

    163 = :

    PHPのインターフェースは、Javaとかのインターフェースとはちょっと違っているみたいですねー。><
    (…使ったことないので実感がありませんが^^)

    PHPでは実装済みのinterfaceを多重に実装できない
    http://blog.xole.net/article.php?id=589
    http://blog.xole.net/article.php?id=597

    164 = :

    >>162
    こんなかんじのプログラムと似ているかもしれませんねー。

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

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

    165 = :

    OOPの参考になる解説がありました。

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

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

    166 = :

    >>161
    >wikiの文法(表記方法)が使える掲示板とか作れそう^^

    PEARのText_Wiki使えばよくね?

    167 = :

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

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

    168 = :

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

    169 = :

    とりあえず、全体構成の確認のために書いてみた。
    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;
    }
    }
    ?>

    173 = :

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

    174 = :

    http://tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt
    RandomNoteのMain.phpは参考になるでしょうか?

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

    175 = :

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

    176 = :

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

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

    177 = :

    htmlのformのコードもクラス化するのが本当の流れんだろうけれどな。
    いきなりそれをやると分かりにくくなるかな・・・

    178 = :

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

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

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

    179 = :

    >>160
    他の人の話のほうがよっぽど核心を突いてるよ

    180 = :

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

    181 = :

    ピュアな意味でオブジェクトを操作したいなら
    ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ

    <?php

    require_once("hiroyuki.class.php");

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

    182 :

    >>178
    ユーティリティクラスの再実装みたいな事を熱心にやっても
    あまり意味が無いと思いますよ。

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

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

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

    184 = :

    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 = :

    [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 = :

    [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 = :

    [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 = :

    [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 = :

    フレームワーク使えば?

    190 = :

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

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

    191 = :

    >>190
    自分で考えるのも良いが、君が今やっていることを
    やってしまっているのが、フレームワークだ。

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

    192 = :

    俺も初心者だからこれが最善とは言い切れないけど
    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 = :

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

    194 = :

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

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

    195 = :

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

    196 = :

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

    197 = :

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

    198 = :

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

    199 = :

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

    とりあえずはこのあたりに載ってるものの、「和モノ」あたりからかな。
    http://pc11.2ch.net/test/read.cgi/php/1197383840/3

    フレームワーク自体の自作の話もいくつかあるみたいだ。
    http://codezine.jp/a/article.aspx?aid=104

    200 = :

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


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / php一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : - cake + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について