thinkphp学习笔记13-15集
13集: ThinkPHP3.1.3使用视频教程--后台登录验证与自动运行方法_标清.flv
14集: ThinkPHP3.1.3使用视频教程--自定义SESSION处理DB驱动与添加Redis处理驱动_高清.mp4
15集: ThinkPHP3.1.3使用视频教程--通过后台管理许愿墙贴子与分页类的使用_高清.mp4
在editplus中 编译IndexAction.class.php文件时, 会提示" cannot find class 'Action'"?
这是因为, 你直接编译 / 直接访问的是 IndexAction.class.php 文件本身!
不能这样访问IndexAction.class.php本身文件, 要通过 入口文件 index.php/Index/Index/index来访问!
判断是否通过 登陆 进入后台页面的方法?
可以通过IS_POst, 或者通过判断 if(!isset(\(_SESSION['uid'] || !isset(\)_SESSION['username'])), 在登陆页面写入 session.
关于!的使用: 在判断if(...)的时候, 直接写, 如果要判断 "没有..., 不是..."的时候, 就直接在原来 的条件前面加!.
||: 表示两者当中的任意一个条件的时候, 用或/
也可以在后台 对应的 类 IndexAction 等 都继承自 CommonAction, 而不是继承自基类 Action,
在CommonAction中写自动函数:
public function _initialize(){...} // initialize前只有一个下划线
然后在_initialize()方法中去判断是否是通过登陆页面进入的, 就去判断是否设置了 $_SESSION['id']等变量, 否则就跳转到登陆页面...
thinkphp中删除session?
用session_unset();
session_destroy();
判断字符串中是否包含子字符串(子字符)? int index= strpos($hay, \(needle); 从函数名称都可以看出来... // 不能用false==来判断, 要用=== 来判断
截取子字符串: substr(\)str, $start, $length)...
c/c++系列的{大括号通常是单独占一行, java, php系列的大括号{ 通常是在一行 的 末尾!
if(){}else{} ... if(){} elseif(){}
Dreamweaver设置文件编码: 默认的是utf-8编码, unicode 标准化表单: c(规范分解, 后跟规范合成)
将session不存入文件而是写入数据库?
默认的处理session是放在 .../wamp/tmp下的
tp处理session是在函数 THINK_PATH/common/functions.php中
if(C('SESSION_TYPE')) { // 读取session驱动 // 在自定义conf中配置: 'SESSION_TYPE'=> 'Db' 必须这样设置, 因为系统中只定义了SessionDb类
$class = 'Session'. ucwords(strtolower(C('SESSION_TYPE')));
// 检查驱动类
if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')) {
$hander = new $class(); // 生成了SessionDb 类
$hander->execute();
}else {
// 类没有定义
throw_exception(L('_CLASS_NOT_EXIST_').': ' . $class);
}
}
// 启动session
if(C('SESSION_AUTO_START')) session_start();
所以将session写入数据库的步骤就是:
- 配置 'SESSION_TYPE'=> 'Db',
- 创建session表 包含前缀: hd_session....
- 然后就是往 "$_SESSION['username']中写数据
ucwords ucfirst lcfirst
这些都是php本身自带的内置的函数:
ucwords('hello world'); // output is: Hello World
ucfirest('hello world'); Hello world
lcfirst('HELLO WORDL'); // hELLO WORDL
函数G写法的借鉴
在函数内部用static 关键字, 变量名的风格是: $_xxxx.
function G($start,$end='',$dec=4) {
static $_info = array();
static $_mem = array();
if(is_float($end)) { // 记录时间
$_info[$start] = $end;
}elseif(!empty($end)){ // 统计时间和内存使用
.........other codes/////
/**
* 优化的require_once
* @param string $filename 文件地址
* @return boolean
*/
function require_cache($filename) {
static $_importFiles = array();
if (!isset($_importFiles[$filename])) {
if (file_exists_case($filename)) { // file_exists_case()区分大小写的来判断文件是存在.
require $filename;
$_importFiles[$filename] = true;
} else {
$_importFiles[$filename] = false;
}
}
return $_importFiles[$filename];
}
页面布局版式上 注意 "内容横向上的长度 要控制, 适当的 多向纵向排列 :: 布局上不用table, 而在内容表现上可以考虑多采用表格/图表/图片的手段" 的用法
表格的内容可以实现 分组: thead, tbody, tfoot, 如果这样使用的话, 表格总是从 头/body/foot的顺序显示, 而不管他们书写的先后顺序
每个分组都要包含完整的 tr>...td>.../td> /tr>
<table border="1">
<thead>
<tr>
<th>Month</th>
<th>Savings</th>
</tr>
</thead>
<tbody>
<tr>
<td>January</td>
<td>$100</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>Sum</td>
<td>$180</td>
</tr>
</tfoot>
</table>
*{margin:0;padding:0}的写法叫css reset, 据说有性能问题...
=================================
tp如何写Redis 的session存储机制?
php的函数命名: 总是以某一类 / 要处理的对象关键字 / 等开头...
user-level自定义的session storage 机制:
session_set_save_handler(...)
这里有两个函数:
call_user_func()调用回调函数: 可以是全局函数, 也可以是类的静态/非静态方法.
有些诸如 call_user_function() 或 usort() 的函数接受用户自定义的函数作为一个参数。Callback 函数不仅可以是一个简单的函数,它还可以是一个对象的方法,包括静态类的方法。
一个 PHP 函数用函数名字符串来传递。可以传递任何内置的或者用户自定义的函数,除了语言结构如 array(),echo(),empty(),eval(),exit(),isset(),list(),print()和 unset()。
一个对象的方法以数组的形式来传递,数组的下标 0 指明对象名,下标 1 指明方法名。
对于没有实例化为对象的静态类,要传递其方法,将数组 0 下标指明的对象名换成该类的名称即可。
session_set_save_handler(callback \(open....)的参数是回调函数. 由于这里调用的回调是类的方法, 所以采用数组的方式, 数组的第一元素是: 类名: 类名要是传引用; 第二个元素是 回调的函数名或方法名, 所以就是: array(&\)this, 'open'), array(&$this, 'close'),.....
session的处理机制有6个方法, 分成3组:
open($id, \(name), close()| read(\)id), write($id, \(data)|destroy(\)id), gc($maxLifeTime).
对于分组项目, 链接跳转地址的写法:
href={:U('Admin(分组)/MsgManager(控制器 模块)/index(方法))}
对于分组项目, 链接跳转地址的写法:
href={:U('Admin(分组)/MsgManager(控制器 模块)/index(方法))}
### thinkphp中引入css文件?
使用css标签: <css file='__PUBLIC__/Css/public.css' />
使用js标签 <js file='__PUBLIC__/Js/public.js' />
### tp中如何使用分页类?
<font color="red">
## // 这里直接就写 ORG开始了, 包括tp的很多地方, 系统在 内部 都已经规定了 路径的前面部分(前缀) 所以写路径的时候, 就直接按照tp的规定 写后面的路径部分就可以了.</font>
### 首先要导入 分页类: import('ORG/Util/Page'); // tp自动就设置了导入类库的路径是: Think_Path/Extend/Library/
Page类的new: 如果类有同名的函数则new时调用那个同名函数, 否则就调用 __construct函数.
Page的__construct构造函数需要两个变量: $totalRows, $listRows
Page类的成员变量.
有public成员 : $url, $parameter, $firstRow, $listRows, 注意其他有些是 protected成员, 如$totalRows $totalPages, $nowPage, $config等.
## 扩展的Page类中的函数?
Page类有三个函数,
1. 一个是Page类的构造函数 __construct
2. 一个是设置Page的保护成员$config的: setConfig. 因为可以在$config中 自定义的加入你要显示提示内容等等
3. 一个就是最重要的show( )函数, 它返回在 分页页面的最低处要显示的 字符串内容, 是通过 str_replace($this->config['theme']...)中的相关内容来实现的,你可以返回这个字符串, 并把它分配到 模板页.
## 使用左右alt键 的方法是: 放在空格键上的 左右大拇指!
## 方法页面的变量 必须经过分配后, 才能在模板页使用输出, 这是为了安全! 但是分配的方法有两种:一是使用assign, 另一种是使用$this->tpl_var = $var. 感觉后一种方法更直接!! 能够识别和习惯使用这种直接输出的方式: 实际上当前类中, 是没有定义这样的 成员变量的, 所以这种写法就是这样的...
<font color="red">而且可以分配多个变量, 写多个$this-> var1 = $var1; $this->var2 = $var2 而assign要通过数组来分配多个模板变量 </font>
M方法中, 最后的应该是select方法, 倒数接着是: limit, 再接着是order等...顺序不应该乱!
\#\#在thinkphp中 有的地方写 点语法不行, 比如在模板页使用传递过来的变量时, 就不能用点语法来写哦. 但是, 数组的写法总是可以的, 所以为了安全起见, 建议
数组/对象? 都用 [] 中括号数组的写法形式.
关于NULL的写法: 有些时候可以写成为null, 但是写成NULL是一定可以的, 也推荐写成NULL
编程中 关于加不加引号的问题?
一个核心, 一个宗旨就是 : 主要是进行分析语义:
函数, 只有当在调用的时候, 它表示是一个函数的时候, 才直接用, 不加引号
数字变量, 只有当它表示数字的时候, 才直接使用, 不加引号: 0和"0", 前者表示数字数值0, 后者表示字符0.
true/false, 只有当它表示 逻辑值时, 才直接使用, 不加引号.
等等.....
其他所有的地方, 根据语义分析, 凡是不是表示 其本义 的时候, 只是 引用/表示 它的名称的 时候, 都使用 字符串, 用引号括起来!!
thinkphp有两个重要的函数文件:
common.php是tp的 基础函数库
functions.php 是tp的标准模式下的 公共函数库.
****** 借鉴tp的设计思想: 设计一个函数时, 为了减少函数的个数, 尽量扩展/增加函数的功能! 那就是适当增加函数的参数, 在一个函数中可以实现多个/多种 功能! 如success和error, 除了显示提示信息时, 还可以 指定跳转地址:
success($message, [$jumpUrl], [$ajax])...
记住: success和error是Action类的方法, 因为它是表示 Action类中操作/方法 是否成功的/失败的 情况, 所以不是全局函数.
Db.class.php中的数据库类中的delete函数方法, 中的变量, 可以是数组, 如果是删除的主键, 可以直接传递该主键 , 如:
M('wish')->delete($id); 传统的方法是: M('wish')->where(array('id'=>$id))->delete();
U方法: 在php文件中, 就可以直接调用它就可以了, 在模板中要用: {:U('..')}...
U方法中地址的写法:
如果是 非分组, 就直接写方法名称(在本模块内部)
如过是 分组, 只有一个入口文件, 就要写完整: U('分组名称/模块名/方法名称')
###