1、常见PHP框架
Laravel:国外的,非常有名,功能齐全,学习难度大,可以写出间接优雅的代码
ThinkPHP:国内的PHP框架,具有简单,快速,兼容等优点,之前手工打造玩具框架(TP3.2)
Yaf:鸟哥开发的,是用C语言开发的,效率极高
Yii:最有效率的PHP框架之一,百度的很多业务模块都是使用这个框架
总结:没有最好的框架,只有最适合的框架
2、ThinkPHP(5.0)
官网:http://www.thinkphp.cn/
手册:快速入门,完全开发
下载:官网、Composer、Git
目录结构:
public:公共的静态文件目录
index.php 唯一的入口文件
application:应用程序目录
model、view、controller
运行环境:
1、PHP >= 5.4.0(完美支持PHP7)
2、扩展库:PDO、MBString、CURL
配置虚拟主机:
1、右键点击WAMP,选择Wamp Setting
2、勾选VirtualHost sub-menu
3、访问localhost,点击Add a virtual host,按照提示添加
4、重启WAMP服务
3、基本使用
1、访问指定模块指定控制器的指定方法
http://域名/index.php?s=模块/控制器/方法
2、不传参数,默认访问index模块,index控制器,index方法
3、因为有.htaccess文件的存在,可以省略[index.php?s=],简写为
http://域名/模块/控制器/方法
4、访问带参数的函数 test($a,$b)
http://域名//模块/控制器/方法/a/2/b/4
若配置:url_param_type = 1,则可简写(顺序解析)为
http://域名//模块/控制器/方法/2/4
5、添加一个控制器
在controller目录创建一个文件,访问时默认开启了自动转换
当控制器有多个单词组成时,需要通过'_'进行分割
如:UserType控制器,访问时:user_type
若不想让其自动转换,可以设置:url_convert = false
6、添加模块admin
同原有的index模块,需要在application目录创建一个文件夹
注意:命名空间要这样写 app\模块\controller
7、调试模式
app_debug = true 开启调试,在测试时
app_debug = false 关闭调试,在上线时
4、请求(Request)
创建方式:
1、Request::instance() 是单例对象
2、继承自think\Controller类,有一个成员变量request
3、public function req(Request $request) 依赖注入(推荐使用)
4、助手函数:request()
获取URL相关信息:
url/domain/pathinfo
获取模块/控制器/方法
module()
controller()
action()
获取请求相关参数
method()
获取所有请求参数
param() 获取所有
only(['name']) 获取指定名字name的参数
except(['name']) 获取除name之外的参数
参数检测
has('参数名','方法')
input('?get.id'); 判断get请求是否有id参数
获取分配参数
get('name','默认值','过滤方法1,方法2')
说明:若想全局过滤,修改配置文件中的default_filter选项
请求伪装:
<form method='post'>
<input type='hidden' name='_method' value='PUT'>
</form>
说明:通过var_method可以指定名称
请求头信息
header() 获取所有头信息(一个数组)
header('user-agent') 获取指定头信息
伪静态:
设置:url_html_suffix = 'html|php|shtml'
作用:为了更好满足SEO
5、数据库(Db)
修改配置:application/database.php
使用Db类:think\Db
原生操作:
查询:Db::query()
执行:Db::execute()
参数绑定:类似于PDO
Db::query('select * from think_data where id=?',['1'])
Db::query('select * from think_data where id=:id',['id'=>'1'])
查询构造器:
table() 指定表名(要写全),要求带前缀
name() 指定表名,不带前缀,推荐使用
insert()
delete()
update()
select()
where()
链式操作:
你能够想到所有操作
事务处理
Db::transaction(function(){/*事务处理操作*/});
Db::startTrans();
try {
//事务处理
Db::commit();
} catch(Exception $e) {
Db::rollback();
}
6、查询语言
select:查询所有符合条件的记录
find:返回一条符合条件的记录
where(字段名,表达式,指)
闭包查询:Db::select(function($query){/*构造查询条件*/});
value('字段'):获取一条记录指定的字段值
column('字段'):获取所有记录指定的字段
chunk(每次处理条数,闭包处理)
1、数据量过大,没办法一次性读取并处理
2、闭包处理中返回false即可结束查询
insertGetId:插入数据并返回自增的ID
getLastInsId:可以单独获取一次最后插入数据的ID
insertAll:插入多条数据
setField:更新某个字段
setInc:增加指定字段
setDec:减少指定字段
delete:可以根据指定的主键删除记录(可以删除多条)
聚合查询:count/max/min/sum/avg
whereTime:专门用于时间查询
子查询:只构造SQL语句,但是不执行,也可以用于SQL调试
1、select(false)
2、fetchSql(true)
3、buildSql()
注意:1和2的方式没有小括号
7、模型和关联
1、创建一个Model类
use think\Model
class User extends Model {}
初始化操作重写:initialize()
2、指定表名
protected $table = '带前缀的表名';
protected $name = '不带前缀的表名';
3、常见操作相关函数
新增:
save
saveAll
create
isUpdate(false)->save()
查询:
get(主键号),获取记录,得到的是对象,可以通过成员变量的访问方式获取字段值
toArray:将对象转换为数组
all:获取所有
getByXxx:xxx为指定的属性
修改:
先get()
再save()
update($data)
删除:
delete
destory(主键)
4、获取器和修改器
getXxxAttr
setXxxAttr
说明:
1、Xxx表示将表中的字段转换大驼峰的书写形式
2、getData('属性')获取原始数据
3、类的内部获取属性使用:getAttr('属性')
5、自动写入时间戳
1、全局配置
auto_timestamp = true
默认的create_time和update_time字段的类型为int
2、Model类内指定字段名
protected $createTime = 'xx';
protected $updateTime = 'xx';
3、内部开启关闭字段写入
整体操作:protected $autoWriteTimestamp = false;
单个控制:protected $createTime和protected $updateTime
6、软删除
1、删除只会修改指定的字段(delete_time)
2、查询是不会显示,需要使用withTrashed()
3、只查看已经软删除的数据onlyTrashed()
7、自动完成
insert和update属性可以指定在插入和更新操作时将默认的指写入或更新
8、模型关联(听不懂没关系,大不了多查几次)
一对一关联:(一个用户拥有一组详细信息)
主表模型
public function 关联表名
{
return $this->hasOne('关联表名','关联外键');
}
附表模型
public function 关联表名
{
return $this->belongsTo('关联表名','关联外键');
}
一对多关联:(一个用户发表多篇文章)
主表模型
public function 关联表名
{
return $this->hasMany('关联表名','关联外键');
}
附表模型
public function 关联表名
{
return $this->belongsTo('关联表名','关联外键');
}
多对多关联
public function 关联表名
{
return $this->belongsToMany('关联表名','中间表');
}
9、模型分层
数据层:负责数据的存取
逻辑层:处理相关的业务逻辑
服务层:负责多个业务逻辑才能完成的功能
\think\Loader::model('User');
\think\Loader::model('User','logic');
\think\Loader::model('User','service');
8、视图
fetch:渲染模板文件
1、默认定位规则:模块/view/控制器(小写+下划线)/方法(小写).html
2、'abc',渲染:模块/view/控制器(小写+下划线)/abc.html
3、admin@hello/world admin/view/hello/world.html
4、传递一个模板文件的全路径(带后缀.hmtl),路径相对于index.php
5、参数介绍
参数1:模板文件位置
参数2:以数组形式分配变量
参数3:模板文件中的字符串替换
6、全局字符串替换,修改view_replace_str
assign:分配变量
1、可以传递两个参数,分别作为名称和指
2、可以传递一个参数(数组),以键值对形式
9、模板
变量输出:
标量:{$var}
数组:{$data.name}或者{$data['name']}
对象:{$obj->name}或者{$data:name}
系统:已$Think开头的方式访问,无需分配
常量:{$Think.const.APP_PATH}或{$Think.APP_PATH}
配置:{$Think.config.xxx}
请求:{$Request.get.name}
使用函数:
1、使用'|'表示
2、###表示占位,作为函数的第一个参数可以不用写
3、=后跟函数的参数,多个需要用逗号隔开
使用默认值:
格式:{$var|default="默认值"}
说明:分配变量使用分配的,没有分配使用默认值
原样输出:
{literal}
Hello,{$name}!
{/literal}
模板布局:
使用场景:适合于一个网站的页面头尾相同,只有中间内容不同的时候
使用方式:
1、全局配置
'layout_on' => true, 全局开关
'layout_name' => 'layout', 模板文件
'layout_item' => '{__REP__}', 替换内容
若某个文件不要模板布局:{__NOLAYOUT__}
2、单个指定
1、无需开启全局配置
2、需要的模板文件开头添加{layout name="layout" /}
3、动态控制模板布局
开启:$this->view->engine->layout(true);
关闭:$this->view->engine->layout(false);
指定:$this->view->engine->layout(layout/xxx);
模板继承:
基础模板(base.html)中使用{block name="xxx"}{/block}
子模板中:
{extend name="base"}
可以重写基础模板中的block,具体删除、修改
循环输出:{volist}
name:指定分配过来的数据变量名
id:指定遍历操作中的每一个value
key:指定遍历的序号,默认为$i
$key:表示遍历中的键
原生PHP
{php}写php代码{/php}
10、跳转
成功:
函数:$this->success();
文件:dispatch_success_tmpl指定
失败:
函数:$this->error();
文件:dispatch_error_tmpl指定
重定向:
函数:$this->redirect()
11、日志记录
\think\Log::record() 手动写入自定义信息,不会立即写入文件,等请求结束自动写入
\think\Log::write() 手动写入自定义信息,立即写入文件
\think\Log::save() 手动写入内存信息,立即写入文件
12、错误及调试
全局开关:app_debug
trace开关:app_trace,会在右下角出现小图标
设置显示模式为console后更加隐蔽,非常适合热修改
404页面定制:
'http_exception_template' => [
// 定义404错误的重定向页面地址
404 => '404.html',
// 还可以定义其它的HTTP status
401 => '401.html',
]
说明:
1、错误页面的位置是相对于入口文件的
2、生效必须在部署模式下
13、验证
独立验证:
使用 \think\Validate类完成,需要制定验证规则及数据
验证器:(自定义一个验证类)
1、有自己的命名空间:app\index\validate
2、需要继承自 think\Validate类
自定义验证规则:
protected function checkNum($value, $rule, $data)
参数说明:1:验证的字段值,2:规则明,3:所有验证数据的数组
助手函数:validate()
14、杂项
session:
设置:Session::set(key, value)
获取:Session::get(key)
删除:Session::delete(key)
取值后删除:Session::pull(key)
清空:Session::clear()
助手函数:
设置:session(key,value)
获取:session(key)
检测:session(?key)
删除:session(key,null)
清空:session(null)
cookie:
用法同session基本一致
分页:think\Paginate
文件上传:
获取上传信息:file()
移动上传文件:move()
获取文件扩展名:getExtension
获取路径名:getSaveName
获取文件名:getFileName
获取错误信息:getError
验证:validate()
指定规则:rule()
验证码:
生成:
<div>{:captcha_img()}</div>
<div><img src="{:captcha_src()}" alt="captcha" /></div>
验证:
$this->validate([])
captcha_check(验证码)
图像处理:
根据功能查找函数
15、路由(通过特定的格式确定访问的资源文件)
路由模式:
普通模式:
url_route_on = false
默认采用pathinfo的方式
混合模式:(默认)
url_route_on = true
url_route_must = false
强制模式:
url_route_on = true
url_route_must = true
路由定义:
Route::rule('xxx', 'index/index/luyou','get');
资源路由:
restful风格:使用同一URL,能够根据请求方法类型完成不同方法的调用
域名路由:
开关:url_domain_deploy = true
添加域名解析:admin.tp5.com同样解析到public目录
Route::domain('admin','admin');
www.tp5.com/admin/index/index => admin.tp5.com/index/index
URL生成:
/模块/控制器/方法 + 参数
Url::build(路由信息,参数);
url(路由信息,参数);
<a href="{:url(路由信息,参数)}">