zoukankan      html  css  js  c++  java
  • ***ThinkPHP中的常用方法汇总总结:M方法,D方法,U方法,I方法

    thinkPHP中M()和D()的区别

    在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。通俗一点说:M实例化参数是数据库的表名。D实例化的是你自己在Model文件夹下面建立的模型文件
    例如:$user = new UserModel();
    等价于$user = D('user');
    如果实例化的是一个空模型
    例如 $Demo = new Model();
    那么它等价于 $Demo = M();
    ------------------------------------------------------------------------

    D和M的区别主要在于:M方法不需要创建模型类文件,M方法不会读取模型类,所以默认情况下自动验证是无效的,但是可以通过动态赋值的方式实现而D方法必须有创建模型类。我们可以用下面两种方法去创建一个数据表的映射对象第一种:$Test = D('Test')第二种:$Test = new Model('Test')虽然这两种都可以对数据进行select,insert,delete,udpate操作,在数据验证上有很大的不同,用第一种方式实例一个模型就会有数据检查功能,如果 title 没有填写的话就会提示 “请输入标题” (这个是tp提供的一个自动验证功能,当然也需要在相应的model中定义好验证条件);如果用第二种就没有了·····还有1个区别就是当用了$trueTableName后,必须用$test=d('test'),表示查询的是test表,如果用的是$test=m('test'),那么都表示查询的数据边是think_test。thinkphp2.0版本测试有如此上面的问题

    -----------------------------------------------------------------------------------------------

    通俗点说:D就是实例化一个基于Model文件的Model。M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在

    ============================================================================

    A快速实例化Action类库

    B执行行为类

    C配置参数存取方法

    D快速实例化Model类库

    F快速简单文本数据存取方法

    L 语言参数存取方法

    M快速高性能实例化模型

    R快速远程调用Action类方法

    S快速缓存存取方法

    U URL动态生成和重定向方法

    W 快速Widget输出方法

    D函数实例化的是你当前项目的Lib/Model下面的模块。如果该模块不存在的话,直接返回实例化Model的对象(意义就与M()函数相同)。而M只返回,实例化Model的对象。它的$name参数作为数据库的表名来处理对数据库的操作。


    ThinkPHP函数详解:U方法

    U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为:
    U('地址','参数','伪静态','是否跳转','显示域名');
    在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码。
    在模板中的调用格式需要采用 {:U('地址', '参数'…)} 的方式

    基本用法

    U方法的用法示例:

    1. U('User/add') // 生成User模块的add操作地址

    复制代码

    也可以支持分组调用:

    • U('Home/User/add') // 生成Home分组的User模块的add操作地址

    复制代码

    当然,也可以只是写操作名,表示调用当前模块的

    • U('add') // 生成当前访问模块的add操作地址

    复制代码

    除了分组、模块和操作名之外,我们也可以传入一些参数:

    • U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址

    复制代码

    U方法的第二个参数支持传入参数,支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,下面几种方式都是等效的:

    • U('Blog/cate',array('cate_id'=>1,'status'=>1))
    • U('Blog/cate','cate_id=1&status=1')
    • U('Blog/cate?cate_id=1&status=1')

    复制代码

    但是不允许使用下面的定义方式来传参数:

    • U('Blog/cate/cate_id/1/status/1')

    复制代码

    根据项目的不同URL设置,同样的U方法调用可以智能地对应产生不同的URL地址效果,例如针对:

    • U('Blog/read?id=1')

    复制代码

    这个定义为例。
    如果当前URL设置为普通模式的话,最后生成的URL地址是:

    • http://serverName/index.php?m=Blog&a=read&id=1

    复制代码

    如果当前URL设置为PATHINFO模式的话,同样的方法最后生成的URL地址是:

    • http://serverName/index.php/Blog/read/id/1

    复制代码

    如果当前URL设置为REWRITE模式的话,同样的方法最后生成的URL地址是:

    • http://serverName/Blog/read/id/1

    复制代码

    如果你同时还设置了PATHINFO分隔符的话:

    • 'URL_PATHINFO_DEPR'=>'_'

    复制代码

    就会生成

    • http://serverName/Blog_read_id_1

    复制代码

    如果当前URL设置为REWRITE模式,并且设置了伪静态后缀为html的话,同样的方法最后生成的URL地址是:

    • http://serverName/Blog/read/id/1.html

    复制代码

    如果设置了多个伪静态支持,那么会自动取第一个伪静态后缀添加到URL地址后面,当然你也可以手动在U方法里面指定要生成的伪静态后缀,例如:

    • U('Blog/read','id=1','xml')

    复制代码

    就会生成

    • http://serverName/Blog/read/id/1.xml

    复制代码

    路由支持

    U方法还可以支持路由,如果我们定义了一个路由规则为:

    1. 'news/:idd'=>'News/read'

    复制代码

    那么可以使用

    • U('/news/1')

    复制代码

    最终生成的URL地址是:

    • http://serverName/index.php/news/1

    复制代码

    域名支持

    如果你的应用涉及到多个子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如:

    1. U('Blog/read@blog.thinkphp.cn','id=1');

    复制代码

    @后面传入需要指定的域名即可。
    此外,U方法的第5个参数如果设置为true,表示自动识别当前的域名,并且会自动根据子域名部署设置APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自动匹配生成当前地址的子域名。
    如果开启了URL_CASE_INSENSITIVE,则会统一生成小写的URL地址。

    锚点支持

    3.1.2版本开始,U方法还可以支持生成URL地址中的锚点,例如:

    1. U('Blog/read#comment','id=1','html')

    复制代码

    就会生成

    • http://serverName/Blog/read/id/1.html#comment

    复制代码

    如果域名和锚点同时使用的话,注意顺序为先锚点后域名,例如:

    • U('Blog/read#comment@blog','id=1');

    ThinkPHP函数详解:I方法

    概述

    正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
    I('变量类型.变量名',['默认值'],['过滤方法'])
    变量类型是指请求方式或者输入类型,包括:

    变量类型含义
    get 获取GET参数
    post 获取POST参数
    param 自动判断请求类型获取GET、POST或者PUT参数
    request 获取REQUEST 参数
    put 获取PUT 参数
    session 获取 $_SESSION 参数
    cookie 获取 $_COOKIE 参数
    server 获取 $_SERVER 参数
    globals 获取 $GLOBALS参数

    注意:变量类型不区分大小写。
    变量名则严格区分大小写。
    默认值和过滤方法均属于可选参数。

    用法

    我们以GET变量类型为例,说明下I方法的使用:

    1. echo I('get.id'); // 相当于 $_GET['id']
    2. echo I('get.name'); // 相当于 $_GET['name']
    复制代码

    支持默认值:

    1. echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
    2. echo I('get.name',''); // 如果不存在$_GET['name'] 则返回空字符串
    复制代码

    采用方法过滤:

    1. echo I('get.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
    复制代码

    支持直接获取整个变量类型,例如:

    1. I('get.'); // 获取整个$_GET 数组
    复制代码

    用同样的方式,我们可以获取post或者其他输入类型的变量,例如:

    1. I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
    2. I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
    3. I('cookie.'); // 获取整个 $_COOKIE 数组
    4. I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD'] 
    复制代码

    param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:

    1. echo I('param.id'); 
    复制代码

    如果当前请求类型是GET,那么等效于 $_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST['id'] 或者 PUT参数id。
    并且param类型变量还可以用数字索引的方式获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如:
    当前访问URL地址是

    1. http://serverName/index.php/New/2013/06/01 
    复制代码

    那么我们可以通过

    1. echo I('param.1'); // 输出2013
    2. echo I('param.2'); // 输出06
    3. echo I('param.3'); // 输出01
    复制代码

    事实上,param变量类型的写法可以简化为:

    1. I('id'); // 等同于 I('param.id')
    2. I('name'); // 等同于 I('param.name')
    复制代码

    变量过滤

    使用I方法的时候 变量其实经过了两道过滤,首先是全局的过滤,全局过滤是通过配置VAR_FILTERS参数,这里一定要注意,3.1版本之后,VAR_FILTERS参数的过滤机制已经更改为采用array_walk_recursive方法递归过滤了,主要对过滤方法的要求是必须引用返回,所以这里设置htmlspecialchars是无效的,你可以自定义一个方法,例如:

    1. function filter_default(&$value){
    2.     $value = htmlspecialchars($value);
    3.  }
    复制代码

    然后配置:

    1. 'VAR_FILTERS'=>'filter_default'
    复制代码

    如果需要进行多次过滤,可以用:

    1. 'VAR_FILTERS'=>'filter_default,filter_exp'
    复制代码

    filter_exp方法是框架内置的安全过滤方法,用于防止利用模型的EXP功能进行注入攻击。

    因为VAR_FILTERS参数设置的是全局过滤机制,而且采用的是递归过滤,对效率有所影响,所以,我们更建议直接对获取变量过滤的方式,除了在I方法的第三个参数设置过滤方法外,还可以采用配置DEFAULT_FILTER参数的方式设置过滤,事实上,该参数的默认设置是:

    1. 'DEFAULT_FILTER'        => 'htmlspecialchars'
    复制代码

    也就说,I方法的所有获取变量都会进行htmlspecialchars过滤,那么:

    1. I('get.name'); // 等同于 htmlspecialchars($_GET['name'])
    复制代码

    同样,该参数也可以支持多个过滤,例如:

    1. 'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'
    复制代码
    1. I('get.name'); // 等同于 htmlspecialchars(strip_tags($_GET['name']))
    复制代码

    如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:

    1. echo I('get.name','','strip_tags'); // 等同于 strip_tags($_GET['name'])
    复制代码

    I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内置的filter_var方法进行过滤处理,例如:

    1. I('post.email','',FILTER_VALIDATE_EMAIL);
    复制代码

    表示 会对$_POST['email'] 进行 格式验证,如果不符合要求的话,返回空字符串。
    (关于更多的验证格式,可以参考 官方手册的filter_var用法。)
    或者可以用下面的字符标识方式:

    1. I('post.email','','email');
    复制代码

    可以支持的过滤名称必须是filter_list方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:

    1. int
    2.  boolean
    3.  float
    4. validate_regexp
    5. validate_url
    6. validate_email
    7. validate_ip
    8.  string
    9. stripped
    10. encoded
    11. special_chars
    12. unsafe_raw
    13. email
    14. url
    15. number_int
    16. number_float
    17. magic_quotes
    18. callback
    复制代码

    在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:

    1. I('get.name','',NULL);
    复制代码

    一旦过滤参数设置为NULL,即表示不再进行任何的过滤。

    再次认识thinkphp的I方法

    TkinkPHP 3.2.3版本之后,I函数增加了变量修饰符的功能,方便过滤变量和转换变量

    如:

    [php] view plain copy
     
    1. $id = I('get.id/d');  
    2. $ids = I('get.ids/a');  
    3. $userName = I('post.username/s');  
    4. $passWord = I('post.password/s');  

    I('变量类型.变量名/修饰符')

    可以使用的修饰符包括:

    修饰符作用
    s 强制转换为字符串类型
    d 强制转换为整形类型
    b 强制转换为布尔类型
    a 强制转换为数组类型
    f 强制转换为浮点类型

    来自:tp手册

  • 相关阅读:
    STL源码剖析之_allocate函数
    PAT 1018. Public Bike Management
    PAT 1016. Phone Bills
    PAT 1012. The Best Rank
    PAT 1014. Waiting in Line
    PAT 1026. Table Tennis
    PAT 1017. Queueing at Bank
    STL源码剖析之list的sort函数实现
    吃到鸡蛋好吃,看看是哪只母鸡下的蛋:好用的Sqlite3
    cJSON
  • 原文地址:https://www.cnblogs.com/kenshinobiy/p/9165662.html
Copyright © 2011-2022 走看看