オブジェクト指向ライクにリファクタリング

フレームワーク使うのめんどくさい。
またはベタ書きしたプログラムをそのまんまにしてるって人用
このリファクタリングの目的はファイルの最初らへんを見ただけで、そのファイルが何をしているか大体把握できるようにすること。
つまり、具体的な処理は後回しにして必要なときだけ見ればいいようにしようって感じ。
※あくまでも見やすくするくらいのノリです

使うのはこのファイル

```php:test.php

<?php
//Smarty_Appファイルを読み込み
require_once '/var/www/html/smarty/Smarty_App.php';

//セッションスタート
session_start();
$_SESSION['id'] = "test";

//表示する文言を変数に入れる
$mongon = "こんにちは" . $_SESSION['id']  . "さん!\n";

//表示する
$smarty = new Smarty_App;
$smarty->assign('mongon', $mongon);
$smarty->display('test_smarty.tpl');

```

このくらいのプログラムならこのままでも問題ないと思いますが例として。

目指すのはこれ

```php:test.php

<?php
//Smarty_Appファイルを読み込み
require_once '/var/www/html/smarty/Smarty_App.php';

$ctrl = new test();
$ctrl->run();

class test{

        //テンプレに渡す変数
        var $mongon;

        function run(){
                //セッションスタート
                $this->sessionStart();

                //表示する文言を変数に入れる
                $this->defineMongon();

                //表示する
                $this->display();
        }

        //セッションを開始する関数
        function sessionStart(){
                session_start();
                $_SESSION['id'] = "test";
        }

        //表示する文言を指定する関数
        function defineMongon(){
                $this->mongon =" yahho" . $_SESSION['id']  . "さん!\n";
        }

        //文言をテンプレートに渡す(表示する)関数
        function display(){
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $this->mongon);
                $smarty->display('test_smarty.tpl');
        }
}

```

function run()の中身を見ればこのプログラムが
「セッションスタートしてテンプレに渡す変数に文言入れて、テンプレート表示してるんだな」
と、ざっくり理解できるかと思います。

では順を追ってやり方を説明を

①クラス化する

とりあえずクラス化してみます。
requireしてる下あたりからまるっとクラスで囲んで、中身の処理をfunction run()という関数にします。

```php

<?php
//Smarty_Appファイルを読み込み
require_once '/var/www/html/smarty/Smarty_App.php';

class test{
        function run(){
                //セッションスタート
                session_start();
                $_SESSION['id'] = "test";

                //表示する文言を変数に入れる
                $mongon = "こんにちは" . $_SESSION['id']  . "さん!\n";

                //表示する
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon);
                $smarty->display('test_smarty.tpl');
        }
}

```

これでとりあえずクラス化が完了しました。
クラス名は、とりあえずファイル名と統一しときます。
次にクラスのインスタンスを作ってrun()を呼び出してみます。

```php:test.php

<?php
//Smarty_Appファイルを読み込み
require_once '/var/www/html/smarty/Smarty_App.php';

//testクラスのインスタンスを作成
$ctrl = new test();
$ctrl->run();
exit;

class test{

        function run(){
                //セッションスタート
                session_start();
                $_SESSION['id'] = "test";

                //表示する文言を変数に入れる
                $mongon = "こんにちは" . $_SESSION['id']  . "さん!\n";

                //表示する
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon);
                $smarty->display('test_smarty.tpl');
        }
}

```

これでとりあえず

```php

<?php
//Smarty_Appファイルを読み込み
require_once '/var/www/html/smarty/Smarty_App.php';

//testクラスのインスタンスを作成
$ctrl = new test();
$ctrl->run();
exit;

```

ここまでを見ただけで、testクラスのインスタンスを作ってrun()を実行してることがわかるかと思います

②run()の中の処理を大まかに分ける

run()の中の処理を一言で表現できる程度に分けてみます。
例のプログラムだと以下の３つに分けれそうです。

1. セッションを開始する
2. 表示する文言を変数に入れる
3. 表示する

と、いうことでこの３つを関数にしてrun()の下に追加します。

```php

        //セッションを開始する関数
        function sessionStart(){
                session_start();
                $_SESSION['id'] = "test";
        }

        //表示する文言を定義する関数
        function defineMongon(){
                $mongon = "こんにちは" . $_SESSION['id']  . "さん!\n";
        }

        //文言をテンプレートに渡す(表示する)関数
        function desplay(){
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon);
                $smarty->display('test_smarty.tpl');
        }

```

追加したらrun()側ではその関数を呼び出すように変更します。

```php

        function run(){
                //セッションスタート
                $this->sessionStart();

                //表示する文言を変数に入れる
                $this->defineMongon();

                //表示する
                $this->display();
        }

```

大分run()の中身がすっきりしました。とりあえずこれで実行してみます。

```

PHP Notice:  Undefined variable: mongon in 実行ディレクトリ/refactering.php on line ...
```

なんか怒られました。
mongonが定義されていないっぽい。

```php

        //文言をテンプレートに渡す(表示する)関数
        function display(){
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon);　←こいつ
                $smarty->display('test_smarty.tpl');
        }

```

他の関数内で定義されているので怒られた模様。
次はこいつをなんとかしなくては

③共通変数を定義する
引数で渡してもいいですが、ここはクラス内共通変数として定義します。
共通変数にしたので$mongonと書いていたところを$this->mongonに変更します。

```php 

<?php
//Smarty_Appファイルを読み込み
require_once '/var/www/html/smarty/Smarty_App.php';

$ctrl = new test();
$ctrl->run();

class test{

        //テンプレに渡す変数を定義
        var $mongon;

        function run(){
                //セッションスタート
                $this->sessionStart();

                //表示する文言を変数に入れる
                $this->defineMongon();

                //表示する
                $this->display();
        }

        //セッションを開始する関数
        function sessionStart(){
                session_start();
                $_SESSION['id'] = "test";
        }

        //表示する文言を指定する関数
        function defineMongon(){
                //$this->mongonに変更
                $this->mongon =" yahho" . $_SESSION['id']  . "さん!\n";
        }

        //文言をテンプレートに渡す(表示する)関数
        function display(){
                $smarty = new Smarty_App;
                //$this->mongonに変更
                $smarty->assign('mongon', $this->mongon);
                $smarty->display('test_smarty.tpl');
        }
}

```

以上でリファクタリング終了。実際のところ100行超えるようなファイルだと試してみる価値あるかも。

終わり