登录  /  注册
博主信息
博文 48
粉丝 0
评论 0
访问量 39019
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
0907-设计模式与MVC初步
3期-Shawn的博客
原创
697人浏览过

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)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。



批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学