ThinkPHP框架学习笔记
一、国内主流框架使用率
二、ThinkPHP框架是基于MVC思想的国产框架
1) MVC思想
2) 框架 = 毛坯房
框架是程序结构代码的集合,而不是业务逻辑代码。集合中包含了许多类、函数和功能类包。这个集合是按照有一定标准组成的功能体系。体系有很多设计模式,比如MVC等。
三、TP框架基础
特点:
1) 单一入口框架
2) 创建入口文件【ThinkPHP 3.1.3】
<?php
define('APP_NAME', 'Admin');
define('APP_PATH','./Admin/'); //注意APP后面加/,不加会有问题<br>
require('./ThinkPHP/ThinkPHP.php');//里面注意大小写
3) 目录结构【当前项目】
|common 存放当前项目的公共自定义函数
|Conf 存放当前项目的配置文件
|Lang 存放当前项目的语言包
|Lib 存放当前项目的控制器和模型【C和M】
||ACTION 存放MC中的Controller
||Behavior 存放thinkPHP行为管理的目录
||Model 存放项目的模型文件
||Widgt 组件
|Tpl存放项目模板【V】
|Runtime 存放当前项目的运行时文件
||Cache 存放模板缓存
||Data 存放数据目录
||Logs 存放日志
||Temp 存放数据缓存
||~runtime.php 编译后加载的文件
||Tpl 存放当前项目的模板文件
四、框架简单操作
1) ThinkPHP的运行流程:
1.加载ThinkPHP.php【require('./ThinkPHP/ThinkPhp.php');】
2.加载./thinkPHP/LIB/core路径下的核心文件
3.加载项目的文件->分析URL->调用相关的控制器
示例URL:http://localhost/index.php?m=index&a=index
m->module 模块 控制器
a->action 方法 action= 页面
2) 配置文件
1.大写的C方法就是config缩写 C('name');
2.开启dubug,define('APP_DEBUG',TRUE);
3.加载自定义配置文件user.php,就是在config.php里面引入’LOAD_EXT_CONFIG‘=>’user‘,并且自定义配置文件不是被项目定义,每次都会加载,建议不要自定义配置文件
3) URL模式【URL_MODEL】
0 普通模式 http://localhost/test/index.php?m=Index&a=index&id=1
1.PATHINFO模式 http://localhost/test/index.php/Index/index/id/1.html
2.重写模式 http://localhost/test/Index/index/id/1.html
3.兼容模式 http://localhost/test/index.php?s=/Index/index/id/1.html
建议使用PATHINFO模式
U方法 : 构造一个URL并返回
U('模块/方法',array('id' => 1),'xxxx html htm shtml',true/false,'localhost');
可以在配置文件中更改URL 模式
'URL_MODEL' => 0/1/2/3
4) 隐藏URL【隐藏入口文件】
thinkPHP中url模式中隐藏入口文件index.php的方法:
①httpd.conf配置文件中加载了mod_rewrite.so模块 //在APACHE里面去配置
#LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉
②AllowOverride None 讲None改为 All
在APACHE里面去配置 (注意其他地方的AllowOverride也统统设置为ALL)
<Directory "D:/server/apache/cgi-bin">
AllowOverride none 改 AllowOverride ALL
Options None
Order allow,deny
Allow from all
</Directory>
③确保URL_MODEL设置为2,在项目的配置文件里写
return Array(
'URL_MODEL' => '2',
);
④.htaccess文件必须放到跟目录下
这个文件里面加:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
5) URL伪静态【有利于搜索】
url伪静态在配置文件中配置'URL_HTML_SUFFIX'=>'shtml|html|xml'//URL伪静态后缀设置,默认html
设置伪静态有助于搜索引擎找到该页面,更轻易被蜘蛛爬虫抓取。
五、模板【界面】技术【中的标签 + {} + <?Php ...?>】
(一)建立项目模板
调用模板时使用$this->display();
调用建立好的模板 $this->display('test');
$this->display('Index/test')
$this->display()会默认调用相应与控制器同名的tpl文件夹下的html文件
(二)模板赋值和输出
在action里面 定义
$name='xxx';
$this->name=$name;
<?php
echo $name;
?>
第二种方式:
$this->assign("变量名","值")->assign();//可以连续赋值
♥$this->display();
(三)模板引擎
基于xml模板引擎
支持文件包含,多级标签循环
一次编译多次运行
支持变量输出
自动去掉html空白代码
(四) 模板引擎的变量输出和运算
建与之相对应的模板文件,在Tpl下新建index文件夹,在index.html中输出变量的方法如下:
1、{$me['name']}//数组的形式
2、{$me.name}//类java的形式
{//$me.name}//在模板中的注释方式
3、如果在控制器中未定义此变量又想输出,临时赋值方式为:{$me.sex|default='man'}
4、若想对变量进行+ - * / %运算,一定要使用{$me['age']}这种数组方式进行运算,如:{$me['age']+1}
(五)模板引擎的函数调用和系统参数输出
{$me['name']|md5|substr=0,5} //调用md5加密函数对数据进行处理,再截取字符长度为从第0个字符到第5个字符,最后输出
{$now|date='Y-m-d H:i:s',###} //$now为函数time()的原始参数,使用date进行日期格式规范化,###代表$now本身(使用它是为了避免编译程序误解$now为输出值)
{$Think.now} //Think自带的格式化的日期时间
{$Think.version} //Think的版本
{$Think.server.http_host} //连接的服务器地址
(六) 模板引擎的volist和foreach【都是标签】
$person=array( //定义一个数组
1=>array('name'=>'jack','age'=>'18'),
2=>array('name'=>'Tom','age'=>'19'),
3=>array('name'=>'Peter','age'=>'20'),
4=>array('name'=>'Mary','age'=>'21'),
);
$this->assign('person',$person); //将数组传输给模版
//展示数组所用函数,看起来很像HTML标签,但是不是.offset开始截取的第几个数据条,length截取的条数
//当name不为person时无法输出,id不为data时只输出非定义量(HTML内容)部分
<volist name='person' id='data' offset='1' length='2' empty='我没数据'>
{$data['name']}----{$data['age']}<br>
</volist>
//foreach函数不能直接进行截取,只能通过外部的方法进行
//当name不为person时无法输出,当item不为data时重复输出最后一个至数组长度耗尽
<foreach name='person' item='data'>
{$data['name']}----{$data['age']}<br>
</foreach>
(七)模板引擎之for循环【模板界面里的for循环】
eq(=), neq(!=), gt(>), egt(>=), lt(<), elt(<=), heq(===), nheq(!==)
<for start="开始值" end="结束值" step="步进值" comparison="符号(默认lt)" name="循环变量名" >
</for>
(八)模板引擎之if判断
在模板中使用IF,一定要注意elseif 和 else 后面的结束 /
<if condition='$num lt 10'> num小于10
<elseif condition='$num gt 10/> num 大于 10
<else/> num 等于 10
</if>
(九)模板引擎之switch判断标签
<?php?>
$fruit = 'pingguo';
$this -> assign('fruit',$fruit);
<html/>
模板中使用switch 标签,default 注意 /
<switch name='name'>
<case value='pingguo'>我不爱吃</case>
<case value='hongzao|putao'>我爱吃</case>
<default/> 其他的视情况而定
</switch>
<hr/>
(十)模板引擎之比较符【相当于if判断】
<比较标签 name='变量名' value='比较的值'></比较标签>
<eq name='num' value='10'>num=10<else/> num!=10</eq>【方法一】
<compare name='num' value='10' type='eq'>num=11<else/> num!=11</compare>【方法二】
(十一)区间判断【in/notin = range betwewn/notbetwwen】
<in name='num' value='1,2,3'>在</in>(判断是否在1,2,3之间)
<notin name='num' value='1,2,3'>不在</notin>
<in name='num' value='1,2,3'>在<else/>不在</in>
<between name='num' value='1,10'>在</between>(判断是否在1到10之间)
<notbetween name='num' value='1,10'>在</notbetween>
<between name='num' value='1,10'>在<else/>不在</between>
<range name='num' value='1,2,3' type='in'>在<else/>不在</range>(type的值在3.1版本中只能为in/notin,而在3.2版本中可以用in/notin/between/notbetween【只能替换in和notin】
(十二)模板引擎之三元运算符【在html页中{ $num>10?大于10:不大于等于num } 】
(十三)模板案例实战
一、循环判断
<foreach name='person' item='data'>
<egt name='data.age' value='18'>{$data.name}已经成年了<else/>还没是个孩子</egt><br/>
</foreach>
二、还可以使用php原生态的书写方式:
方式一:
<php>echo $name.'年龄是'.$num.'岁';</php><br />【建议使用】
方式二://一般不推荐这种方式,有可能不能识别
<?php echo $name; ?>
六、ThinkPHP框架的调试方法
七、数据库操作
1. 数据库配置文件配置
'DB_TYPE'=>'mysql', //数据库类型
'DB_HOST'=>'localhost,localhost1,localhost2', //数据库服务器地址,多服务器用逗号隔开
'DB_NAME'=>'think', //数据库名
'DB_USER'=>'root', //数据库用户名
'DB_PWD'=>'', //数据库密码
'DB_PORT'=>'3306', //数据库端口
'DB_PREFIX'=>'tk_', //数据库表前缀
//开启主从读写分离
'DB_RW_SEPARATE'=>true, //读取从服务器,写入主服务器,实现负载均衡
//多个主数据库服务器
'DB_MASTER_NUM'=>'2',
2. 实例化模型【new XX】
1.实例化基础模型
$user=new Model('admin');//表名,表前缀,数据库连接信息
$user=M("pro");//表名,表前缀,数据库连接信息
$data==$user->select();
2.实例化自定义模型【继承Model类】
$user=new adminModel();
$user=D("admin");//先找自定义模型,找不到会自动切换成M()方法
echo $user->getinfo();
3.实例化公共模型【可以上自定义模型继承公共模型】
$user=new CommonModel();
echo $user->strmake("aaa");
$user=D("User");
echo $user->strmake("abc");
4.实例化空模型【项目里不推荐,原生的sql语句,除非特别复杂的sql语句】
$model=M();
$sql="select * from imooc_admin";
$data=$model->query($sql);//读:select
$model->execute($sql);//写:update,insert,delete【返回影响的行数】
3. 数据库操作—添加数据
//add创建,创建多条数据
M('user')->add($data)
$data是数组,返回插入的id
M('user')->addAll($data),
此处$data为内嵌多个数组,这里addAll(),插入多条数据,只适合mysql数据库
【调试】:
1.M()->getLastSql();获取所执行的sql语句
2.Conf—>debug.php->显示页面trace信息->$this->dieplay();
4. 数据库操作—数据查询
1.直接用字符串进行查询
$data=M('User')->where('id=1')->select();
2.使用数组方式进行查询
$where['user_name']="xiaoming";//查询条件
$where['_logic']='or';//查询方式
3. 表达式查询
//eq(=) neq(!=) egt(>=) gt(>) lt(<) elt(<=)
//like(like) between (between and) not between(not between and) in (in) not in (not in) and(and[默认])
//$where['字段名']=array('表达式',查询条件);
//$where ['id']=array('lt',3);//查询<3的数据
$where['id']=array('between','1,8');//查询id是1到8的数据
$where['id']=array('lt'3);//查询id<3的数据
$where['user_name']=array('like',array('%ming','xiao%'));//查询user_name模糊等于%ming 模糊等于xiao的数据
4.区间查询
where['id']=array(array('gt',100),array('lt',3),'or');//查询>100 或者<3的数据
5.混合查询
$where['id']=array('gt' 10);//查询id>10的数据
$where['_string']='scoer>10';// 查询scoer>10的数据
6.统计用法
// count统计数量 可选
// max 获取最大值 必须传入 统计的字段名
// min 获取最小值 必须传入 统计的字段名
// avg 平均值 必须传入 统计的字段名
// sum 求和 必须传入 统计的字段名
$data =M('user')->min('id');//查询语句(其中id是传入的值)
5. 数据库操作—更新数据
$update['score'] = 60;
$where['id'] = 1;
$data = M('User')->where($where)->save('update');
$data = M('User')->where($where)->select();
dump($data);
6. 数据库操作—删除数据
方法1,利用where删除
$where["id"]=21;
$data=M("admin")->where($where)->delete();
方法2,直接在delete方法中传入主键值
echo M("admin")->delete(20);
7. ThinkPHP CRUD 连贯操作—order排序
order(字符串) 多个条件用英文逗号隔开
$data = M('User')->order('score desc,id asc')->select();
dump($data);
8. ThinkPHP CRUD 连贯操作—field($string,false/true);
field($string,false) $string 传入多个字段名,多个字段用逗号分隔,
// 第二操作默认为false,即查$string中的字段。设为true时,查询除$string之外的所有字段
// 这些连续操作都必须在select方法之前
$data= M("admin")->field('username,email')->order('username,id asc')->select();
dump($data);
9. ThinkPHP CRUD 连贯操作—
10. ThinkPHP CRUD 连贯操作—
11. ThinkPHP CRUD 连贯操作—
12. ThinkPHP CRUD 连贯操作—
13. ThinkPHP CRUD 连贯操作—
14.
八、命名范围的使用