sample

動作サンプル

まず動かしてそれから覚える。これがDOLEM流の覚え方です。
ということでここでは様々な形のサンプルを用意していきます。
簡単なものから難しいものまで色々と用意していくつもりですので自分のLvにあったものや、やりたいものに即したものを適当に試していってみて下さい。
サンプル毎に「ここだけは覚えて帰ってもらいたい」ポイント解説もつけています。
参考までに大まかなLvもつけておきました。

Lv2.フォームを使ったPostデータのやり取り

PostClassの基本的な動きを理解するためのものです。
入力フォームを使ったPostデータのサンプルです。
用意するファイルは2つです。

区分:model

dolem/core/model/user/sample/post.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        post.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2012/12/24        xirasaya        1.00        create new
  15. //****************************************************************************** 
  16. @loglog(basename(__FILE__));
  17. ############################################################60
  18. ## execute...
  19. ############################################################
  20. #
  21. $template = new template();
  22. #
  23. ############################################################60
  24. class template extends BaseModel {
  25.     
  26.     function init() {
  27.         return true;
  28.     }// end function
  29.     function main() {
  30.         //========================================40
  31.         // prepare
  32.         //========================================
  33.         $PostClass = PostClass::newInstance();
  34.         
  35.         //----------------------------------------40
  36.         // main
  37.         //----------------------------------------
  38.         $this->set('res', $PostClass->get('txt_1'));
  39.         
  40.         return true;
  41.     }// end function
  42.     function disp() {
  43.         
  44.         $layout = VIEW_DIR_PATH. '/'.general('c').'/sample/post.php';
  45.         include($layout);
  46.         return true;
  47.     }// end function
  48. }// end class
  49. ?>

区分:view

dolem/core/view/user/sample/post.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        post.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2012/12/24        xirasaya        1.00        create new
  15. //******************************************************************************
  16. ?>
  17. <html>
  18. <body>
  19.     <div>入力フォーム</div>
  20.     <form action="<?=HTTP_BASE_URL?>/?m=sample/post" method="post">
  21.         <input type="text" name="txt_1" value="" maxlength="10" /><br />
  22.         <input type="submit" name="btn_submit" value="submit" /><br />
  23.     </form>
  24.     
  25.     <div>結果</div>
  26.     <div><?=$this->get_h('res')?></div>
  27. </body>
  28. </html>

アクセスURLは、
http://{{ホスト名}}/?m=sample/post
となります。

動作検証


解説

まずmodelファイルのmain()を見て下さい。
図1を見て下さい。今回はPostClass::newInstance()というものが出てきます。

図1

これはどういうものでしょうか。

まずPHPの基本的な機能のおさらいをしましょう。
PHPでは$_POSTというスーパーグローバル変数なるものがあり、これを利用すればユーザが入力フォームで入力した値をプログラム内で取り出すことができます。
例えばある入力フォームに'txt_1'という名前がついたtextareaがあったとします。
そのフォームからサブミットされた値は、プログラム側で$_POST['txt_1']と書くことでその値を取り出すことができるのです。
これはPHPの基本的な機能です。

この$_POSTをそのまま使うのももちろんアリなのですが、スーパーグローバル変数はいうなれば大事な元データです。
元データを直接いじってしまう形をとると、何かあったときに取り返しがつきません。
そこで予め元データをコピーしておき、そのコピーした方の値を使っていこう、という考えになるです。
これならば元の値に戻したい時にいつでも戻すことができるようになります。

PostClass::newInstance()で生成された$PostClassオブジェクトを利用すればこれらを手軽に実装することができます。
このためDOLEMではスーパーグローバル変数である$_POSTを使うことは一切ありません
もちろんこれは$_POSTを使ってはいけないというわけではありません。
単に$PostClassの方が仕事がよくできるというだけです。


さてPostClass::newInstance()の説明をする前にもう一つ、オブジェクト指向というものについて学ばなければなりません。
実のところをいうと、この言葉の定義を知らないままオブジェクト指向の組み方をしている人は世の中に山ほどいます。
しかしどういうものかをはっきりと答えれる人は決して多くはありません。
そうならないためにもここできちんと覚えて帰ってください。

オブジェクト指向についてわかってるしそんな説明いらねーやって人は読み飛ばして下さい。


■オブジェクト指向とは
オブジェクト指向というのは究極的に言うと「利用できるものは何度も利用してやろう!」という考え方です。
データをひとまとまりの単位として管理し、プログラムの論理的な構造化を図るプログラミング技法うんぬん
…なんてどーでもいいです。
あれ、ちょっと言い過ぎですかね?

まずはオブジェクト指向を理解するにあたってよく耳にする二つの単語について知る必要があります。
二つの単語とはオブジェクトインスタンスというものです。
これはそれぞれどういうものでしょうか。
ちょっとイメージしやすいように具体例を出してみましょう。

ここに自動車の設計図があります。この設計図を元に車をつくるとしましょう。
設計図を見ながらみごと車を作ることができました。

図:完成した車

自動車の設計図を元に作り出すということ、この具現化のことをインスタンス(あるいはインスタンス化)と呼びます。
そうして出来上がった実体をオブジェクトと呼びます。
オブジェクトとインスタンスはよく混同して語られることが多いですが明確にこのような違いがあります。

ちなみに設計図のことをクラスと呼びます。
上記の流れをまとめると、クラスを元にインスタンスを行いオブジェクトが出来上がる、ということです。
オブジェクトはクラスから作られるわけです。


さてこうして出来上がった車オブジェクトですが、車オブジェクトに限らず全てのオブジェクトに共通して言えることが一つあります。
それは、必ずそのオブジェクトがやらねばならない重要な仕事がたった1つだけあるいうことです。
言い方を変えると、その仕事をやるがゆえにそのオブジェクトが存在するわけで、まあそれこそがオブジェクトの存在理由というところでしょうか。
この辺は人間も同じことが言えますね。アイデンティティ(自己が自己たるゆえん)みたいな。
その仕事が必要なければそのオブジェクトも必要ないわけで。

仕事をしないオブジェクトなんかゴミです。
与えられた仕事が明確でないオブジェクトなんか論外です。
もっとも、クラスからオブジェクトはできるわけですから、この場合そんなクラスを作った「側」に大きな問題があります。
人間で言えば神でしょうか。うーん、親かな?
良いクラスからしか良いオブジェクトはできません。この過程で突然変異なんかないのです。

おっと話が逸れた。

例えば車オブジェクトでいうと一番重要な仕事は「移動する」ということです。
それが車オブジェクトに求められている仕事であり車オブジェクトが作られた目的です。
この目的を履き違えてはいけません。
目的を履き違えると何事も迷走します。

車オブジェクトに備わっている様々な機能はこの目的を達成するための「サポート機能」でしかないのです。
はい、言い切ります。

例えば運転を楽しくするための音楽を流す機能であったり、外が暗くなって視界が悪くなったらライトをつける、
雨が降ってきたらワイパーを動かすなどなど。
これらは全て車オブジェクトの仕事をサポートするための機能でしかありません。

運転する、ということすらサポート機能です。
もう一度いいます。

オブジェクトに与えられた仕事(オブジェクトが存在する理由、オブジェクトが作られた目的)を履き違えてはいけません。

-- オブジェクト指向の説明ここまで --


さてPostClass::newInstance()に話を元に戻しましょう。
先ほどの例に習って言えばPostClassという設計図(クラス)をインスタンス化してオブジェクトを生成しているということになります。
そして生成されたオブジェクトを$PostClassというものに入れています。
これで$PostClassはオブジェクトと呼べます。
'$'(ドル)がついたらオブジェクト、つかなかったらクラスと覚えればよいです。
補足:DOLEMではわざとオブジェクト変数の名前とクラス名を同じにしています。
こうすることによって自分だけでなく後から見た人も何のクラスなのかということが一目でわかります。
変数には別の名前をつけることも可能ですが推奨していません。

さて、PostClass::newInstance()から作成された$PostClassオブジェクトは$_POSTと同じ仕事ができます。
$_POSTの上位互換だと思って下さい。

$PostClassは自身の仕事をサポートするために様々な機能を備えています。
その一つは先述した$_POSTのコピーを使うというものです。
$PostClassオブジェクトは生成されたタイミングでその内部に$_POSTのコピーを作っています。
$PostClassを使って呼び出される値は、全てこのコピーされたものの方を使います。
これは$PostClassを使って代入する値も同様です。
元データである$_POSTには一切影響がありません。

値の取得の仕方は$PostClass->get({任意のキー})となります。
例えば入力フォームの'txt_1'という名前がついたtextareaから送られた値を取得したい場合は$PostClass->get('txt_1')と書きます。
これは$_POST['txt_1']と指定した時と同じ結果を返します。

値の代入もできます。
$PostClass->set({任意のキー}, {任意の値})です。
こちらは$PostClass->get({任意のキー})で取得できる値を上書きすることとなります。

また$PostClassオブジェクトはスコープを超えて値を引き継ぐことができます。
init()内でPostClass::newInstance()を使って生成した$PostClassオブジェクトと、main()内でPostClass::newInstance()を使って生成した$PostClassオブジェクトは同じものということです。
init()内で$PostClass->set('txt_1', 1)とした場合、main()側では$PostClass->get('txt_1')とした結果は1が返ってきます。

具体例
function init() {
  $PostClass = PostClass::newInstance();
  $PostClass->set('txt_1', 1);  // 1を代入

  return true;
}// end function

function main() {
  $PostClass = PostClass::newInstance();
  echo $PostClass->get('txt_1');  // 1が返る

  return true;
}// end function

画面遷移時にもデータを持ち回すことができますが、まあこちらについてはまた別のところで解説しましょう。


次にviewファイルを見ていきます。
まずは下の図2を見て下さい。

図2

至って簡単なHTMLですがformタグにまたPHPショートタグが利用してあります。
この定数HTTP_BASE_URLを覚えている人はいるでしょうか。
初めてDOLEMを動かすときに触ったconfig.phpで設定したあの定数です。
つまりこのPHPショートタグの部分は自分の環境にあった基本URLに動的に置き換わります。

図3に至っては以前と同じ使い方ですが少し変化があることに気がついたでしょうか。

図3

そう、$this->get('res')ではなく$this->get_h('res')になっています。
この_h付きはどういうものかというとhtmlspecialchars($this->get('res'))と書いているのと同じです。
つまり単純に$this->get()で値を取り出したあとにHTMLサニタイズ(※)をしているだけのものです。
※HTMLサニタイズについては説明しません。

htmlspecialchars()はPHP関数の一つですが、単語が非常に長いので打ち間違えたりして意外と手間だったりします。
ならば値の取得と同時に一度でやってしまおうと、こういうわけですね。



まとめ

  • DOLEMではスーパーグローバル変数の$_POSTを使うことがない。
  • 代わりにPostClass::newInstance()から生成された$PostClassオブジェクトを利用する。
  • PostClass::newInstance()はオブジェクト指向である。
  • 値の取得には$PostClass->get({任意のキー})で$_POST[{任意のキー}]と同じ結果を得ることができる。
  • 値の代入には$PostClass->set({任意のキー}, {任意の値})で値を上書きすることができる。
  • $this->get_h()は、$this->get()にhtmlspecialchars()を加えたのと同じ動作結果を返す。


[top]