网页从静态到MVC的进化史

一、静态网站
(1个html => 1个页面)
************************************
1. 纯静态页面
举例:
1.html

二、动态网站
(数据库中的1条记录 => 1个网页)
************************************
1. 面向过程,写一个文章管理、发布功能。
(请求:1个php页面 => 1个php模块)
举例:
article.php?id=1
// php代码和html混合式开发:1个php页面,写1次「数据库的天龙八部」。

2. 面向对象:使用Model类,翻页类,模板引擎实现文章管理、发布功能。
(自己封装类,提升代码的可重用性)
举例:
article.php?id=1
// 第一步:使用require_once(‘./lib/Model.class.php’) 引入Model类。引入数据库的配置文件。
// 第二步:实例化一个类,$model = new Model(); 准备好SQL语句:$sql=’SELECT * FROM `article`’。
// 第三步:调用Model类中的方法:$ret = $model->select($sql)。返回查询的结果集。

3. 使用组件式开发:
(自己写太麻烦,使用第三方插件,不重复造轮子了… (*^__^*) 嘻嘻……)
如:数据库、验证码组件:

  • catfan/medoo
  • gregwar/captcha

4. MVC设计模式

  • 模型
  • 视图
  • 控制器

(单一入口,在入口文件引入使用到的类,使用命名空间防止类名重复。加入路由负责请求url映射,请求1个页面,实际上是访问1个函数)

举例:
// 第一步:请求文章页面 ../article/1
// 第二步:URL映射到:article控制器,访问showarticle(1)方法传递了参数:文章id
// 第三步:在方法中,调用了Model模型层,获取结果集。
// 第四步:将返回的结果集,传递给视图层,组装成HTML的字符串。
// 第五步:响应:把HTML字符串传送给浏览器

5. 框架

  • Laravel
  • YII
  • ThinkPHP

集成了一些:管理工具
如:包管理工具、数据库迁移、命令行工具
组件:请求、响应

第一个MVC框架

一、MVC基础知识
1、MVC 是单入口,单入口文件index.php, 引入大量类文件,定义一些常量。
2、通过入口文件,实例化一个控制器类,调用控制器类中的方法。
3、运行过程:通过在访问的控制器中的方法里面,去拿数据(访问Model层中方法),然后把数据传给视图层(模板引擎,view层), 最终通过控制器调用显示(show)的方法。

index.php?controller=控制器名&method=方法名

\index.php

Select Code
1
2
3
4
5
6
7
<?php
require_once('testModel.class.php');	// 引入模型
require_once('testView.class.php');		// 引入视图
require_once('testController.class.php');	// 引入控制器

$obj = new testController();
$obj->show();

\testModel.class.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class testModel
{
    public function get()
    {
        return 'hello mvc';
    }

    public function delete()
    {
//
    }
}

\testView.class.php

Select Code
1
2
3
4
5
6
7
8
<?php
class testView
{
    public function display($data)
    {
    	echo $data;
    }
}

\testController.class.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class testController
{
    public function show()
    {
        $model = new testModel();
        $data = $model->get();

        $view = new testView();
        $view->display($data);
    }
}

二、第一个MVC框架
\functions.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function C($name, $method)
{
    require_once('./libs/Controller/' . $name . 'Controller.class.php');
    eval('$obj = new ' . $name . 'Controller(); $obj->' . $method . '();');
}

function M($name)
{
    require_once('./libs/Model/' . $name . 'Model.class.php');
    eval('$obj = new ' . $name . 'Model();');
    return $obj;
}

function V($name)
{
    require_once('./libs/View/' . $name . 'View.class.php');
    eval('$obj = new ' . $name . 'View();');
    return $obj;
}

\index.php

Select Code
1
2
3
4
5
6
7
8
9
10
<?php
include('./functions.php');

// index.php?controller=控制器&method=方法
// index.php?controller=test&method=list

$controller = $_GET['controller'] ? $_GET['controller'] : 'index';
$method = $_GET['method'] ? $_GET['method'] : 'index';

C($controller, $method);

\libs\Controller\testController.class.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class testController
{
    public function show()
    {
        $model = M('test');
        $data = $model->get();

        $view = V('test');
        $view->display($data);
    }

    public function list()
    {
        echo 'list方法';
    }

    public function detail()
    {
        echo '详情页面';
    }
}

\libs\Model\testModel.class.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class testModel extends \PDO
{
    public function __construct()
    {
        $dsn = 'mysql:dbname=web;host=localhost;charset=UTF8';
        $username = 'root';
        $passwd = 'root';
        parent::__construct($dsn, $username, $passwd);
    }

    public function get()
    {
        $sql = "SELECT * FROM `cat`";
        $data = $this->query($sql);
        return $data->fetchAll();
    }

    public function delete()
    {
//
    }
}

\libs\View\testView.class.php

Select Code
1
2
3
4
5
6
7
8
<?php
class testView
{
    public function display($data)
    {
        var_dump($data);
    }
}

命名空间与Traits的使用

一、命名空间
使用场景:
一个大型的项目,由很多人来共同完成的,很多时候会出现类名重复的问题。

解决问题:
命名空间
1. 使用关键字 namespace 声明一个类,它的位置一定是要放在 整个脚本文件的前面,它的前面不能由输出。
2. 使用了命名空间的类的调用,必须在类名前 加上命名空间的值。
3. 可以使用 use 关键字,直接引入类。使用方法就是 use 关键字后面 接上 「命名空间\类名」
4. 使用命名空间中的别名,关键字是 as.

\index.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(null);
include('Test1.php');
include('Test2.php');

use App\Think\Test;
use App\Laravel\Test as LTest;

$obj1 = new App\Think\Test();                   // 实例化的是Test1中的Test类
$obj2 = new App\Laravel\Test();                 // 实例化的是Test2中的Test类
$obj3 = new Test();                             // 实例化的是Test1中的Test类
$obj4 = new LTest();                            // 实例化的是Test2中的Test类

\Test1.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App\Think;

class Test
{
    public function __construct($num1, $num2)
    {
        var_dump("这是Test1文件中的Test类");
    }
}

\Test2.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App\Laravel;

class Test
{
    public function __construct()
    {
        var_dump("这是Test2文件中的Test类");
    }
}

二、命名空间的使用
有3个同名的类文件,使用命名空间可以同时使用这些类文件。

\index.php

Select Code
1
2
3
4
5
6
7
8
9
<?php
include('./A.php');
include('./B.php');
include('./C.php');

// 访问 A 中的 getinfo() 方法
$obj1 = (new \App\Apple())->getInfo();
$obj2 = (new \Apple())->getInfo();
$obj2 = (new \C\Apple())->getInfo();

使用了命名空间的类的调用,必须在类名前 加上命名空间的值。

\A.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App;

class Apple
{
    public function getInfo()
    {
        echo '这是A文件中的Apple<br>';
    }
}

\B.php

Select Code
1
2
3
4
5
6
7
8
9
<?php

class Apple
{
    public function getInfo()
    {
        echo '这是B文件中的Apple<br>';
    }
}

\C.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace C;

class Apple
{
    public function getInfo()
    {
        echo '这是C文件中的Apple<br>';
    }
}

三、Traits的使用
提高代码的可复用性

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

trait OwnerTrait
{
    public function Owner()
    {
        echo "Article Owner";
    }
}

class Article
{
    use OwnerTrait;
}

class Comment
{
    public function Owner()
    {
        echo "Article Owner";
    }
}

(new Article())->Owner();
(new Comment())->Owner();

PHP生成EXCEL表头列名称

生成如下的数组:

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ
BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ

 

用于导出EXCEL文件。

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function excel_header($num = 0)
{
    $arr = range('A', 'Z');

    $no = ceil($num / count($arr));

    $data = array();

    if ($no <= 1) {
        for ($i = 0; $i < $num; $i++) {
            $data[] = $arr[$i];
        }
    } else {
        for ($i = 0; $i < count($arr); $i++) {
            $data[] = $arr[$i];
        }
        for ($i = 0; $i < $num - count($arr); $i++) {
            $list = (($i + count($arr)) % count($arr));
            $data[] = $arr[ceil(($i + 1) / count($arr)) - 1] . $arr[$list];
        }
    }

    return $data;
}

PHPStorm的xdebug工具使用步骤

1.给php安装xdebug模块

百度具体安装流程

php.ini 配置:

Select Code
1
2
3
4
5
6
7
8
[xdebug]
zend_extension ="D:/Wamp/bin/php/php5.6.25/zend_ext/php_xdebug-2.4.1-5.6-vc11-x86_64.dll"
xdebug.remote_enable = 1
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.idekey = "PHPSTORM"

2.配置

注意配置的步骤1234

3.运行

先打断点,然后点击 debug 按钮,当运行至断点处 phpstorm 会在任务栏闪烁,此时按 f8 会往下一行一行执行。

非常方便,非常有必要掌握,尤其是你需要阅读源码的项目,非常方便!

常见PHP框架安装

一文搞定常见的PHP框架的安装。环境的搭建,使用了LNMP1.3一键安装,参考:http://www.webjust.org/archives/460

YII
PHP >= 5.4.0
版本:YII2.0的basic版

Select Code
1
2
composer global require "fxp/composer-asset-plugin:^1.2.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic // 被墙

被墙可以使用国内的git源:

// yii2.0 basic版

Select Code
1
git clone https://code.csdn.net/wbo86/yii2_basic.git basic

// yii2.0 advance版

Select Code
1
git clone https://code.csdn.net/wbo86/yii2_advance.git advance

备注:注意YII框架安装后,需要配置服务器的环境才能够使用。请参考:http://www.yiichina.com/doc/guide/2.0/start-installation

ThinkPHP
PHP >= 5.4.0

版本1:thinkphp 3.2

Select Code
1
composer create-project --prefer-dist topthink/thinkphp tp3 // 被墙

被墙,使用国内的git源:

Select Code
1
git clone https://code.csdn.net/topthink2011/ThinkPHP.git tp3

版本2:thinkphp 5

Select Code
1
composer create-project topthink/think tp5 --prefer-dist

Laravel
PHP >= 5.5.9
storage 和 bootstrap/cache 目录必须让服务器有写入权限

国内镜像:https://laravel-china.org/composer

版本1:Laravel 5.3.*

Select Code
1
composer create-project --prefer-dist laravel/laravel lar53 "5.3.*"

版本2:Laravel 5.2.*

Select Code
1
composer create-project --prefer-dist laravel/laravel lar52 "5.2.*"

版本3:Laravel 5.1.*

Select Code
1
composer create-project --prefer-dist laravel/laravel lar51 "5.1.*"

特殊权限设置:

Select Code
1
2
setfacl -R -m u:www:rwx /home/wwwrot/laravel
setfacl -R -m d:www:rwx /home/wwwrot/laravel

备注:此处的“/home/wwwrot/laravel”指的是你的项目的文件夹。

其他管理工具安装:

Nodejs:
http://nodejs.cn/download/

Composer:
http://docs.phpcomposer.com/