刚接触thinkphp_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > 刚接触thinkphp

刚接触thinkphp

 2010/12/8 10:18:26  chengxianju  http://4nail.javaeye.com  我要评论(0)
  • 摘要:把学习到的thinkphp知识记录一下ThinkPHP默认使用UTF-8编码,所以请确保你的程序文件采用UTF-8编码格式保存,并且去掉BOM信息头(去掉BOM头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理)。过程中遇到这样问题:Trace信息当前页面:/模板缓存:./Runtime/Cache/0573c70d8602d961e53f714ea77bd87c.php请求方法:GET通信协议:HTTP/1.1请求时间:2010-11-1621:50:52用户代理
  • 标签:PHP

把学习到的thinkphp知识记录一下

?

ThinkPHP默认使用UTF-8编码,所以请确保你的程序文件采用UTF-8编码格式保存,并且去掉BOM信息头(去掉BOM头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理)。

?

过程中遇到这样问题:

Trace信息

当前页面 : /
模板缓存 : ./Runtime/Cache/0573c70d8602d961e53f714ea77bd87c.php
请求方法 : GET
通信协议 : HTTP/1.1
请求时间 : 2010-11-16 21:50:52
用户代理 : Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; POTU(RR:28031409:0); .NET CLR 1.1.4322; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; Alexa Toolbar; .NET CLR 2.0.50727)
会话ID : 3d03dd0e650faf290ba54531bb60f582
日志记录 : 6条日志
[ 2010-11-16T21:50:52+08:00 ] NOTIC: [2] session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at D:\thinkphp\index.php:1) ~runtime.php 第 2 行.
[ 2010-11-16T21:50:52+08:00 ] NOTIC: [2] session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at D:\thinkphp\index.php:1) ~runtime.php 第 2 行.
[ 2010-11-16T21:50:52+08:00 ] SQL: RunTime:0.002662s SQL = SHOW COLUMNS FROM think_demo
[ 2010-11-16T21:50:52+08:00 ] SQL: RunTime:0.000422s SQL = SELECT * FROM `think_demo`
[ 2010-11-16T21:50:52+08:00 ] NOTIC: [2] Cannot modify header information - headers already sent by (output started at D:\thinkphp\index.php:1) ~runtime.php 第 2 行.
[ 2010-11-16T21:50:52+08:00 ] NOTIC: [2] Cannot modify header information - headers already sent by (output started at D:\thinkphp\index.php:1) ~runtime.php 第 2 行.
加载文件 : 18
[0] => D:\thinkphp\index.php
[1] => D:\library\ThinkPHP\ThinkPHP.php
[2] => D:\thinkphp\Runtime\~runtime.php
[3] => D:\library\ThinkPHP\Common\convention.php
[4] => D:\thinkphp\Conf\config.php
[5] => D:\thinkphp\Conf\routes.php
[6] => D:\library\ThinkPHP\Common\debug.php
[7] => D:\library\ThinkPHP\Lib\Think\Util\Dispatcher.class.php
[8] => D:\library\ThinkPHP\Lang\zh-cn.php
[9] => D:\thinkphp\Lib\Action\IndexAction.class.php
[10] => D:\library\ThinkPHP\Lib\Think\Core\Model.class.php
[11] => D:\library\ThinkPHP\Lib\Think\Db\Db.class.php
[12] => D:\library\ThinkPHP\Lib\Think\Db\Driver\DbMysql.class.php
[13] => D:\library\ThinkPHP\Lib\Think\Util\Template\TemplateThink.class.php
[14] => D:\library\ThinkPHP\Lib\Think\Template\ThinkTemplate.class.php
[15] => D:\library\ThinkPHP\Lib\Think\Template\TagLib\TagLibCx.class.php
[16] => D:\library\ThinkPHP\Lib\Think\Template\TagLib.class.php
[17] => D:\thinkphp\Runtime\Cache\0573c70d8602d961e53f714ea77bd87c.php

?

把文件改成无bom的utf-8信息,就不会报错了

?

TP中的每一个xxxAction.class.php文件代表着一个应用模块,此Action中的每一个方法(function)代表着一个操作,操作分为有输出到模板的操作和只具执行不需要输出的操作。

?

/Lib/Action/IndexAction.class.php文件,我们看看里面的基础代码
class IndexAction extends Action{

?? public function index(){

??? }

}
代码理论知识:


1 在TP开发中,要增加一个应用模块,就在Action文件夹里建立一个类,类的文件命名格式是模块名称+Action.class.php。例如我们这里的应用模块是Index,所以定义文件名为IndexAction.class.php

2 应用模块类的定义要继承框架的Action类。要为这个应用模块添加一个操作,则定义一个以此操作为命名的function.例如上面的index操作。


在应有模块中,如果某个操作是需要页面显示的,只要对应在Myapp/Tpl/default/里建立一个文件夹,文件夹以应用模块的名称来命名,然后在这个文件夹下,建立一个以这个function名称来命名的html文件,就可以在这个方法中使用$this->display()方法来直接调用该模板

?

1 在/Tpl/default/下建立一个文件夹,根据应用模块的名称,我们将这个文件夹命名为Index

2 在/Tpl/default/Index/下建立一个html文件,根据操作名称,我们命名该文件为tpl.html

3 打开/Lib/Action/IndexAction.class.php文件,增加代码为

?public function tpl(){
?$value='hello thinkphp';
?$this->assign('name',$value);
?$this->display();
?}

tpl.html文件为:
?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

?<html>

?<head>

?<title>{$name}</title>

?</head>

?<body>

测试输出:{$name}

?</body>

?</html>

地址栏输入:http://thinkphp/index.php/Index/tpl
输出结果:
?http://thinkphp/index.php/Index/tpl
????????? 测试输出:??hello thinkphp


1 如果要同时输出多个模板变量,可以使用下面的方式:
$array = array();
$array['name']??? =??? 'thinkphp';
$array['phone']?? =??? '12335678';
$this->assign('array',$array);
$this->display();

在html中,要输出$array['name']的值,代码是

{$array.name} 或 {$array['name']}

tpl.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>{$name}</title>
</head>
<body>
<iterate name="array" id="vo">
{$vo}<br />
</iterate>
</body>
</html>

name='array'是指要循环的模板变量是array,id='vo'是指这个数据在模板输出时所使用的名称

如何在模板中使用运算符
看到论坛有很多人在提问如何在模板引擎中使用运算符的问题,其实TP内置的模板引擎早就支持运算符的使用,只不过需要注意一些使用上的事项:
用法很简单:

配置格式
ThinkPHP 框架中所有配置文件的定义格式均采用返回 PHP 数组的方式,格式为:

<?php return array(

? 'app_debug' =>? true ,

? 'url_model' =>? 2 ,

);?>
配置参数不区分大小写(因为无论大小写定义都会转换成小写)
但是习惯上保持大写定义的原则。

还可以在配置文件中可以使用二维数组来配置更多的信息,例如:

<?php return array(

? 'APP_DEBUG' =>? true ,

'USER_CONFIG' => array(

????????????? 'USER_AUTH' =>? true ,

????????????? 'USER_TYPE' =>? 2 ,

),

);?>


ThinkPHP 在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:

惯例配置 ->项目配置 -> 调试配置 -> 分组配置 ->模块配置 -> 操作(动态)配置

以上是配置文件的加载顺序,但是因为后面的配置会覆盖之前的配置(在没有生效的前提下),所以优先顺序从右到左。系统的配置参数是通过静态变量全局存取的,存取方式非常简单高效。

系统目前最多支持二维数组的配置级别,每个项目配置文件除了定义 ThinkPHP 所需要的配置参数之外,开发人员可以在里面添加项目需要的一些配置参数,用于自己的应用。项目配置文件的位置默认位于项目的 Conf 目录。

?
1.惯例配置
惯例重于配置是 ThinkPHP 的一个重要思想,系统内置有一个惯例配置文件(位于 Thinkphp\Common\convention.php ),按照大多数的使用对常用参数进行了默认配置。所以,对于应用项目的配置文件,往往只需要配置和惯例配置不同的或者新增的配置参数,如果你完全采用默认配置,甚至可以不需要定义任何配置文件。

2.项目配置
项目配置文件位于项目的配置文件目录(默认是 Conf )下面,文件名是 config.php 。
在项目配置文件里面除了添加内置的参数配置外,还可以额外添加项目需要的配置参数。
后面的开发指南中提及的配置参数设置如未特别说明,都是指在项目配置文件中定义

3.调试配置
?在Thinkphp\Common\convention.php决定是否开启调试模式,也可以在/Conf/config.php决定是否开启调试模式,('APP_DEBUG'=> false,?// 是否开启调试模式)


4. 分组配置
分组配置用于系统启用了分组模式的情况之下,对于每个分组可以单独定义自己的配置文件。
分组配置文件位于:项目配置目录 / 分组名称 /config.php
分组配置的定义格式和项目配置是一样的。分组名称区分大小写。

5. 模块配置
ThinkPHP 支持对某些参数进行动态配置,针对这一特性, ThinkPHP 还特别引入了模块配置文件的支持,这其实也是动态配置的体现。模块配置文件位于:
项目配置目录 / 模块名 ( 小写 )_config.php // 用于不使用分组的情况
或者?
项目配置目录 / 分组名 / 模块名 ( 小写 )_config.php // 用于使用分组的情况
模块配置文件的定义格式和项目配置相同。需要注意的是,有些配置参数在读取模块配置之前已经生效,因此可能会发生定义后不起作用的情况。


6.动态配置
之前的方式都是通过预先定义配置文件的方式,而在具体的 Action 方法里面,我们仍然可以对某些参数进行动态配置,主要是指那些还没有被使用的参数。
设置新的值:
C (' 参数名称 ' ,' 新的参数值 ' );
例如,我们需要动态改变数据缓存的有效期的话,可以使用
C (' DATA_CACHE_TIME','60');
动态改变配置参数的方法和读取配置的方法在使用上面非常接近,都是使用 C 方法,只是参数的不同。因此掌握 C 方法的使用对于掌握配置有着关键的作用。
也可以支持二维数组的读取和设置,使用点语法进行操作,如下:
获取已经设置的参数值:
C ('USER_CONFIG.USER_TYPE')
设置新的值:
C ('USER_CONFIG.USER_TYPE','1');

?


控制器
因此应用开发中的一个重要过程就是给不同的模块定义具体的操作。一个应用如果不需要和数据库交互的时候可以不需要定义模型类,但是必须定义 Action 控制器。

?

?

?

?

?

发表评论
用户名: 匿名