Blogger Information
Blog 48
fans 0
comment 0
visits 40655
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0907-设计模式与MVC初步
3期-Shawn的博客
Original
730 people have browsed it

1.编程: 单例模式

0907zuoye1.png

实例

<?php 
//单例模式:一个类仅允许实例化一次
//
//1.一个站点仅需要创建一次数据库连接
//2.一个站点通常只需要一个配置类


class Config1 {}
// 下面我们来实例化
$obj1 = new Config1();
$obj2 = new Config1();
var_dump($obj1, $obj2);
echo '<br>';
var_dump($obj1 === $obj2);
echo '<hr>';


//创建一个实用的配置类:单例模式
class Config
{
	//为什么要用静态的?当前构造方法被私有化了,不能new了,另外clone通道也私有化了。因为静态属性属于类的,被所有类实例所共享。通过属性值来保存对象。
	//为什么要实例初始化为null?便于检测
	//
	private static $instance = null;//其实默认值也是null,可以省略不写

	//配置参数容器
	public $setting = [];

	//禁止从类的外部实例化对象
	private function __construct()
	{

	}

	//克隆方法也有私有化
	private function __clone()
	{

	}

	//外部仅允许通过一个公共静态方法来创建实例
	public static function getInstance()
	{
		//检测当前的类属性$instance是否已经保存了当前类的实例
		if (self::$instance == null)
		{
			self::$instance = new self();
		}
		return self::$instance;//如果已经存在当前类的实例,返回当前类的实例
	}

	//配置项的设置操作
	public function set()
	{
		//获取参数的数量
		$num = func_num_args();
		if ($num > 0)
		{
			switch ($num) 
			{
				case 1://如果只有1个参数,说明这一个数组
					$value = func_get_arg(0);//返回参数列表的第一项
					if (is_array($value))//is_array();检测变量是否是数组
					{
						$this->setting = array_merge($this->setting,$value);//array_merge() 函数把一个或多个数组合并为一个数组。
					}
					break;
				case 2://说明是逐个设置的
				     
				     $name = func_get_arg(0);//配置项的名称
				     $value = func_get_arg(1);//配置项的值
				     $this->setting[$name] = $value;
				     
				    break;
				
				default:
					echo '<span style="color:red">非法参数</span>';
			}
		}else
		{
			echo '<span style="color:red">没有参数</span>';
		}
	}


	//获取参数:当无参数的时候,默认获取全部参数
	public function get($name='')
	{
		if (empty($name))
		{
			return $this->setting;//获取所有参数
		}
		return $this->setting[$name];//获取一个参数
	}

}

$obj1 = Config::getInstance();
$obj2 = Config::getInstance();
var_dump($obj1, $obj2);
echo '<br>';
var_dump($obj1 === $obj2);
echo '<hr>';


//设置
$obj1->set('host','127.0.0.1');//这个叫做逐个传值,2个参数
echo $obj1->get('host');
echo '<hr>';

$config = ['host'=>'localhost','user'=>'root','pass'=>'root'];
$obj1->set($config);//数组传值,1个参数
print_r($obj1->get());

运行实例 »

点击 "运行实例" 按钮查看在线实例

2.编程: MVC的实现原理

0907zuoye2.png

实例

<?php
//模型类
namespace mvc1\model;
//实现两个功能:连接数据库和查询
class Model
{
    //连接数据库
    public $pdo = null;   
    public $result = []; 
    public function __construct($dbname,$user,$pass)
    {        
        $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname='.$dbname,$user,$pass);//PDO是全局空间下的类,所有前面要加上\否则有可能找不到它        
    }

    //查询
    public function select($table,$num)
    {
        $stmt = $this->pdo->prepare("SELECT `id`,`name`,`email` FROM {$table} LIMIT :num");
        $stmt->bindValue(':num',$num,\PDO::PARAM_INT);//bindValue 把一个值绑定到一个参数
        $stmt->execute();

        $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

<?php
//视图类
namespace mvc1\view;
//实现3个功能:模板赋值、获取数据和渲染模板
class View
{
    public $data = [];
    //模板赋值
    public function __construct($data)
    {
        $this->data = $data;
    }
    

     //获取数据
    public function getData()
    {
        return $this->data;
    }
    
    //渲染模板
    public function display($data)
    {
        $table = '<!doctype html>
        <head>
        <meta charset="UTF-8">
        <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">

        <style>
        table,th,td 
        {
            border: 1px solid black;
        }
        table 
        {
            border-collapse: collapse;  /*折叠表格线*/
            width: 600px;
            margin: 30px auto;
            text-align: center;
            padding: 5px;
        }

        table tr:first-child 
        {
            background-color: lightgreen;
        }
        table caption 
        {
            font-size: 1.5em;
            margin-bottom: 15px;
        }
        </style>
    <title>MVC简介</title>
    </head>
    <body>
        <table>
        <caption>用户信息表</caption>
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>邮箱</th>
        </tr>';
        foreach ($data as $user) 
        {
           $table .= '<tr>';
           $table .= '<td>'.$user['id'].'</td>';
           $table .= '<td>'.$user['name'].'</td>';
           $table .= '<td>'.$user['email'].'</td>';
           $table .= '</tr>';
        }
        $table .= '</table></body></html>';
        echo $table;

    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

<?php
//控制器类
namespace mvc1\controller;
use mvc1\model\Model;
use mvc1\view\View;

class Controller
{
  public function index()
  {
    require './model/Model.php';
    $model = new Model('edu','root','root');
    $model->select('user',6);
    $result = $model->result;

    require './view/View.php';
    $view = new View($result);
    $data = $view->getData();
    $view->display($data);
  }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

<?php
//首页、框架入口文件
require './controller/Controller.php';
use mvc1\controller\Controller;
$controller = new Controller;
$controller->index();

运行实例 »

点击 "运行实例" 按钮查看在线实例


3.问答: MVC的设计思想是什么?

MVC中的三个角色

M:Model,模型数据

V:View,视图(界面)

C:Control,控制中心

MVC是一种软件架构的思想,将一个软件按照模型、视图、控制器进行划分。其中,模型用来封装业务逻辑,视图用来实现表示逻辑,控制器用来协调模型与视图(视图要通过控制器来调用模型,模型返回的处理结果也要先交给控制器,由控制器来选择合适的视图来显示 处理结果)。

1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)

2)视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。

3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。



Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post