php源码建博客4,php源码建博客3

主要:

主要:

myPHP框架

myPHP框架

  1. 常量优化路径
  2. 电动加载类
  3. 优化进口文件
  4. 有惊无险访问项目目录
  1. 模型单例工厂
  2. 目录结构优化
  3. 分别平台(前台,后台….)

      采取的是MVC
思想,应用纯面向对象及项目纯粹入口,完成的一个自定义的框架。(自己感兴趣的勤学苦练)

      采取的是MVC
思想,应用纯面向对象及项目纯粹入口,已毕的一个自定义的框架。(自己感兴趣的磨练)



一、项目纯粹入口

一、项目纯粹入口

--------------文件结构:--------------------------------------
blog
├─App
│  ├─Model 模型
│  │  └─UserModel.class.php 用户模型类    
│  ├─View 视图
│  │  ├─Back后台
│  │  │  └─Index
│  │  │          └─index.html  后台首页面
│  │  └─Home前台
│  │      └─User 用户视图目录
│  │             └─login.html  登录表单页面
│  ├─Controller 控制器
│  │  ├─Back后台
│  │  │  └─IndexController.class.php 后台首页控制器
│  │  └─Home前台
│  │      └─UserController.class.php 用户控制器
├─Public   静态公共文件(js,css,images)
│  ├─Plugins 插件
│  │  └─layui 前端框架插件
│  ├─Back后台
│  │    ├─js/   js文件
│  │    ├─css/  css样式文件
│  │    └─image img图片 
│  └─Home前台
│      ├─js/   js文件
│      ├─css/  css样式文件
│      └─image img图片 
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   ├─FactoryModel.class.php  模型工厂类
│   ├─Init.class.php  初始化应用类
│   └─MySQLDB.class.php 数据库操作工具类
└─index.php  入口文件
-----------------------------------------------------------------
--------------文件结构:--------------------------------------
blog
├─App
│  ├─Model 模型
│  │  └─UserModel.class.php 用户模型类    
│  ├─View 视图
│  │  ├─Back后台
│  │  │  └─Index
│  │  │          └─index.html  后台首页面
│  │  └─Home前台
│  │      └─User 用户视图目录
│  │             └─login.html  登录表单页面
│  ├─Controller 控制器
│  │  ├─Back后台
│  │  │  └─IndexController.class.php 后台首页控制器
│  │  └─Home前台
│  │      └─UserController.class.php 用户控制器
├─Public   静态公共文件(js,css,images)
│  ├─Plugins 插件
│  │  └─layui 前端框架插件
│  ├─Back后台
│  │    ├─js/   js文件
│  │    ├─css/  css样式文件
│  │    └─image img图片 
│  └─Home前台
│      ├─js/   js文件
│      ├─css/  css样式文件
│      └─image img图片 
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   ├─FactoryModel.class.php  模型工厂类
│   └─MySQLDB.class.php 数据库操作工具类
└─index.php  入口文件
----------------------------------------------------------------

进口文件

myphp\index.php前台

     
一个网站有着的请求都呼吁一个文书(入口文件)index.php\admin.php。入口很粗略,用于定义一个访问的权力,引入伊始化文件。

入口文件

myphp\index.php前台

     
一个网站有着的请求都呼吁一个文本(入口文件)index.php\admin.php。入口很粗略,用于定义一个走访的权位,引入开头化文件。



开始化文件

      字符集

      路径

      配置文件

      自动加载

      系统错误display_errors=’on’      error_reporting =E_ALL

     
主要用来落到实处字符集的设置、路径常量的配置、配置文件、系统错误等,分析URL中的模块或行为,之后自动分发模块与作为(本质就是实例化对象,并调用对象的主意)。Application

 

先河化文件

      字符集

      路径

      配置文件

      自动加载

      系统错误display_errors=’on’      error_reporting =E_ALL

     
主要用以落到实处字符集的设置、路径常量的配置、配置文件、系统错误等,分析URL中的模块或行为,之后自动分发模块与表现(本质就是实例化对象,并调用对象的艺术)。Application

 

php源码建博客4,php源码建博客3。上一篇中,提议4个问题待化解,本篇集中化解那4个问题,最后形成一体化的微型MVC框架结构,
后续博客项目,或其他项目,均可以一直采纳该框架结构举行开发学习。

 下载查看该品种源码:

控制器C

     
首要基于用户的央浼完毕业务逻辑处理。调用模型(M),接收数据,并调用视图类来拍卖多少,回显数据给用户。

控制器C

     
首要基于用户的呼吁完结工作逻辑处理。调用模型(M),接收数据,并调用视图类来拍卖多少,回显数据给用户。

下载查看该项目源码:

模型单例工厂

预备: 创设分支

1 $ git checkout master
2 $ git checkout -b "folder-model-app"

说明:

  1)程序中3行 。。。 表示省略的代码。之前方或源码中可查阅

  2) 【XXX/XXX】表示项目文件相对路径

模型M

     
一个模子对应数据表,模型在代码中突显是一个类。类中的方法就是按照用户的事务请求完毕的对数据表的操作SQL语句(用户的伸手最后在模型中的展现是一条SQL)。

      SQL语句的推行由DB类(本框架中利用的是自已打包的PDO类)来举行。

模型M

     
一个模子对应数据表,模型在代码中反映是一个类。类中的方法就是依照用户的作业请求已毕的对数据表的操作SQL语句(用户的央求最后在模型中的展现是一条SQL)。

      SQL语句的举办由DB类(本框架中动用的是自已打包的PDO类)来执行。

常量优化路径

准备: 创设分支

1 $ git checkout master
2 $ git checkout -b "MVC"

  思路:

  问题:
项目中模型操作数据表,一个动作可能就要操作四遍数据库,三次呼吁多少个动作,每个动作都须要去实例化对应模型

  解决想法: 创制一个模型类单例工厂
       完毕: 成立单例的模型类  FactoryModel.class.php
          属性$model=array(); 存储模型类实例
          方法: M($cmodelName, array $conf=null) 实例化模型类
      使用: 控制器中动用模型类实例:$model=FactoryModel::M(‘模型名称’)

视图V

      紧要用来落到实处将数据体现在HTML页面中。

友好画的图:

澳门葡京备用网址 1

MVC的优势:各司其职,互不烦扰,有利于开发中的分工;

                 有利于代码的录用;

                 市场上主流的框架基本都满意MVC的沉思。

视图V

      主要用来落实将数据显示在HTML页面中。

温馨画的图:

澳门葡京备用网址 2

MVC的优势:各司其职,互不困扰,有利于开发中的分工;

                 有利于代码的选择;

                 市场上主流的框架基本都满意MVC的沉思。

  思路

  1)把常用的目录路径定义成常量。如 模型目录,控制器目录等
     2)引入类应用定义的常量替代部分路线。 如 include
FRAME.BaseModel.class.php
       3) 载入视图使用常量替代部分路线 如 include VIEW.’login.html’
简单款式

  代码达成

1) 创立模型单例工厂 【Frame/FactoryModel.class.php】

 1 <?php
 2 /**
 3  * 单例模型工厂类
 4  * User: young
 5  */
 6 
 7 class FactoryModel
 8 {
 9     protected static $model = array(); //存储模型类实例
10 
11     /**
12      * 构造方法
13      */
14     protected function  __construct()
15     {
16     }
17 
18     /*
19      * 传递一个模型类的类名,就返回该类的一个单例实例对象
20     *@param string $modelName  模型类的类名
21     *@param array  $conf  数据库配置信息
22     *@return object 传入模型类的实例(单例)
23     */
24     public static function M($modelName, array $conf=null)
25     {
26         $modelName = $modelName.'Model';
27         if(empty(static::$model[$modelName]) || !(static::$model[$modelName] instanceof $modelName)){
28             static::$model[$modelName] = new $modelName($conf);
29         }
30         return static::$model[$modelName];
31     }
32 }

2) 引入该类文件 【index.php】

澳门葡京备用网址 3澳门葡京备用网址 4

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 require_once 'Frame/Db.class.php';  //数据库操作类
 6 require_once 'Frame/BaseModel.class.php';  //基础模型类
 7 require_once('Model/UserModel.class.php');
 8 
 9 require_once 'Frame/FactoryModel.class.php';//模型工厂类
10 。。。
11 。。。
12 。。。

进口文件引入工厂模型类

3) 应用: 控制器中选取,如用户控制器UserController中
登录操作【Controller/UserController.class.php】

 1  <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     。。。
 8     。。。
 9     。。。
10 
11     /**
12      * 登录操作: 校验登录信息
13      */
14     public function dlogin()
15     {
16         //接收登录信息
17         $data = array();
18         $data['username'] = trim($_POST['username']);
19         $data['pwd'] = trim($_POST['pwd']);
20 
21         //实例化模型,调用模型方法
22         //$model = new UserModel();
23         //$result = $model->checkLoginInfo($data);
24         //替换上面两行
25         $result = FactoryModel::M('User')->checkLoginInfo($data);
26 
27         //跳转提示
28         if($result){
29             $this->msg('登录成功!', '?a=index',3);
30         } else {
31             $this->msg('用户名或密码不正确!!');
32         }
33     }
34 }

4) 测试程序运行, 
登录测试结果与眼前一致。暂时先提交代码

1 git add -A
2 git commit -m "完成模型工厂类"

二、搭建框架myPHP

      在一个网站中会用恒河沙数文书,合理的做法,是利用目录
分门别类的进行存放。

二、搭建框架myPHP

      在一个网站中会用见怪不怪文书,合理的做法,是应用目录
分门别类的进展存放。

  代码达成

 1)操作步骤

澳门葡京备用网址 5澳门葡京备用网址 6

step 1: 在入口文件中定义所需要的常量

step 2: 控制器中引入视图时, 使用常量进行优化 

操作步骤思路

  2) 入口文件中定义常用路径常量 【index.php】

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
 8 
 9 define('PLAT', $p);  //平台常量
10 define('CTR', $c);  //控制器
11 define('ACTION', $a); //动作
12 
13 
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS);  //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21 
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26 
27 $ctr = $c."Controller";
28 
29 require_once FRAME.'Db.class.php';  //数据库操作类
30 require_once FRAME.'BaseModel.class.php';  //基础模型类
31 require_once MODEL.'UserModel.class.php';  //用户模型类
32 require_once FRAME.'FactoryModel.class.php';//模型工厂类
33 require_once FRAME.'BaseController.class.php'; //基础控制器类
34 require_once CTRONLLER.$ctr.'.class.php';
35 
36 
37 //实例化控制器
38 $userCtr = new $ctr();
39 
40 $userCtr -> $a();

2) 常量的选用:

  后台首页控制器【App/Controller/Admin/IndexController.class.php】

澳门葡京备用网址 7澳门葡京备用网址 8

 1 <?php
 2 /**
 3  * IndexController控制器类
 4  * 后台相关操作
 5  * User: young
 6  */
 7 
 8 class IndexController extends BaseController
 9 {
10     //展示后台首页
11     public function index()
12     {
13         include VIEW.'index.html';
14     }
15 }

后台首页控制器引入视图路径修改

  用户控制器
登录视图引入路径【App/Controller/Home/UserController.class.php】

澳门葡京备用网址 9澳门葡京备用网址 10

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     /**
 8      * 展示登录界面
 9      * @access public
10      */
11     public function login()
12     {
13         include VIEW."login.html";
14     }
15 。。。
16 。。。
17 。。。

用户控制器登录视图引入路径

3)提交代码

$  git add -A
$  git commit -m "常量使用"

目录结构优化

1、目录结构:

对此一个网站有前台部分与后台部分,有三种完成方案:

      1、双主机(四个域名),前台与后台各对应一个域名。安全

      2、前后台共用一个主机。方便(首先方案)

 

X:\据悉你协调搭的环境的门道\myphp                     网站根目录

X:\根据你协调搭的条件的路径\myphp\Admin       网站后台主目录

 那里所创的文件夹:

澳门葡京备用网址 11

 

1、目录结构:

对此一个网站有前台部分与后台部分,有二种完结方案:

      1、双主机(三个域名),前台与后台各对应一个域名。安全

      2、前后台共用一个主机。方便(首先方案)

 

X:\根据你自己搭的条件的路径\myphp                     网站根目录

X:\按照你自己搭的条件的路子\myphp\Admin       网站后台主目录

 那里所创的文书夹:

澳门葡京备用网址 12

 

电动加载类

   思路

 多个平台(模块):前后,后台
        MVC结构分平台
            C:  Controllers/Home      Controllers/Admin  …..
            V:  Views/Home                Views/Admin  …..
            M:   操作数据表一般模块共用
        公共资源目录Public: Public/Home  Public/Admin  …..
     目录结构转变,所有载入类,视图的路线做相应变化 

2、制造主机

在httpd-vhosts.conf配置文件配置

 澳门葡京备用网址 13

2、创造主机

在httpd-vhosts.conf配置文件配置

 澳门葡京备用网址 14

   思路

  问题: 入口文件中一度require_once
引入6个类,既充实一个索要引入一个,简单遗漏,重复和失误。

  解决方法:自动加载类文件

     形式1: 使用机关加载类函数__autoload()可以达成机关加载
          格局2: 实际项目中,多少人支付,按照实用性,越多的是应用
sql_autoload_register()注册函数自动加载

  根据目录的表征完毕机关加载
          Model类文件特点,以Model结尾的类名  substr($className,-5)
          Controller文件特点: 以Controller结尾的类名,
substr($class,-10)

    公共类:
类名没有统一样式,可以将Fame下的公共类放入到数组中,然后判断类是不是在数组中,
从而自动加载该目录下的类公事

  代码完毕

1)操作步骤

澳门葡京备用网址 15澳门葡京备用网址 16

1)目录构建: 
step 1: 根目录下创建目录App, 将Model目录,View目录,Controller目录放大App目录下
 既根目录只有: App/ Public/ Frame/  index.php

step 2: 在Controller目录中,创建Back目录和Home目录。将UserController控制器类文件放入Home目录中

step 3: 在View目录中,创建Back目录和Home目录。将login.html文件放入Home目录中

step 4: 在Public目录中,创建Back目录,Home目录,Plugins目录。将js,images,css目录放入Home目录中,公共插件放入对应的Plugins目录中

2)文件引入修改:
step 5: index.php入口文件对UserCotroller类的引入路径修改

step 6:UserController类中对视图login.html的include路径的修改

step 7: 视图login.html中对css和js路径的引入

操作步骤思路

2) 具体代码修改操作

  入口文件引入类路径修改【index.php】
紧假使用户模型类和用户控制器类路径引入修改

澳门葡京备用网址 17澳门葡京备用网址 18

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 require_once 'Frame/Db.class.php';  //数据库操作类
 6 require_once 'Frame/BaseModel.class.php';  //基础模型类
 7 require_once 'App/Model/UserModel.class.php';
 8 
 9 require_once 'Frame/FactoryModel.class.php';//模型工厂类
10 
11 require_once 'Frame/BaseController.class.php';  //基础控制器类
12 require_once 'App/Controller/Home/UserController.class.php';
13 
14 //实例化控制器
15 $userCtr = new UserController();
16 
17 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';
18 
19 $userCtr -> $a();

进口文件引入类的修改

  用户控制器类对登录表单视图路径引入的改动
【App/Controller/Home/UserController.class.php】

澳门葡京备用网址 19澳门葡京备用网址 20

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     /**
 8      * 展示登录界面
 9      * @access public
10      */
11     public function login()
12     {
13         include "App/View/Home/User/login.html";
14     }
15 。。。
16 。。。
17 。。。

用户控制器显示登录界面修改

  登录表单视图 【App/View/Home/User/login.html】 对静态资源路径的修改

澳门葡京备用网址 21澳门葡京备用网址 22

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>登录</title>
 6     <link rel="stylesheet" type="text/css" href="public/plugins/layui/css/layui.css">
 7     <link rel="stylesheet" type="text/css" href="public/Home/css/style.css">
 8 </head>
 9 。。。
10 。。。
11 。。。
12 <script type="text/javascript" src="public/plugins/layui/layui.js"></script>
13 <script>
14     layui.use('form', function(){
15         var form = layui.form;
16     });
17 </script>
18 </body>
19 </html>

登录表单视图

3、入口文件

在/myphp/下创建index.php文件

澳门葡京备用网址 23

澳门葡京备用网址 24

 

说明:

     
在输入文件定义ACCESS常量,在将来的持有的PHP文件中判断此常量,借使有,则象征合法访问,假如没有,则代表非法访问

     
由于引入的Application.class.php文件中运用命名空间,所以在访问Application类时索要利用非限定访问。Core\Application::run();

拓展:

      另一种达成项目纯粹入口的方案是运用Apache的rewrite机制。

3、入口文件

在/myphp/下创建index.php文件

澳门葡京备用网址 25

澳门葡京备用网址 26

 

说明:

     
在输入文件定义ACCESS常量,在后头的装有的PHP文件中判断此常量,要是有,则象征合法访问,如果没有,则代表不合规访问

     
由于引入的Application.class.php文件中选用命名空间,所以在访问Application类时要求动用非限定访问。Core\Application::run();

拓展:

      另一种完毕项目纯粹入口的方案是行使Apache的rewrite机制。

  代码已毕

   1) 入口文件落到实处类的机关加载

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
 8 
 9 define('PLAT', $p);  //平台常量
10 define('CTR', $c);  //控制器
11 define('ACTION', $a); //动作
12 
13 
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS);  //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21 
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26 
27 $ctr = $c."Controller";
28 
29 spl_autoload_register('autoload'); //注册自动加载函数
30 //自动加载类
31 /**
32  * 实自动加载类文件
33  * @param  string $className 类名
34  */
35 function autoload($className)
36 {
37     $upperClassName = strtoupper($className);
38     $frame = array('BaseController','BaseModel','Db','FactoryModel');
39     if(in_array($className, $frame)) {  //加载公共Frame目录中的类文件
40         require_once FRAME."$className.class.php";
41     } elseif(substr($upperClassName, -5) == 'MODEL'){  //加载模型Model目录中的类文件
42         require_once MODEL."$className.class.php";
43     } elseif(substr($upperClassName, -10) == 'CONTROLLER'){  //加载控制器目录中的类文件
44         require_once CTRONLLER."$className.class.php";
45     }
46 }
47 
48 //实例化控制器
49 $userCtr = new $ctr();
50 $userCtr -> $a();

2) 提交代码

1 $  git add -A
2 $  git commit -m "自动加载类完成"

  效果及提交代码

 澳门葡京备用网址 27交由保存代码

1 git add -A
2 git commit -m "目录结构优化"

4、伊始化文件

a、在core目录创制Application.class.php文件

澳门葡京备用网址 , 澳门葡京备用网址 28

先进行测试是还是不是可以访问;注意:在底下我不会截图到class名那里,所有的办法都是在类内的。

b、在Application类中开创setChar方法来已毕字符集的安装

 澳门葡京备用网址 29

在写入一个私家的静态方法后需求在作为纯粹出口的国有静态方法访问使其收效:注意:在底下我不会再多截图其余办法的纯粹出口,都在那个中。

澳门葡京备用网址 30

c、设置系统错误处理格局

 澳门葡京备用网址 31

诚如在做开发的时候,为防止用户观望错误消息,而产出的不友善界面,故一般性会在php.ini的陈设文件display_errors=off;关闭

d、定义目录常量

     
由于php文件中会频仍的引入文件,被引入的文件存放在目录内,为了统一管理,方便维护,将引得的相对路径,设置为目录常量

(echo,var_dump是进展一些调式,查看你想要的音信是还是不是正确)

澳门葡京备用网址 32

e、引入配置文件

      配置文件中的配置的新闻一般是网站中恐怕会转移,但很少更改的音信

创设布局文件myphp/config/config.php

 澳门葡京备用网址 33

 

说明:

      php文件中的return是将数据重回文件包罗语句处(include、require)

 澳门葡京备用网址 34

总结:

      全局变量          只在大局

      局部变量          只在概念的函数内

      类属性             可以跨方法应用

      全局常量          可以跨类使用

      $_SESSION      能够跨脚本利用

     

f、自动加载

      __autoload();                     由PHP自动加载机制调用的

      spl_autoload_register();       
由PHP为大家提供的可以向机动加载机制中添加四个类似于__autoload()的函数。

澳门葡京备用网址 35

调剂要在单入口举办测试:

澳门葡京备用网址 36

澳门葡京备用网址 37

其他文件夹的机动加载:一般只加载有类文件的文本夹

澳门葡京备用网址 38

澳门葡京备用网址 39

 注册指定函数作为机关加载函数:

澳门葡京备用网址 40

说明

所有loadCore、loadController、loadModel等,都被autoLoad调用,

autoLoad又在run方法中被调用

不无的类的实例化及类的艺术的移位是在index.php中

4、早先化文件

a、在core目录成立Application.class.php文件

 澳门葡京备用网址 41

先举办测试是或不是足以访问;注意:在底下我不会截图到class名那里,所有的法门都是在类内的。

b、在Application类中创制setChar方法来达成字符集的安装

 澳门葡京备用网址 42

在写入一个私家的静态方法后需求在作为单一出口的公有静态方法访问使其收效:注意:在上面我不会再多截图其他措施的纯净出口,都在这中间。

澳门葡京备用网址 43

c、设置系统错误处理形式

 澳门葡京备用网址 44

相似在做开发的时候,为防患用户观望错误音讯,而出现的不谐和界面,故一般性会在php.ini的配备文件display_errors=off;关闭

d、定义目录常量

     
由于php文件中会频繁的引入文件,被引入的公文存放在目录内,为了统一保管,方便维护,将引得的绝对路径,设置为目录常量

(echo,var_dump是展开局地调式,查看你想要的音信是或不是科学)

澳门葡京备用网址 45

e、引入配置文件

      配置文件中的配置的音信一般是网站中可能会变动,但很少更改的音信

成立布局文件myphp/config/config.php

 澳门葡京备用网址 46

 

说明:

      php文件中的return是将数据再次来到文件包涵语句处(include、require)

 澳门葡京备用网址 47

总结:

      全局变量          只在大局

      局地变量          只在概念的函数内

      类属性             可以跨方法应用

      全局常量          可以跨类使用

      $_SESSION      可以跨脚本利用

     

f、自动加载

      __autoload();                     由PHP自动加载机制调用的

      spl_autoload_register();       
由PHP为大家提供的可以向电动加载机制中添加多少个类似于__autoload()的函数。

澳门葡京备用网址 48

调节要在单入口举办测试:

澳门葡京备用网址 49

澳门葡京备用网址 50

此外文件夹的全自动加载:一般只加载有类文件的公文夹

澳门葡京备用网址 51

澳门葡京备用网址 52

 注册指定函数作为活动加载函数:

澳门葡京备用网址 53

说明

所有loadCore、loadController、loadModel等,都被autoLoad调用,

autoLoad又在run方法中被调用

具备的类的实例化及类的法门的移动是在index.php中

优化进口文件

不一样平台(前台,后台….)

5、分析URL

     
所有的央浼的本质者是一个URL,都请求提Application,若是想让Application可以规范掌握用户的伸手,要由哪一个类公事的哪一个方法处理,那么网站占所有的URL的装置要有自然的条条框框,类公事名也要有肯定的规则:

l  URL的规则:

     

l  类的命名规则:

      假诺是控制器类:

            类名Controller       文件名:      类名Controller.class.php

      假使是模型类:

            类名Model             文件名:      类名Model.class.php

 澳门葡京备用网址 54

 

5、分析URL

     
所有的呼吁的本质者是一个URL,都呼吁提Application,假诺想让Application可以规范领会用户的伸手,要由哪一个类公事的哪一个措施处理,那么网站占所有的URL的装置要有肯定的条条框框,类公事名也要有一定的规则:

l  URL的规则:

     

l  类的命名规则:

      要是是决定器类:

            类名Controller       文件名:      类名Controller.class.php

      倘若是模型类:

            类名Model             文件名:      类名Model.class.php

 澳门葡京备用网址 55

 

  思路

  问题:
此时,入口文件代码零碎增多,随着后续代码的充实,入口文件会越来越臃肿复杂,不易管理

  解决形式:
封装入口文件中的操作称为一个类,这样只要求在入口文件调用类的法门即可

    创建Init.class.php类文件,放入到Frame中
         将进口文件所有操作封装成类方法
              loadClass() 设置自动加载函数
              autoload()自动加载类
              setConst()  定义常量
              dispatch()  前端分发器

   思路

  达成基于平台的两样进行差其余操作

  用户点击页面请求,随着url发送3个参数: p=平台&c=控制器&a=动作
       入口文件吸纳get数据就足以清楚:  平台, 控制器, 动作

6、分发请求

(本质是动态实例化控制器,调用控制器的艺术)

 澳门葡京备用网址 56

6、分发请求

(本质是动态实例化控制器,调用控制器的法子)

 澳门葡京备用网址 57

  代码完结

   1) 在Frame目录中开创Init.class.php文件,
将进口文件index中的代码复制举行改动为类

  【Frame/Init.class.php】

 1 <?php
 2 /**
 3  * 应用初始化操作类
 4  * User: young
 5  */
 6 
 7 class Init
 8 {
 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel'); //Frame目录公共操作类
10     public static function run()
11     {
12         //平台
13         self::dispatch();
14 
15         //定义常量
16         self::setConst();
17 
18         //自动加载类
19         self::loadClass();
20 
21         $ctr = CTR."Controller";  //拼接控制器名称
22 
23         //实例化控制器
24         $ctrObj = new $ctr();
25         $a = ACTION;
26         $ctrObj -> $a();
27     }
28     /**
29      * 设置自动加载类方法
30      */
31     private static function loadClass()
32     {
33         spl_autoload_register('self::autoload');
34     }
35 
36     /**
37      * 实现自动加载
38      * @param  string $className 类名
39      */
40     private static function autoload($className)
41     {
42         $upperClassName = strtoupper($className);
43         if(in_array($className, static::$frame)) {
44             require_once FRAME."$className.class.php";
45         } elseif(substr($upperClassName, -5) == 'MODEL'){
46             require_once MODEL."$className.class.php";
47         } elseif(substr($upperClassName, -10) == 'CONTROLLER'){
48             require_once CTRONLLER."$className.class.php";
49         }
50     }
51 
52     /**
53      * 定义常量
54      */
55     private static function setConst()
56     {
57         define('DS', DIRECTORY_SEPARATOR); //目录分割符
58         define('ROOT', getcwd().DS);
59         define('FRAME', ROOT.'Frame'.DS);
60         define('APP', ROOT.'App'.DS);
61         define('PUB', ROOT.'Public'.DS);
62         define('ADMIN', PUB.'Admin'.DS);
63         define('HOME', PUB.'Home'.DS);
64 
65 
66         define('MODEL', APP.'Model'.DS);
67         define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
68         define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
69     }
70 
71     /**
72      * 获取 p c a 的GET值,并设置为常量
73      * @return void
74      */
75     private static function dispatch()
76     {
77         $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
78         $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
79         $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
80 
81         define('PLAT', $p);
82         define('CTR', $c);
83         define('ACTION', $a);
84     }
85 }

2) 入口文件引入伊始化类,并调用其艺术 【index.php】

1 <?php
2 /**
3  * 入口文件
4  */
5 
6 require_once './Frame/Init.class.php';
7 Init::run();

3) 提交代码

1 $  git add -A
2 $  git commit -m "优化入口文件,封装初始化类"

  代码达成

1) 操作步骤:

澳门葡京备用网址 58澳门葡京备用网址 59

1)入口文件平台区分:
    step 1:  入口-登录页面提交的action="?p=Home&c=User&a=dlogin"

    step 2:  入口文件index.php  接收$_GET

    step 3:  登录判断成功跳转地址: $this->msg('登录成功!', '?p=Admin&c=Index&a=index',3);

2) 后台首页:
     step 1:   静态css,js,img文件放置 Public/Admin/

     step 2:   创建后台首页控制器类,
   index() 载入后台首页视图文件

     step 3:  View/Admin/Index/index.html 修正css等静态文件路

操作步骤思路

2)登录表单提交action=“?p=Home&c=User&a=dlogin”   
【App/View/Home/User/login.html】

澳门葡京备用网址 60澳门葡京备用网址 61

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>登录</title>
 6     <link rel="stylesheet" type="text/css" href="public/plugins/layui/css/layui.css">
 7     <link rel="stylesheet" type="text/css" href="public/Home/css/style.css">
 8 </head>
 9 <body>
10 <div class="container">
11     <div class="content">
12         <form action="?p=Home&c=User&a=dlogin" class="layui-form" method="post">
13 。。。。。。。

登录表单form提交action修改

3) 入口文件分别平台 【index.php】

<?php
/**
 * 入口文件
 */

$p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
$c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
$a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作

require_once 'Frame/Db.class.php';  //数据库操作类
require_once 'Frame/BaseModel.class.php';  //基础模型类
require_once 'App/Model/UserModel.class.php';

require_once 'Frame/FactoryModel.class.php';//模型工厂类

require_once 'Frame/BaseController.class.php';  //基础控制器类
require_once 'App/Controller/'.$p.'/'.$c.'Controller.class.php';

$ctr = $c."Controller";
//实例化控制器
$userCtr = new $ctr();

$userCtr -> $a();

用户控制器登录操作,登录成功跳转到后台首页
【App/Controller/Home/UserController.class.php】

澳门葡京备用网址 62澳门葡京备用网址 63

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7 。。。
 8 。。。
 9 。。。
10  /**
11      * 登录操作: 校验登录信息
12      */
13     public function dlogin()
14     {
15         //接收登录信息
16         $data = array();
17         $data['username'] = trim($_POST['username']);
18         $data['pwd'] = trim($_POST['pwd']);
19 
20         //实例化模型,调用模型方法
21         $result = FactoryModel::M('User')->checkLoginInfo($data);
22 
23         //跳转提示
24         if($result){
25             $this->msg('登录成功!', '?p=Admin&c=Index&a=index',3);
26         } else {
27             $this->msg('用户名或密码不正确!!');
28         }
29     }
30 }

签到操作成功后跳转路径修改

7、开起session

澳门葡京备用网址 64

留意:所有的措施都要在单纯出口访问

澳门葡京备用网址 65

总结:

l  所有的php文件的运转都在index.php文件中。

l  application只处理控制器(controller)文件

l  controller控制器文件处理model模型文件


application之所以可以将依照用户的请求,准确的调用类中的方法,完全依赖于我们定义的url的规则与类的命名规则。

使用命名空间:

      命名空间的命名的条条框框,是以文件所在的目录名为命名空间名。

      若是涉嫌到空中,那么肯定要考虑到类名前会有空间名。

7、开起session

澳门葡京备用网址 66

留意:所有的不二法门都要在单纯出口访问

澳门葡京备用网址 67

总结:

l  所有的php文件的运行都在index.php文件中。

l  application只处理控制器(controller)文件

l  controller控制器文件处理model模型文件


application之所以可以将基于用户的请求,准确的调用类中的方法,完全器重于大家定义的url的平整与类的命名规则。

利用命名空间:

      命名空间的命名的规则,是以文件所在的目录名为命名空间名。

      要是提到到空间,那么一定要考虑到类名前会有空间名。

安全访问项目目录

  测试

 1)模板准备: 

     
准备后台视图模板程序。可以协调写前端视图模板程序,也可以到网上下载外人写好的前端模板,如到
模板之家  选用所须要的 前台,后台模板 

      寻找模板:  www.mycodes.net

   2) 将后台模板视图的静态资源文件(如 js, css,image)拷贝到
【Public/admin/】目录下

   3) 创造后台首页控制器
【App/Controller/Admin/IndexController.class.php】

 1 <?php
 2 /**
 3  * IndexController控制器类
 4  * 后台相关操作
 5  * User: young
 6  */
 7 
 8 class IndexController extends BaseController
 9 {
10     //展示后台首页
11     public function index()
12     {
13         include 'App/View/Admin/Index/index.html';
14     }
15 }

4) 创设后台首页视图 【App/View/Admin/Index/index.html】

澳门葡京备用网址 68澳门葡京备用网址 69

  1 <!doctype html>
  2 <html>
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>后台管理</title>
  6     <link rel="stylesheet" type="text/css" href="./Public/Admin/css/common.css"/>
  7     <link rel="stylesheet" type="text/css" href="./Public/Admin/css/main.css"/>
  8     <script type="text/javascript" src="./Public/Admin/js/libs/modernizr.min.js"></script>
  9     <script type="text/javascript" src="./Public//home/js/jquery1.42.min.js"></script>
 10 </head>
 11 <body>
 12 
 13 
 14 <div class="topbar-wrap white">
 15     <div class="topbar-inner clearfix">
 16         <div class="topbar-logo-wrap clearfix">
 17             <h1 class="topbar-logo none"><a href="index.html" class="navbar-brand">后台管理</a></h1>
 18             <ul class="navbar-list clearfix">
 19                 <li><a class="on" href="?p=back">首页</a></li>
 20                 <li><a href="./" target="_blank">网站首页</a></li>
 21             </ul>
 22         </div>
 23         <div class="top-info-wrap">
 24             <ul class="top-info-list clearfix">
 25                 <li><a href="">user1</a></li>
 26                 <li><a href="?p=back&c=Index&a=ChangePswd">修改密码</a></li>
 27                 <li><a href="?c=User&a=Logout">退出</a></li>
 28             </ul>
 29         </div>
 30     </div>
 31 </div>
 32 <div class="container clearfix">
 33 
 34     <!--左侧菜单栏-->
 35 
 36     <!--左侧菜单栏 begin-->
 37     <div class="sidebar-wrap">
 38         <div class="sidebar-title">
 39             <h1>菜单</h1>
 40         </div>
 41         <div class="sidebar-content">
 42             <ul class="sidebar-list">
 43                 <li>
 44                     <a href="#"><i class="icon-font">&#xe003;</i>常用操作</a>
 45                     <ul class="sub-menu">
 46                         <li><a href="#"><i class="icon-font">&#xe008;</i>分类管理</a></li>
 47                         <li><a href="#"><i class="icon-font">&#xe005;</i>博文管理</a></li>
 48                         <li><a href="#"><i class="icon-font">&#xe012;</i>评论管理</a></li>
 49                         <li><a href="#"><i class="icon-font">&#xe052;</i>友情链接</a></li>
 50                     </ul>
 51                 </li>
 52                 <li>
 53                     <a href="#"><i class="icon-font">&#xe018;</i>系统管理</a>
 54                     <ul class="sub-menu">
 55                         <li><a href="#"><i class="icon-font">&#xe017;</i>系统设置</a></li>
 56                         <li><a href="#"><i class="icon-font">&#xe046;</i>数据备份</a></li>
 57                         <li><a href="#"><i class="icon-font">&#xe045;</i>数据还原</a></li>
 58                     </ul>
 59                 </li>
 60             </ul>
 61         </div>
 62     </div>
 63     <!--左侧菜单栏 begin-->
 64 
 65     <!--右侧主操作区-->
 66     <div class="main-wrap">
 67         <div class="crumb-wrap">
 68             <div class="crumb-list">
 69                 <i class="icon-font">&#xe06b;</i>
 70                 欢迎使用博客后台管理系统。
 71             </div>
 72         </div>
 73         <div class="result-wrap">
 74             <div class="result-title">
 75                 <h1>系统基本信息</h1>
 76             </div>
 77             <div class="result-content">
 78                 <ul class="sys-info-list">
 79                     <li>
 80                         <label class="res-lab">操作系统</label>WINNT
 81                     </li>
 82                     <li>
 83                         <label class="res-lab">运行环境</label>Apache/2.2.21 (Win64) PHP/5.3.10
 84                     </li>
 85                     <li>
 86                         <label class="res-lab">PHP运行方式</label>apache2handler
 87                     </li>
 88                     <li>
 89                         <label class="res-lab">模板版本</label>v-0.1
 90                     </li>
 91                     <li>
 92                         <label class="res-lab">上传附件限制</label>2M
 93                     </li>
 94                     <li>
 95                         <label class="res-lab">北京时间</label>
 96                         <?php echo date('Y年m月d日 H:i:s',time()); ?>
 97                     </li>
 98                     <li>
 99                         <label class="res-lab">服务器域名</label>localhost
100                     </li>
101                 </ul>
102             </div>
103         </div>
104     </div>
105     <!--/main-->
106     <script >
107         $(function(){
108             $("#nowtime").css({color:'red'});
109             $("#host").html(location.host);
110             window.setInterval('ShowTime()',1000);
111         });
112         function ShowTime(){
113             var t = new Date();
114             var str = t.getFullYear() + '年';
115             str += t.getMonth()+1 + '月';
116             str += t.getDate()-1 + '日 ';
117             str += t.getHours() + ':';
118             str += t.getMinutes() + ':';
119             str += t.getSeconds() + '';
120             $("#nowtime").html(str);
121         }
122     </script>
123 </div>
124 
125 </body>
126 </html>

后台首页视图

8、效果突显

当访问网址的时候会展开默认的路由转载:

澳门葡京备用网址 70

澳门葡京备用网址 71

 

 举行其余控制器的法门访问,通过url

澳门葡京备用网址 72

澳门葡京备用网址 73

补充:pathinfo形式能够因此$_SERVER[‘PATH_INFO’];

澳门葡京备用网址 74

澳门葡京备用网址 75

大概就是这么,其余一些等随后我有空再补偿,我还有很多急需学习的。

座右铭:人生就是绵绵地在攻读,再深造。

 

8、效果呈现

当访问网址的时候会开展默许的路由转载:

澳门葡京备用网址 76

澳门葡京备用网址 77

 

 举办其余控制器的格局访问,通过url

澳门葡京备用网址 78

澳门葡京备用网址 79

补充:pathinfo格局可以因此$_SERVER[‘PATH_INFO’];

澳门葡京备用网址 80

澳门葡京备用网址 81

粗粗就是这么,其余一些等将来自己有空再补充,我还有好多索要上学的。

座右铭:人生就是延绵不断地在念书,再学习。

 

   思路

  问题:
此时,项目中存有目录都是能够透过浏览器访问的,如直接访问Frame/Db.class.php文件
直接可以去查看数据库登录新闻,显明是不安全的。

  解决方式:

    方式1:
在可以访问的文本初叶处定义常量,访问是判定是还是不是定义常量defined(..),
没有定义指定常量则直接exit(‘Access Deny’);

    格局2: 开启分布式权限配置,编写.htaccess文件, 如禁止访问,
将该公文放置在取缔访问的目录中

  效果及提交代码

澳门葡京备用网址 82  代码提交,推送

1 $  git add -A
2 $  git commit -m "区分平台,实现后台首页"
3 $  git checkout master
4 $  git merge 'folder-model-app'
5 $  git push origin master

小结: 根据平台进一步优化目录结构,制作模型的单例工厂,完毕后台首页

   实现

  1)使用上述格局2的样式来完毕,
站点配置中参预一项(环境搭建时曾经参与了):
详细见:PHP源码搭建博客1-条件搭建

  apache配置文件httpd-vhosts.conf 中站点布局

1  #允许分布式权限配置(允许重写)(.htacess)
2   AllowOverride All

  2) 重启apache后,编写 .htaccess文件, 该文件内容:

deny from all

   3) 将.htaccess文件放置禁止访问的目录中。  如App/ ,  Frame/
目录下。只用放在第一层即可,内层目录自动不一样意直接访问。

                               
澳门葡京备用网址 83

  4) 访问测试

                   
澳门葡京备用网址 84

提议问题

  1. 档次中得以见到
include或require的文件路径很长,不难失误,也不便宜使用  ==>
怎样进一步简便易行引入且不易出错

     2. 写一个类,就要到进口文件引入三次, 相比较麻烦  ==> 
如何兑现活动加载类

  3. 乘机类的引入增加,入口文件代码量会越加大  ==>  怎样封装,简化入口文件

  4. 现行项目中任何一个目录,都足以擅自走访  ==>
如何增强平安访问,限制目录的拜访

下一步:常量使用,自动加载类落成,入口封装,限制目录访问

小结:

重在已毕了 引入路径优化, 类的自发性加载, 封装优化进口文件,目录访问限制

MVC微型框架到此基本形成。其实还有很多或者得以三番五次扩展,如

  1, 类文件命名此处都用了 .class.php结尾,
实质可以优化直接利用.php结尾

  2, 引入命名空间,更便利的加载类

       3, 项目中出现谬误,此时是一向浮现在浏览器上的,
可以写一个日志类,暴发错误写入文件或数据库都可

  4, 数据库连接音讯此处是向来写在DB类和BaseModel中了, 是不安全的。
可以成立一个配置目录,将这么些音信写入配置文件,再写一个加载配置文件的类。

  5.   此架构目录 ,是在C,V中分平台,如Controller/Home,
Controller/Admin;  实际也得以写成 平台下分MVC结构, 如Admin/Controller,
Admin/Model, Home/Controller,Home/View .. 
那么些是比较灵敏的,可以依照必要选取越发合适的点子

  实际上线项目,仍然建议选拔框架,安全急忙;
自己模仿定义的框架结构适合学习研讨利用,简单遗漏,造成安全隐患,操作不便等题材

下一步:依据博客前端模板,分析创设数据表,
起首搭建博客后台程序,后续首先准备已毕“分类模块”。既分类的彰显,修改,添加,删除功能

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website