博客列表 >MVC设计思想 注册树 单例模式 工厂模式——2018年5月9日作业

MVC设计思想 注册树 单例模式 工厂模式——2018年5月9日作业

白猫警长的博客
白猫警长的博客原创
2018年05月14日 11:42:47751浏览

单例模式 实例

<?php
/医院
 * 单例模式:一个类仅允许创建一个实例
 * 例如:
 * 1.一个站点仅连接一个数据库连接对象
 * 2.一个站点仅允许存在一个配置类的实例对象
 * 
 */
class Config
{
	/医院
	 * 必须先声明一个静态私有属性:用来保存当前类的实例
	 * 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享
	 * 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法
	 * 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化
	 */
	private static $instance = null;

	//保存用户的自定义配置
	private $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($index,$value)
	{
		$this->setting[$index] = $value;
	}

	//读取配置项
	public function get($index)
	{
		return $this->setting[$index];
	}
}

//实例化 Config 构造器被私有化,所以只能被实例化一次,
$obj1 = Config::getInstance();
$obj2 = Config::getInstance();
var_dump($obj1,$obj2);	//输出2个变量仅被执行一次
echo '<hr>';
$obj1->set('host','127.0.0.1');
echo $obj1->get('host');

单例模式效果图:

1.png



工厂模式 实例

<?php
/* 
 * 单例模式:用于创建单一类型的唯一实例对象
 * 工厂模式:用于创建多种类型的多个实例对象
 */

//声明形状类
class Shape
{
	public static function create($type,array $size=[])
	{
		//检测形状
		switch ($type) {
			//长方形
			case 'rectangle':
				return new Rectangle($size[0], $size[1]);
				break;
			//三角形
			case 'triangle':
				return new Triangle($size[0], $size[1]);
				break;
		}
	}
}

// 长方形
class Rectangle
{
	private $width;
	private $height;

	public function __construct($width, $height)
	{
		$this->width = $width;
		$this->height = $height;
	}

	public function area()
	{
		return $this->width * $this->height;
	}
}

//三角形
class Triangle
{
	private $width;
	private $height;

	public function __construct($width, $height)
	{
		$this->widht = $width;
		$this->height = $height;
	}

	public function area()
	{
		return ($this->widht * $this->height)/2;
	}
}

//使用静态方法来实例化形状类,而不是用传统的new 关键字
//并根据形状类型参数的不同,来实例化不同的类,生成不同的对象
$rectangle = Shape::create('rectangle',[10,30]);
echo '长方形的面积是:'.$rectangle->area();

echo '<hr>';

$triangle = Shape::create('triangle',[40,50]);
echo '三角形的面积是:'.$triangle->area();

运行实例 »


运行效果图:

2.png



注册树 实例

<?php
/* 
 * 注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的
 */
//先声明三个类,一会丢进对象树上中
class Demo1 {}
class Demo2 {}
class Demo3 {}

//声明对象注册树类
class Register
{
	//静态属性中保存着所有已经挂载到树上的对象
	public static $objs = [];

	//将对象挂载到树上
	public static function set($index, $obj)
	{
		self::$objs[$index] = $obj;
	}

	 //取出对象使用
	public static function get($index)
	{
		return self::$objs[$index];
	}

	//已经无效的对象,及时销毁,节省资源
	public static function del($index)
	{
		unset(self::$objs[$index]);
	}
}

//将三个类实例化后,并挂载到对象树上
Register::set('demo1',new Demo1);
Register::set('demo2',new Demo2);
Register::set('demo3',new Demo3);

//检测是否上树?
var_dump(Register::$objs);
echo '<hr>';
echo '<pre>'.print_r(Register::$objs,true).'</pre>';

echo '<hr>';

//用注册类的get方法查看
echo var_dump(Register::get('demo2'));


//删除对象池中的某个实例对象
Register::del('demo2');

//再次查看demo2对象,已经不能被查看了,因为被销毁了
var_dump(Register::get('demo2'));

运行实例 »


运行效果图:

3.png



MVC设计思想:

model.php文件:

model:模型类—实例

<?php 
/医院
 * 1.写一个Model:模型类
 * PDO这个类是全局的,不在这个命名空间下,所以需要在前面加反斜线\
 */
//命名空间 MVC文件夹下的model文件夹
namespace MVC\model
{
	//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);
		}

		//执行查询并获取结果集
		public function select($table, $num)	//从外部传入参数,
		{
			//创建预处理对象
			$stmt = $this->pdo->prepare("SELECT * FROM {$table} LIMIT :num;");

			//执行查询操作并获取结果集
			$stmt -> bindValue(':num', $num, \PDO::PARAM_INT);
			$stmt -> execute();

			//解析结果集
			$this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
			$result = $this->result;
			// print_r($result);
		}

	}
}


 ?>

运行实例 »



view.php文件

view:视图类 实例

<?php 
/医院
 * 2.再写一个view视图类
 * view视图类
 */
namespace MVC\view;
class View
{
	public $data = [];

	public function __construct($data)
	{
		$this->data = $data;
	}

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

	public function display($data)
	{
		$table = '
		<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		table, tr, td, th{border: 1px solid #666;}
		table{width:70%; border-collapse: collapse; text-align: center;margin: 50px auto;}
		table caption{margin-bottom: 20px; font-size: 24px; font-weight: bold;}
		th{ background-color: lightblue;}
		tr th,td{ padding: 5px;}
	</style>
</head>
<body>
	<table>
		<caption>用户管理表</caption>
		<tr>
			<th>排序ID</th>
			<th>用户名</th>
			<th>会员等级</th>
			<th>QQ账号</th>
			<th>账号余额</th>
			<th>注册时间</th>
			<th>操作</th>
		</tr>';

		foreach ($data as $nam) {
			$table .= '<tr>';
			$table .=  '<td>'.$nam['mana_id'].'</td>';
			$table .=  '<td>'.$nam['name'].'</td>';
			$table .=  '<td>'.$nam['class'].'</td>';
			$table .=  '<td>'.$nam['faqqq'].'</td>';
			$table .=  '<td>'.$nam['sum'].'</td>';
			$table .=  '<td>'.$nam['join_date'].'</td>';
			$table .=  '<td>'.$nam['operation'].'</td>';
			$table .= '</tr>';
		}
		 $table .= '</table>
</body>
</html>';
  		echo $table;
	}
}

运行实例 »



controller.php文件

controller:控制器 实例

<?php 
/医院
 * 3.再写一个controller控制器
 * 控制器
 */
namespace  mvc\controller;
class Controller 
{
	public function index()
	{
		//从模型中获取数据
		//model:模型类 控制器
		require './model/model.php';

		$model = new \MVC\model\Model('php','root','root');	//实例化
		$model->select('mana',12);
		$result = $model->result;

		//根据从模型中获取的数据的要求来渲染模板,格式化展示模型中的数据
		//view:视图类 控制器
		require './view/view.php';

		$view = new \MVC\view\View($result);	//获取给模板赋的值
		$data = $view->getData();	//获取模板的数据,将存储给变量$data
		$view->display($data);	//将$data模板数据显示出来,也叫模板渲染

	}
}

运行实例 »


index.php入口文件

index.php 入口文件 实例

<?php 
/医院
 * 入口文件
 */
//导入控制器类
require 'controller/Controller.php';
use mvc\controller\Controller;	//控制器取个别名
$controller = new Controller;	//实例化控制器

$controller->index();	
 ?>

运行实例 »


MVC结构图:

4.png


MVC 运行效果图:

0.png

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议