简介
alpha 版本
beta 版本
rc 版本 (候选版本)
r 版本 (正式版本)
路由
特别说明:路由形式的配置值,不影响我们在地址栏直接输入其他形式路由进行访问。该配置项直接影响的是tp系统封装的url组装函数(U函数)的生成url地址的形式。
分组
所谓分组,就是分功能块,前台归前台,后台归后台。
怎样创建分组,只要重新创建一个和 Home 结构一模一样的文件组。
模版常量
__ROOT__
默认就是当前网址。无需设置。
模版内容获取
$this->fetch();
// display 方法就是通过 fetch 来实现的。
注释
thinkphp注释是原生注释加上大括号。效果是网页查看源码也不能看到该注释。
命名空间
引用一个类,只要在同一个命名空间下,即使没有 include等 也可以直接使用。
乱码
在入口文件即index文件中加上一句header。
模版输出对象的内容
{$obj->name}
// or
{$obj : name}
模版中直接获取超全局变量
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
// 支持输出 $_SERVER、$_ENV、 $_POST、 $_GET、 $_REQUEST、$_SESSION和 $_COOKIE变量。
模版中函数使用
{$str|substr=0,5|strtoupper}
// ### 代表变量本身,如果变量本身的参数位置在第一个,或者,只有一个参数,可以省略 ### 。
模版中的默认值
{$str|default='nothing is here'}
模版 include 另一个模版如何传值
<include file='Public/footer' copyright='onegoal' />
<div> my copyright is [copyright] </div>
# M 方法和 D 方法的区别
D方法是实例化自定义模型,如果模型不存在,则实例化父类模型。M方法是直接实例化父类模型。
// 后期如果需要使用的操作在父类中已经封装好了就用M方法,否则请使用D方法,并在自定义模型中定制好自己的方法。
CURD
$table->addAll($arr);
$table->select();
$table->select(1);
$table->select(1,12,33);
$table->delete(); // 无法使用,没有条件不能使用
$table->delete(1);
$table->delete(1,12,33);
生产模式
生产模式下修改主配置文件,应用级别配置文件,系统函数库文件不会生效。因为通过跟踪页面信息的显示,在生产模式下这几个文件没有被加载。
获取最后一句sql
echo $model->getLastSql();
// 在3.2版本后,增加了一个它的别名
echo $model->_sql();
统计消耗
G('start');
for( $i=1;$i<100000;$i++ ){
$i++;
}
G('stop');
echo G('start', 'stop', 4);
// 第三个参数是数字,统计消耗的时间,且小数4位。
// 第三个参数是m,统计内存消耗,需要服务器支持。
AR模式
AR模式(Active Record)是一个对象-关系映射模型(ORM)。每个AR类代表一张数据表,数据表的字段在AR类中体现类的属性,一个AR实例表示表中的一行。
类 -> 模型类 -> AR属性/字段 -> 操作结果/表记录
人类-> 人 -> 衣服,帽子等 -> 劳动成果
// AR模式在tp中典型的应用,CURD操作
$model = M('Product'); // 实例化模型
$model -> 属性/表中字段 = 字段值; // 字段映射到值
$model -> CURD 操作; // 实例映射到表中的记录,CURD操作没有参数
// 增加操作
$model = M('Product'); // 实例化模型
$model -> price = 12; // 字段映射到值
$model -> date = 1452342343; // 字段映射到值
$model -> add();
// 更新操作
$model = M('Product');
$model -> id = 11; // 确定主键, 如果前面有select或者find操作,可以不用确定主键
$model -> price = 120;
$model -> date = 1452342343;
$model -> save();
// 删除
$model = M('Product');
$model -> id = '1,22'; // 可以是多个主键。 如果前面有select或者find操作,可以不用确定主键
$model -> delete();
// 辅助方法
$model = M('Product');
$model -> where( 'id > 12' );
$model -> field('id, name');
$model -> limit(2, 12);
$model -> select();
// 尽量使用连贯操作把上面代码写成一行。
fetchSql
即使在sql语法错误的情况下,依然能获取sql语句。
$model -> where() -> order() -> ... -> fetchSql( true ) -> CURD 操作;
create
当有很多属性的时候,一个一个的使用 $model -> price = 120;
比较繁琐
这时候可以使用create。create在表单中字段和数据表中字段不匹配的时候,该字段数据对象会被过滤。
// 有自动验证一定要传递创建对象后的结果
$model = D('Dept');
$data = $model -> create();
if(!$data){
echo $model->getError();
// $this -> error($model->getError());
}
开启批量验证
protected $patchValidate = true; // 返回的错误形式是一个数组
字段映射
<input name='ad'>
protected $_map = array('ad' => 'name');
在使用字段映射后,被映射的字段会被放到打印出来数组的最后,按照字段映射的先后顺序进行排列。
表名特殊(比如:没有前缀)
在模型中添加
protected $trueTableName = 'mytable';
session
session('?name'); // 判断存在,是true;否 false;
$allSession = session();
session(null); // 全部删除
cookies(null)有 bug
TP中只能使用绝对路径(尽量不用相对路径)来表示 js 和 css 中的路径。
文件引入
// config.php
'LOAD_EXT_FILE' => 'info, myfunction',
load('@/不带后缀的php文件名');
// 文件必须在分组级别的函数库目录中,只能用于定义的分组中。
联表查询
// 第一种:原生 sql
$model=M();
$sql='select t1.*,name as dpname from leon_user as t1,leon_product as t2 where t1.id = t2.uid';
$res=$model->query($sql);
// table()
$model=M();
$res=$model->field('t1.*,name as dpname')->table('leon_user as t1,leon_product as t2')->where('t1.id = t2.uid')->select();
// join()
$model=M('leon_user');
$res=$model->field('t1.*,name as dpname')->alias('t1')->join('left join leon_product as t2 on t1.id = t2.uid')->select();