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写入数据库的步骤就是:

  1. 配置 'SESSION_TYPE'=> 'Db',
  2. 创建session表 包含前缀: hd_session....
  3. 然后就是往 "$_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('分组名称/模块名/方法名称')









###
原文地址:https://www.cnblogs.com/bkylee/p/5408545.html