ThinkPHP_3.2.1笔记

ThinkPHP入口文件

 

// 应用入口文件

// 检测PHP环境

if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');

// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false

define('APP_DEBUG',True);

// 定义应用目录

define('APP_PATH','./Weibo/');

//设定目录生成的文件

define('DIR_SECURE_FILENAME' , 'default.html' );

//设置目录页面内容

define('DIR_SECURE_CONTENT' , ' 目录禁止' );

//禁止目录主页生成

define('BUILD_DIR_SECURE' , false);

 

// 引入ThinkPHP入口文件

require './ThinkPHP/ThinkPHP.php';

// 亲^_^ 后面不需要任何代码了 就是如此简单

 

建立控制器

 

控制器类的命名方式:控制器名(驼峰式,首字母大写) +Controller
控制器文件的命名方式:类名+class.php
创建一个控制器需要三个部分: 1.设置命名空间; 2.导入命名空间; 3.控制器类

<?php

namespace Home\Controller;  //设置命名空间,就是当前目录

use Think\Controller;  //继承父类用到Controller类

class UserController extends Controller

{

    public function test()

    {

        echo "usercontroller";

    }

}

访问的URL为:http://localhost/tp3_2/index.php/Home/User/test

 

有时方法名可能和关键字冲突, 那么定义起来就比较麻烦, 控制器提供了一个配置定义:

//配置控制器方法后缀

'ACTION_SUFFIX' =>'Action',

//每个方法后面加上Action,对于URL访问不需要加Action

public function listAction(){

        echo 'list';

    }

默认情况下, 控制器只支持一级控制器。 当项目较为繁杂的时候, 想创建统一模块下多个控制器时,可以配置二级控制器。

第一步:配置允许二级控制器;

//允许二级控制器

'CONTROLLER_LEVEL' =>2,

第二步:在 Controller 目录下创建 User 目录,在 User 目录下创建一个控制器;

//二级控制器写法

namespace Home\Controller\User;

use Think\Controller;

class MemberController extends Controller {

    public function index() {

        echo ' 多级控制器' ;

    }

}

 

Action 参数绑定

参数绑定是通过直接绑定 URL 地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析。

//启用Action参数绑定,默认为true,可以不写

'URL_PARAMS_BIND' =>true,

默认的参数绑定是按变量名来绑定的,直接通过 URL 传递参数。

//变量名为$id

class UserController extends Controller {

    public function index($id) {

        echo 'id:' .$id;

    }

}

URL: http://localhost/demo39/User/index/id/5

如果你个那个参数设定一个默认值,当没有传递参数的时候,会直接启用默认值:

//给变量$id 设置默认值

public function index($id=1)

 

还有一种是按顺序传递参数,这个方法可以省略掉键值对中的键,也就是说 id 不需要传递,只需要传递 5 这个值即可。但必须按照多个参数的顺序。

//定义按顺序传参绑定

'URL_PARAMS_BIND_TYPE' =>1,

//传递两个参数

class UserController extends Controller {

    public function index($id, $type) {

        echo 'id:' .$id. ',type:' .$type;

    }

}

URL: http://localhost/demo39/User/index/5/a

 

 

模块化设计

 

    <?php

  return array(

     //'配置项'=>'配置值'

    //禁止访问模块

    //'MODULE_DENY_LIST' => array('Common' , 'Runtime' ),

    //禁止访问模块,添加一个Admin模块

    //'MODULE_DENY_LIST' => array('Common', 'Runtime','Admin'),

    //允许访问的模块,设置了,就必须写全,漏写的将无法访问

    // 'MODULE_ALLOW_LIST' => array('Home' , 'Admin' ),

    //设置默认起始模块

   // 'DEFAULT_MODULE' => 'Admin' ,

   //单模块设置

    'MULTI_MODULE' => false,

);

 

有时,你会觉得 index.php/Admin 这样很麻烦。你可能想直接 admin.php 就代表后台就方便很多,那么可以使用多入口设置。


这里的多入口和上一节多个应用项目不同, 而是通过 admin.php 访问 Weibo 目录下的Admin 模块。将 index.php 复制出来改成 admin.php,然后添加如下代码:

//默认指向Admin模块

$_GET['m' ] = 'Admin';

//默认指向Index控制器

$_GET['c' ] = 'Admin' ;

 

URL 模式

 

ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式、REWRITE和兼容模式。

http://localhost/demo39/index.php/模块/控制器/操作

 

PATHINFO 模式下默认的分隔符是/,我们可以设置为你想要的,比如: _

//设置键值对分隔符

'URL_PATHINFO_DEPR' =>'_' ,

设置了分隔符的 URL:

    http://localhost/demo39/index.php/Home_User_test_user_Lee_pass_123

 

//REWRITE模式(重写模式)

httpd.conf 配置文件中加载了 mod_rewrite.so 模块

AllowOverride None 将 None 改为 All

 

把下面的内容保存为.htaccess 文件放到应用入口文件的同级目录下

这样, ThinkPHP 自带的.htaccess 文件就起作用了,可以过滤掉 index.php 这个字符串。

<IfModule mod_rewrite.c>

Options +FollowSymlinks

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

</IfModule>

//去除了index.php

http://localhost/demo39/Home/User/test/user/Lee/pass/123

 

一. 创建数据库

 

//mysql全局定义

//    'DB_TYPE' =>'mysql' , //数据库类型

//    'DB_HOST' =>'localhost' , //服务器地址

//    'DB_NAME' =>'test' , //数据库名

//    'DB_USER' =>'root' , //用户名

//    'DB_PWD' =>'123456' , //密码

//    'DB_PORT' =>3306, //端口

//    'DB_PREFIX' =>'think_' , //数据库表前缀

//PDO专用定义

    'DB_TYPE' =>'pdo' , //数据库类型

    'DB_USER' =>'root' , //用户名

    'DB_PWD' =>'123456' , //密码

    'DB_PORT' =>3306, //端口

    'DB_PREFIX' =>'think_' , //数据库表前缀

'DB_DSN'=>'mysql:host=localhost;dbname=test;charset=utf8'

 

二. 实例化模型

 

在ThinkPHP 中,提供了 Model 基类处理,也可以使用 M()方法。

Model 基类可以传递三个参数:

Model([' 模型名'],[' 数据表前缀'],[' 数据库连接信息']);

//实例化Model类,定义数据库链接信息

$user=new Model('User','think_','mysql://root:123456@localhost/thinkphp' );

 

 

使用 Model 基类还需要导入命名空间,而使用 M()方法,则不需要。

//实例化Model类

$user = M('User' );

除了使用 Model 基类和 M()方法, 还有一种对应数据表的模型定义, 比如: UserModel。这种模型类并非必须定义的,只有当存在独立的业务逻辑或者属性的时候才需要。

模型名             对应的数据表(假设前缀是 think_)

UserModel          think_user

UserTypeModel      think_user_type

//User模型类

namespace Home\Model;

use Think\Model;

class UserModel extends Model {}

创建了 UserModel 模型类后,控制器那头就可以直接声明。

//User模型类

$user = new UserModel();

var_dump($user->select());

 

//页面Trace,调试辅助工具

'SHOW_PAGE_TRACE' =>true,

 

//重新定义表前缀

class UserModel extends Model {

    protected $tablePrefix = 'abc_' ;

}

//重新定义表名

class UserModel extends Model {

    protected $tableName = 'abc' ;

}

//重新定义完整的带前缀的表名

class UserModel extends Model {

    protected $trueTableName = 'tp_abc' ;

}

//附加数据库名

class UserModel extends Model {

    protected $dbName = 'tp' ;

}

 

如果你仅仅使用 CURD 等数据库基本操作,我们建议使用基于 Model 基类的 M()方法。

使用 M()方法由于不需要加载具体的模型类(比如 UserModel 类),所以性能会更高。

当然,如果有必要使用具体的模型类时, ThinkPHP 还提供了 D()方法来直接是实例化模型类,并且还可以免去引入命名空间等操作。

//实例化UserModel类

$user = D('User' );

D()方法可以直接调用当前模块的模型类, 那么如果跨模块调用的话, 那怎么处理呢?

比如 Admin 后台模块,可以使用目录声明。

//跨模块实例化

$user = D('Admin/User' );

有时,你可能想使用原生的 SQL 语句进行操作数据库。那么可以采用实例化空模型基类或者空 M()方法。

//空 M()方法

$user = M(); //或者new Model(); 空基类

var_dump($user->query("SELECT * FROM think_user WHERE user=' 蜡笔小新'"));

 

三. 字段定义

 

// 关闭字段缓存

'DB_FIELDS_CACHE' =>false //开启了调试模式,自动关闭

 

PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除

/Data/_fields 文件夹,重新获取字段。

 

你也可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能,避免 IO 开销。

//手动定义数据表字段, _pk表示主键

class UserModel extends Model {

    protected $fields = array('id' , 'user' , '_pk' =>'id' );

}

//type 定义每个字段的类型,可以永远字段验证

class UserModel extends Model {

    protected $fields = array('id' , 'user' , '_pk' =>'id' ,

        'type' =>array('id' =>'smallint' , 'user' =>'varchar' ));

}

 

一.     查询方式

 

1. 使用字符串作为条件查询

//字符串作为条件查询

$user = M('User' );

var_dump($user->where('id=1 AND user="蜡笔小新"' )->select());

 

2. 使用索引数组作为查询条件

//索引数组作为条件查询

$user = M('User' );

$condition['id' ] = 1;

$condition['user' ] = ' 蜡笔小新' ;

var_dump($user->where($condition)->select());

PS: 索引数组查询的默认逻辑关系是 AND, 如果想改变为 OR, 可以使用_logic 定义查询逻辑。

基于上面的代码增加如下一行:

$condition['_logic' ] = 'OR' ; //将默认 AND 改成 OR

 

3. 使用对象方式来查询

//对象作为条件查询

$user = M('User' );

$condition = new \stdClass();

$condition->id = 1;

$condition->user = ' 蜡笔小新' ;

var_dump($user->where($condition)->select());

//最终生成的 SQL 语句

SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = ' 蜡笔小新' )

PS: stdClass 类是 PHP 内置的类, 可以理解为一个空类, 在这里可以理解为把条件的字段作为成员保存到 stdClass 类里。而这里的' \' 是将命名空间设置为根目录,否则会导致当前目录找不到此类。 使用对象和数组查询, 效果是一样的, 可以互换。 在大多数情况下,ThinkPHP 推荐使用数组形式更加高效。

 

二. 表达式查询

 

对于那些要实现模糊判断的查询, 比如大于、 等于、 小于之类的SQL查询, 可以使用表达式查询方式。

查询表达式格式: $map[' 字段名'] = array(' 表达式',' 查询条件');

三. 快捷查询

四. 区间查询

五. 组合查询

六. 统计查询

七. 动态查询

借助 PHP5 语言的特性, ThinkPHP 实现了动态查询。

1. getBy 动态查询

//查找[email protected]的数据

$user = M('User' );

var_dump($user->getByemail('[email protected]' ));

2. getFieldBy 动态查询

//通过user得到相对应id值

$user = M('User' );

var_dump($user->getFieldByUser(' 路飞' , 'id' ));

八. SQL 查询

ThinkPHP 支持原生 SQL 查询。

1. query 读取

//查询结果集,如果采用分布式读写分离,则始终在读服务器执行

$user = M('User' );

var_dump($user->query('SELECT * FROM think_user' ));

2.execute写入

//更新和写入,如果采用分布式读写分离,则始终在写服务器执行

$user = M('User' );

var_dump($user->execute('UPDATE think_user set user="蜡笔大新" WHEREid=1' ));

连贯方法…

CURD操作…

 

自动验证

 

一. 验证规则

数据验证可以对表单中的字段进行非法的验证操作。 一般提供了两种验证方式: 静态定义($_validate 属性)和动态验证(validate()方法)。

//验证规则

array(

array(验证字段1, 验证规则, 错误提示,[验证条件, 附加规则, 验证时间]),

array(验证字段2, 验证规则, 错误提示,[验证条件, 附加规则, 验证时间]),

......

);

PS:验证字段、验证规则和错误提示这三项是必选的,大多数也是用这三项;而验证条件、附加规则和验证时间是可选的。

 

验证规则: 系统内置了常用的规则, require(字段必填)、 email(邮箱格式)、 url(url格式)、 currency(货币)、 number(正整数)、 integer(整数)、 double(浮点数)、 zip(邮政编码)、 english(英文)。这些规则默认采用的附加规则是 regex,正则表达式验证,只不过是设定好的。

错误信息:验证失败后的提示。

验证条件:共三种:

1. self::EXISTS_VALIDATE 或 0,表示存在字段就验证(默认);

2. self::MUST_VALIDATE 或 1,表示必须验证;

3. self::VALUE_VALIDATE 或 2,表示值不为空的时候验证。

二. 静态定义

在模型类里预先定义好该模型的自动验证规则,就是静态定义。

//模型类定义验证规则

class UserModel extends Model {

protected $_validate = array(

//默认情况下用系统内置

array('user' , 'require' , ' 用户不得为空! ' ),

//验证数据唯一性

array('user' , '' , ' 用户名称已存在! ' ,2, 'unique' ,1),

//验证密码不得为空

array('pass' , 'require' , ' 密码不得为空! ' ),

//密码不得小于六位不得大于20位

array('pass' , '6,20' , ' 密码不得小于6位,不得大于20位' , 3,'length' ),

);

}

ThinkPHP 提供了九种自动验证内置方案,具体如下:

//内置验证require,不得为空的用法

array('user' , 'require' , ' 用户不得为空! ' ),

//内置验证email,合法的邮箱格式

array('user' , 'email' , ' 邮箱格式不合法! ' ),

//内置验证url,验证网址是否合法

array('user' , 'url' , 'URL 路径不合法! ' ),

//内置验证currency,验证是否为货币

array('user' , 'currency' , ' 货币格式不正确! ' ),

...

三. 动态验证

动态验证就是把验证的规则放在控制器端, 这样, 在操作的时候比较灵活, 缺点就是比较混乱。

//动态验证

$rule = array(

array('user' , 'require' , ' 用户名不得为空' ),

);

$user = M('User' );

$data['user' ] = '' ;

if ($user->validate($rule)->create($data)) {

echo ' 验证所有字段成功! ' ;

} else {

var_dump($user->geterror());

}

 

自动完成

 

一. 完成规则

自动完成一般通过默认字段写入、 安全字段过滤以及业务逻辑的自动处理等。 有两种方式实现自动完成的规则: 1. 静态方式:在模型类里通过$_auto 属性定义处理规则; 2 动态方式:使用模型类的 auto 方法动态创建自动处理规则。

//完成规则

array(

array(完成字段1, 完成规则,[完成条件, 附加规则]),

array(完成字段2, 完成规则,[完成条件, 附加规则]),

......

);

完成字段:必填,需要的字段名;

完成规则:必填,配合附加规则完成;

完成条件:可选,具体如下:

1. self::MODEL_INSERT 或 1,新增数据的时候处理(默认);

2. self::MODEL_UPDATE 或 2,更新数据的时候处理;

3. self::MODEL_BOTH 或 3,所有情况均处理。

二. 静态定义

在模型类里预先定义好该模型的自动完成规则,就是静态定义。

class UserModel extends Model {

//自动完成

protected $_auto = array(

//自动设置count字段为1

array('count' , ' 1' ),

//给密码加密,加密类型为sha1, sha1函数PHP内置

array('user' , 'sha1' , 3, 'function' ),

);

}

//把email字段的值填充到user字段冲去

array('user' , ' email' , 3, 'field' ),

//callback,给用户名加前缀

array('user' , 'updateUser' , 3, 'callback' , '_' ),

//回调函数

protected function updateUser($str, $prefix)

{

return $prefix.$str;

}

 

三. 动态完成

动态完成就是把完成的规则放在控制器端, 这样, 在操作的时候比较灵活, 缺点就是比较混乱。

//动态完成

$rules = array(

array('user' , 'sha1' , 3, 'function' ),

);

$user = M('User' );

$data['user' ] = ' 蜡笔小新' ;

if ($user->auto($rules)->create($data)) {

$user->add();

}

视图

一. 模版定义

模版在使用之前需要一定的设置, 才能方便开发者使用。 每个模块的模版文件是独立的,为了对模版文件更加有效的管理, ThinkPHP 对模版文件机型目录划分, 默认的模版文件定义规则是:视图目录/[模版主题/] 控制器名/操作名+模版后缀

第一步:在 User 控制器模块执行一条语句:

//渲染模版输出

$this->display();

默认情况下视图目录是 View,如果你想改变成别的目录名可以设置:

//修改模版的视图目录

'DEFAULT_V_LAYER' =>'Template' ,

默认情况下的模版文件后缀是.html,如果你想改变成别的后缀可以设置:

//修改模版中的文件的后缀

'TMPL_TEMPLATE_SUFFIX' =>'.tpl'

如果感觉每一个模块,都要创建相应的目录太过于麻烦,可以设置:

//用下划线代替目录层次

'TMPL_FILE_DEPR' =>'_' , //User_index.tpl

如果不想将模版存在在当前 Weibo 目录下,而设置在外部:

//设置外部的模版目录

'VIEW_PATH' =>'./Public/' ,

如果一个系统要考虑多套界面皮肤的话,要考虑到默认皮肤以及可选皮肤:

//设置默认主题目录

'DEFAULT_THEME' =>'default' ,

//切换主题

$this->theme('blue' )->display();

二. 赋值和渲染

如果要在模版中输出变量,必须在控制器中把变量传递给模版。 ThinkPHP 提供了assign 方法对模版变量赋值,无论何种变量类型都统一使用 assign 赋值。

//给模版传递一个变量

$this->assign('user' , ' 蜡笔小新' );

//模版中调用变量

{$user}

PS:这个方法必须在 display()方法之前使用,保存变量正确传递。

 

如果不传递任何参数,它会按照默认的目录定位模版的位置:

当前模块/默认视图目录/当前控制器/当前操作.html

//不传参数

$this->display();

./Weibo/Home/View/default/User/index.tpl

//修改默认模版

$this->display('add' );

./Weibo/Home/View/default/User/add.tpl

//修改默认模版,目录加模版

$this->display('Bbb/add' );

./Weibo/Home/View/default/Bbb/add.tpl

//修改默认模版,模块加目录加模版

$this->display('Admin@Bbb/add' );

./Weibo/Admin/View/default/Bbb/add.tpl

//修改默认模版,主题加目录加模版

$this->theme('blue' )->display('Bbb/add' );

./Weibo/Home/View/blue/Bbb/add.tpl

//修改默认模版,自定义模版

$this->display('./Template/Public/add.tpl' );

./Template/Public/add.tpl //Template 和 Weibo 同级

//修改默认模版,指定编码和文件类型,一般不用填写,默认即可

$this->display('add' , 'utf-8' , 'text/xml' )

三. 模版地址

ThinkPHP 封装了一个 T 函数,专门用于生成模版文件。格式如下:

T([资源://][模块@][主题/][控制器/] 操作,[视图分层]);

//输出当前模版地址

echo T();

当然可以结合上面讲的所有定义方法来自定义模版:

echo T('Public/add' )

echo T('Admin@index' );

echo T('Admin@Public/add' , 'Template' );

//直接使用T函数输出

$this->display(T());

四. 获取内容

如果需要获取模版的内容,可以使用 fetch()方法,这个方法的使用和 display()方法一致。

//获取模版里的内容

$content = $this->fetch();

var_dump($content);

//通过内容再渲染输出

$this->show($content);

PS:使用 fetch()方法获取内容,主要是为了可以处理和过滤更加复杂的内容。然后处理后再由 show()方法输出。

 

模版基础

 

一. 变量输出

在模版中输出变量是非常容易的, 使用 assign()方法, 以键值对的方式传递变量和值。

//给模版传递一个变量

$user = ' 蜡笔小新' ;

$this->assign('user' , $user);

在模版中可以这么调用:

{$user}

模版标签{和$之间不能用任何空格,否则无法解析。如果你想更换两个{}可以设置:

//修改默认标签

'TMPL_L_DELIM'=>'<{',

'TMPL_R_DELIM'=>'}>',

调用方式就必须改变:

<{$user}>

二. 系统变量

在模版中,不但可以输出 PHP 的系统变量,还可以输出 ThinkPHP 的系统变量。

//输出PHP系统变量

{$Think.server.script_name} //$_SERVER[' SCRIPT_NAME' ]

{$Think.session.admin} //$_SESSION[' admin' ]

{$Think.get.user} //$_GET[' user' ]

{$Think.post.user} //$_POST[' user' ]

{$Think.request.user} //$_REQUEST[' user' ]

{$Think.cookie.name} //$_COOKIE[' name' ]

//ThinkPHP的系统变量

{$Think.const.APP_PATH} //目录

{$Think.config.url_model} //URL模式

{$Think.lang.var_error} //语言变量

三. 使用函数

如果有时,我们需要在模版中使用 PHP 函数的话,可以按照下面的格式使用:

{$user|md5}

如果有多个参数要传递,可以参考如下设置:

{$date|date="Y-m-d H:i:s",###}

前面输出变量,在后面定义,则不需要###

{$user|mb_substr=0,3,'UTF-8'}

多个函数用"| "隔开即可

{$user|mb_substr=0,3,'UTF-8'|md5|sha1}

四.使用运算符

我们可以在模版中使用运算符,包括对“+”、“-”、“*”、“/”、“%”、“--” 和“++”的支持。

{$data['num']+10} //中括号

{$data['num']+getNum()} //函数

PS:在使用运算符的时候,不再支持语法和常规的函数用法:

{$data.num+10} //错误的

{$data['num']+getNum} //错误

模版还支持三元运算符:

{$user ? ' 有值' : ' 无值'}

五.包含文件

在一个系统中,可以包含通用的头文件和脚文件: header 和 footer。由于每个页面的头脚都是相同的,所以需要独立分离出来,再用包含文件引入他们。

我们可以在 View 目录下 default 主题目录下创建一个 public 目录, 这个目录专门存放公共调用模版文件。

<include file='Public/header' />

<include file='Public/footer' />

也可以调用绝对路径模式:

<include file='./Weibo/Home/View/default/Public/header.tpl' />

同时调用多个模版文件:

<include file='Public/header,Public/footer' />

六.模版注释

模版支持注释功能,提供个模版制作人员参考。

{//这是注释}

{/*这也是注释*/}

{/*这是

多行注释*/}

七. 模版继承

模版继承是一项灵活的模版布局方式, 它类似于子类继承父类, 然后子类还可以进行适当的修改以满足当前页面的需要。

//基础模版需要子模版修改的部分可以用<block>包含,并且设置name值

    <block name="main">主要内容</block>

    //子模版只要按同样的方法,修改<block>内部的值即可完成修改

<block name="main">修改了</block>

八.模版布局

九.模版替换

在模版渲染之前, 系统还会对读取的模版内容进行一些特殊字符串替换操作, 也就实现了模版输出的替换和过滤。

__ROOT__: 会替换成当前网站的地址(不含域名)   /tp3_2

__APP__: 会替换成当前应用的 URL 地址 (不含域名)/tp3_2/index.php

__MODULE__:会替换成当前模块的 URL 地址 (不含域名)/index.php/Home

__CONTROLLER__(或者__URL__ 兼容考虑): 会替换成当前控制器的 URL 地址(不含域名)  /tp3_2/index.php/Home/User

__ACTION__:会替换成当前操作的 URL 地址 (不含域名)

__SELF__: 会替换成当前的页面 URL

__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/

'TMPL_PARSE_STRING' =>array(

'__PUBLIC__' => '/Common' , // 更改默认的/Public 替换规则

'__UPLOAD__' => '/Uploads' , // 增加新的上传路径替换规则

)

内置标签…

 

图像处理

 

一. 实例化类库

//实例化图像处理类,默认为GD库

$image = new Image();

//采用Imageick扩展库,默认没安装

$image = new Image(Image:: IMAGE_IMAGICK);

$image = new Image('Imagick' );

PS: Imageick 扩展库在处理更加复杂的图像上具有很强的优势, 但如果只是一些普通的需求,使用 GD 库完全够用。

二.获取图像信息

//实例化图象处理类库

$image = new Image();

//加载一张预处理的图片

$image->open('./Public/1.jpg' );

//上面两句,可以用一句话包含

$image = new Image(Image:: IMAGE_GD, './Public/1.jpg' );

//获取图片信息

$arr['width' ] = $image->width();

$arr['height' ] = $image->height();

三. 图像处理

使用 crop()和 save()方法可以实现图像的裁剪功能。

//裁剪图片,高400,宽400

$image->crop(400,400)->save('./Public/2.jpg' );

//裁剪图片, 坐标100,100开始裁剪

$image->crop(400,400,100,100)->save('./Public/2.jpg' );

//裁剪图片, 生成后的图片压缩成高宽200

$image->crop(400,400,100,100,200,200)->save('./Public/2.jpg' );

使用 thumb 方法生成缩略图。

//生成缩略图

$image->thumb(300,300)->save('./Public/2.jpg' );

PS:虽然我们设置了宽高 300,但实际上它是 300 x 168,因为生成缩略图采用默认等比例缩放的。如果想用其它缩略图模式,可以使用以下方式。

IMAGE_THUMB_SCALE = 1 ; //等比例缩放类型

IMAGE_THUMB_FILLED = 2 ; //缩放后填充类型

IMAGE_THUMB_CENTER = 3 ; //居中裁剪类型

IMAGE_THUMB_NORTHWEST = 4 ; //左上角裁剪类型

IMAGE_THUMB_SOUTHEAST = 5 ; //右下角裁剪类型

IMAGE_THUMB_FIXED = 6 ; //固定尺寸缩放类型

//生成缩略图,以中心点截取,直接传3也可以

$image->thumb(300,300,Image::IMAGE_THUMB_CENTER)->save('./Public/2.jpg' );

使用 water()方法可以生成一张包含水印的图片。

//在图片右下角添加水印并生成

$image->water('./Public/logo.png' )->save('./Public/2.jpg' );

由于默认是右下角水印位置,如果想更改水印位置,可以在第二参数使用如下:

IMAGE_WATER_NORTHWEST = 1 ; //左上角水印

IMAGE_WATER_NORTH = 2 ; //上居中水印

IMAGE_WATER_NORTHEAST = 3 ; //右上角水印

IMAGE_WATER_WEST = 4 ; //左居中水印

IMAGE_WATER_CENTER = 5 ; //居中水印

IMAGE_WATER_EAST = 6 ; //右居中水印

IMAGE_WATER_SOUTHWEST = 7 ; //左下角水印

IMAGE_WATER_SOUTH = 8 ; //下居中水印

IMAGE_WATER_SOUTHEAST = 9 ; //右下角水印

//更改水印到左上角

$image->water('./Public/logo.png' , Image:: IMAGE_WATER_NORTHWEST)->save('./Public/2.jpg' );

//设置水印的透明度,默认为80, 1-100之间

$image->water('./Public/logo.png' , Image:: IMAGE_WATER_NORTHWEST, 30) ->save('./Public/2.jpg' );

//设置文本水印

$image->text('YCKU.COM' , './Public/consola.ttf' , 20, '#ffffff' ,

Image:: IMAGE_WATER_SOUTHEAST)->save('./Public/2.jpg' );

 

 

验证码

 

一. 生成验证码

//实例化验证码类

$verify = new Verify();

//生成一个验证码图形

$verify->entry();

PS: 生成的验证码会将信息保存在session中, 可以使用print_r($_SESSION) 来查看。

如果想生成多个验证码,可以传递数字参数即可。

//生成第一个验证码

$verify->entry(1);

//生成第二个验证码

$verify->entry(2)

二.验证码参数

//设置验证码参数

$config = array(

    'fontSize' =>30, //验证码字体大小

    'length' =>3, //验证码位数

    'useNoise' =>false, //关闭验证码杂点

);

//实例化验证码类,并传入参数

$verify = new Verify($config);

//生成验证码

$verify->entry();

上面,采用的配置变量方式来修改验证码参数,也可以使用动态设置方法:

//实例化验证码类,并传入参数

$verify = new Verify();

//验证码字体大小

$verify->fontSize = 30;

//验证码位数

$verify->length = 3;

//关闭验证码杂点

$verify->useNoise = false;

//生成验证码

$verify->entry();

//设置验证码的长度

$verify->length = 3;

//设置验证码加密密钥

$verify->seKey = 'YCKU.COM' ;

//设置验证码背景颜色

$verify->bg = array(200,200,200);

 

如果想让验证码显示中文字符,那么需要几个步骤:

1. 在 Think/zhttfs 文件夹下引入中文字体文件,比如加粗雅黑 msyhbd.ttf;

2. 设置字体文件;

//设置验证码字体

$verify->fontttf = 'msyhbd.ttf' ;

3. 设置中文验证码

//设置中文验证码

$verify->useZh = true;

PS:由于中文字符较为庞大,你也可以限定指定的中文字符。

//限定中文字符

$verify->zhSet = ' 李炎恢是个好人' ;

//设置纯数字

$verify->codeSet='0123456789' ;

三. 验证码检测

我们可以使用 Verify.class.php 类中的 check 方法检测验证码是否输入正确。

第一步:在 function.php 里构建一个函数:

//函数$code 是验证码字符, $id 是第几个验证码,如果只有一个,可以忽略

function check_verify($code, $id = '' ){

    $verify = new \Think\Verify();

    return $verify->check($code, $id);

}

//通过输入验证,来验证,是否返回 true

public function test($code) {

    echo $code;

    var_dump(check_verify($code)); //($code, 1)

}

 

 

文件上传

 

一. 上传表单

//上传单个文件的表单模式

<form action="__CONTROLLER__/upload"

enctype="multipart/form-data" method="post">

<input type="text" name="name" />

<input type="file" name="photo" />

<input type="submit" value="提交" />

</form>

//多文件上传设置,或者改为 photo1, photo2, photo3 即可

<input type="file" name="photo[]" />

<input type="file" name="photo[]" />

<input type="file" name="photo[]" />

在控制器里创建一个 upload 方法,实现上传功能:

//上传功能

public function upload() {

    $upload = new Upload(); //实例化上传类

    $upload->maxSize = 3145728; //设置上传大小,字节

    $upload->exts = array('jpg' , 'gif' , 'png' , 'jpeg' ); //限定后缀

    $upload->savePath = './' ; //在根目录Uploads下

    $info = $upload->upload(); //执行上传方法

    if (!$info) {

        $this->error($upload->getError()); //错误了

    } else {

        $this->success(' 上传成功! ' ); //成功了

    }

}

二. 文件上传

//实例化配置参数

$config = array(

    'maxSize' =>3145728,

    'exts' =>array('jpg' , 'gif' , 'png' , 'jpeg' ),

    'savePath' =>'./' ,

);

$upload = new Upload($config);

//动态配置参数

$upload = new Upload();

$upload->maxSize = 3145728;

$upload->exts = array('jpg' , 'gif' , 'png' , 'jpeg' );

$upload->savePath = './' ;

//设置文件名

$upload->saveName = '123' ;

 

你可能感兴趣的:(thinkphp)