LoginSignup
4
4

More than 5 years have passed since last update.

PHP オブジェクトでMVC的な考えを実装してみる。

Posted at

MVCを利用したフレームワークの便利な所は人力で、プログラムの構成が理解しやすかったりする所ですが、オブジェクトを利用したプログラムにも同じようにMVC的なルールを取りいれたらどうだろうと思い、実装してみました。

それぞれ
- _Modelはモデルのみ(データのみ)
- _controlerはデータ処理のみ
- _viewは状況に応じてのアウトプットのみを担当させてみました。


Content.php

<?php


class Content_Model{

    protected $data;

    function __construct(){
        $this->data = array("アイテム1","アイテム2","アイテム3");
    }

}


class Content_Controler extends Content_Model{

    function get_count(){
        return count($this->data);
    }

    function get_list(){
        return $this->data;
    }

    function get_single($i){
        return $this->data[$i];
    }

}



class Content_View extends Content_Controler{

    function view($id1=0,$id2=0,$id3=0){

        switch ($id1) {

            case 0:

                echo "トップページ用 ";
                print_r($this->get_count());
                break;

            case 1: //

                echo "リストページ用 ";
                print_r($this->get_list());
                break;

            case 2; //

                echo "個別ページ用 ";
                print_r($this->get_single($id2));
                break;


            case 3: //

                echo "認証ページ等 ";

                if($id3==1){
                echo "○ ログイン中";
                }else{
                echo "X ログインしてね";
                }

                break;

        }

    }

}




//ページ用
$page = array("top"=>"0","list"=>"1","single"=>"2","ninsyou"=>"3");



$content = new Content_View();



//トップページの場合
$content->view($page['top']);
echo "<hr><br>".PHP_EOL;

//リストページの場合
$content->view($page['list']);
echo "<hr><br>".PHP_EOL;

//個別ページの場合
$content->view($page['single'],2);
echo "<hr><br>".PHP_EOL;


//認証ページの場合 ログインしてない
$content->view($page['ninsyou'],2,0);
echo "<hr><br>".PHP_EOL;

//認証ページの場合 ログインしてる
$content->view($page['ninsyou'],2,1);
echo "<hr><br>".PHP_EOL;


paiza.io でのサンプル


効率のいいプログラムにはならないですが、自分ルールの中でもわかりやすくプログラムが組めそうな感じです。

補足として

参照
https://ja.wikipedia.org/wiki/Model_View_Controller

上記のMVCのパターンを考えれば、コントローラーが出力用にデータを成型してるだけなので、入力処理の部分を別途classで実装(セキュリティも加味する)した方が、整理できてわかりやすいかもしれませんね。
後日、そのパターンも考えてみます。

Content_Controlerを
- Content_Input_Controler
- Content_Output_Controler
- に分けて継承してしまうとかですかね。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4