ThinkPHP学习

ThinkPHP

按照MVC模式开发的一个框架,也叫TP框架。
优点:
1.  快速,稳定的搭建系统程序
2.  可以使开发人员精力集中在业务逻辑上,不需要关心程序的底层架构
3.  可以节省大量的代码,后期的升级、维护、优化十分方便
4.  有利于团队的代码风格统一。
相关的一些框架
1、zend framework
zend公司开发的官方的框架,功能很强大,重量级框架。
2、Yii
国人自己开发的重量级框架,该框架的特点就是代码的可重用性非常好。
3、CI(code Igniter)
    轻量级的框架,
4、cakePHP
    外国的PHP开发框架
5、ThinkPHP
这是国人开发的,免费、开源的,简单的、面向对象的,轻量级的PHP框架。



在ThinkPHP\Library\Think文件夹中,几个重要的文件
1、App.class.php     框架核心类文件
2、Think.class.php       每次请求都要执行的类
3、Controller.class.php      控制器的父类
4、Model.class.php       模型的父类
5、View.class.php            试图的父类


搭建ThinkPHP的环境
在站点下新建index.php,代码如下
define("APP_PATH",'./Application/');
require './ThinkPHP/ThinkPHP.php';

运行后出现欢迎界面,在说明系统自动生成了ThinkPHP的项目目录,并写入了初始的控制器和方法。



创建控制器
1.  控制器存放在Controller文件夹中
2.  命名规范:控制器的名称+Controller.class.php
3.  类名和文件的名称要一致
4.  类名用帕斯卡命名法

5.  尽量区分大小写,windows不区分大小写,但Linux中区分
6.  ThinkPHP默认的编码是UTF-8的。
7.  如果地址中没有写控制器,这默认调用Index控制器,如果没有写方法,则默认调用index方法

命名法:
1、帕斯卡命名法:首字母大写   UserName   MyNameIsLiping
2、骆驼命名法:userName     _user_name
3、匈牙利命名法:前缀(类别)+名字     radSex    txtUsername   iIength  oStu


ThinkPHP的路由

'VAR_MODULE' => 'm',  //默认模块获取变量
'VAR_ADDON' => 'addon',  //默认插件控制器命名空间变量
'VAR_CONTROLLER' => 'c', //默认控制器获取变量
'VAR_ACTION' => 'a',  /默认操作获取变量


1.普通模式
localhost/index.php?m=home&c=goods&a=show

2.pathinfo模式
http://网址/入口文件(index.php)/分组(平台)/控制器/方法
localhost/index.php/home/goods/index  

3.rewrite()重写模式
4.兼容模式
参数s=/分组/控制器/方法。
localhost/index.php?s=/home/goods/show

ThinkPHP中,默认使用pathinfo模式。




定义和调用TP的模板
所有的模板都要放在view文件夹下。
规则:一个控制器对应一个文件夹,一个方法对应一个文件

TP模板的调用
public function index(){
    //$this->display();    当前控制器的方法
    //$this->display("show");   //当前控制器的show方法
    //$this->display("Goods/index"); //Goods控制器下的index方法
    $this->display("./Application/Public/test.html");  模板页面的绝对地址
}


TP系统常量
function show(){
    echo '<meta charset=utf-8 />';
    echo '当前请求的地址:'.__SELF__.'<br>';
    echo '当前分组:'.__MODULE__.'<br>';
    echo '当前控制器:'.__CONTROLLER__.'<br>';
    echo '当前方法:'.__ACTION__.'<br>';
}



* 项目后台的搭建

1、在Application文件夹下新建一个Admin文件夹,在Admin文件夹中新建Controller和View文件夹。

2、在Admin\Controller控制器中新建一个LoginController.class.php页面,代码如下:

namespace Admin\Controller;
use Think\Controller;

class LoginController extends Controller{
    public function login(){
        $this->display();
    }
}

3、在login.html中更改css、js、img的路径

<link href="/Application/Admin/Public/css/user_login.css" type="text/css" rel="stylesheet">

<body id="userlogin_body">
    <form action="__NODULE__/Manager/index" method="post">
        ...
    </form>
</body>


4、在Admin\Controller文件夹中新建ManagerClass.php文件

namespace Admin\Controller;
use Think\Controller;

class ManagerController extends Controller{
    public function index(){
        $this->display();
    }
    
    public function head(){
        $this->display();
    }
    
    public function left(){
        $this->display()
    }
    
    public function right(){
        $this->display()
    }
}

5. 对应的index文件
</head>
    <frameset border=0 framespacing=0 row="60,*" frameborder=0>
        <frame name=head src="__URL__/head" frameborder=0 noresize scrolling=no>
            <frameset>
                <frame name=left src="__URL__/left" frameborder=0 noresize />
                <frame name=left src="__URL__/right" frameborder=0 noresize scrolling=yes />
                </frame>
            </frameset>
        </frame>
    </frameset>
    <noframes>
    </noframe>

6、注意更改index、head、left、right页面中的路径

  • ThinkPHP的开发模式
tp框架有两种使用模式:开发模式(调试模式),一种是生产模式(运行模式)
define('APP_DEBUG', true);  //调试模式
define('APP_DEBUG', false);  //调试模式

运行模式会把很多核心文件代码缓存成" common~runtime.php"文件,把原来每次需要加载许多文件的请求现在只要请求一个缓存文件,节省了很多文件的打开,关闭的开销。



在页面的底部显示日志信息
在配置文件中,添加如下配置
return array(
    'SHOW_PAGE_TRACE' = > true
);
配置完成后,在浏览器的右下角会显示php logo。


如果想看源码的话,在behavior文件夹下的ShowPageTraceBehavior.class.php

public function run(&$params){
    if(!IS_AJAX && !IS_CLL && C('SHOW_PAGE_TRACE')){
        echo $this->showTrace;
    }
}

把ThinkPHP的引擎改成Smarty

return array(
    'TMPL_ENGINE_TYPE'=>'Smarty',
);

Smarty引擎存放在vender目录下

smarty驱动存放在Library/Think/Template/Driver 下的Smarty.class.php

若想修改Smarty的配置(不建议修改)

'TMPL_ENGINE_CONFIG' => array(
    'template_dir'=>'',
    'compile_dir'=>'',
    'cache_dir'=>''
);


空操作
系统在找不到请求的方法的时候,会定位到__empty()方法处理,利用这个机制,我们可以对用户请求的不存在的所有操作进行统一处理。

public function _empty(){
    echo '<meta charset=utf-8 />';
    echo '非法操作';
}


空控制器
当系统请求找不到控制器,会定位到空控制器上EmptyController。

<?php 
    namespace Admin\Controller;
    use Think\Controller;
    
    class EmptyController extends Controller{
        public function _empty(){
            echo '<meta charset=utf-8 />';
            echo '页面不存在';
        }
    }
?>

跨控制器调用
1、直接实例化
public function test(){
    $obj = new ManagerController();
    $obj->managertest();
}

2. A()
A()用来实例化其他控制器的。

$obj = A("Manager");
$obj->managertest();

3、R()
R()和A()基本一样,唯一不同的是R()函数在实例化控制器的时候把操作方法一起传递过去,省略了方法的调用
R('Manager/managertest');



  • TP框架的配置文件
惯例配置:ThinkPHP/conf/convention.php
应用配置:Application/Common/conf/config.php
调试配置:Application/Common/conf/debug.php
模块配置:Application/Home/conf/config.php

加载顺序
惯例配置->应用配置->调试配置->模块配置

优先级:
模块配置>调试配置>应用配置>惯例配置

C('配置的名称')  用来获取配置信息。

判断
<if  condition='表达式'>

<elseif  condition='表达式' />

<else/>

</if>
  • TP表达式中运算符
PHP运算符 对应TP中的运算符
< lt
> gt
== eq
>= egt
<= elt
使用:

your scores: {$score}<br>

<if condition='$score egt 90'>
    你是我的骄傲
<elseif condition='$score egt 80'>
    Good!
<elseif condition='$score egt 70'>
    Well!
<elseif condition='$score egt 60'>
    Come on!
<else/>
    Try Again!
</if>


循环

<for start='开始值' end='结束值' comparison="" step="步长" name="循环变量名">
    
</for>


<for start='1' end='100' step="10" name='b'>
    {$b}:hi<br>
</for>



连接数据库

<?php 
    return array(
        'SHOW_PAGE_TRACE'=>TRUE,
        'DB_TYPE'=>'mysql',
        'DB_HOST'=>'localhost',
        'DB_NAME'=>'db_name',
        'DB_USER'=>'root',
        'DB_PWD'=>'123',
        'DB_PORT'=>'3306',
        'DB_PREFIX'=>'sw_',  //数据库表前缀
    );

?>

在配置文件中,做如上的配置,即可连接数据库

  • 创建Model模型
把"Home/Model"文件夹剪切到Application文件夹下,让Home和Admin共同使用。
第一种实例化模型的方法
public function test(){
    $goods = new \Model\GoodsModel();
    echo '<pre>';
    var_dump($goods);
}

第二种:
public function test(){
    $goods=M("goods");
    echo '<pre>';
    
    var_dump($goods);
}

第三种:

public function test(){
    $goods=D("goods");
    echo '<pre>';
    var_dump($goods);
}

在tp3.2以后,M()和D()是一样的,在3.2之前版本中
M() 类似于是  new Model();
D('goods')  类似于 new GoodsModel():

提示:我们可以看到goods表的信息,在GoodsModel中没有写代码,所有的业务逻辑都是Model类来实现的。


对表的操作
增加:M('表名')->add($data);
删除:M('表名')->delete($id);
更新:M('表名')->save($data);
查询:M('表名')->select();
普通查询(显示所有的商品)
1、GoodsController中的代码如下:
namespace Admin\Controller;
use Think\Controller;

class GoodsController extends Controller{
    public function showlist(){
        $list=M('goods')->select();
        $this->assign('list',$list);
        $this->display();
    }
}

2.在模板中循环取出

<volist name="list" id="vo"> //list数组名称,vo循环变量
    <tr id="product1">  //$i从1开始,$key从零开始
        <td>{$i}</td>
        <td>{$vo.goods_name}</td>
        <td>{$vo.goods_number}</td>
        <td>{$vo.goods_price}</td>
        <td>![](/aaa/a.jpg)</td>
        <td>{$vo.goods_brand_id}</td>
        <td>{$vo.goods_create_time}</td>
        <td><a href="#">Modify</a></td>
        <td><a href="javascript:;" onclick="delete_product(1)">delete</a></td>
        <td></td>
    <tr>
</volist>


3.获取一条记录

$goods=M('goods')->find();
var_dump($goods);


条件查询

//查询主键为1的记录
$list=M('goods')->select(1);
//查询编号是2,3,4,5的记录
$list=M('goods')->select("2,3,4,5");
//where条件
$list=M("goods")->where("goods_name like 'iphone%'")->select();
$list=M("goods")->where("goods_name like 'iphone%' and goods_price>=102")->select();

/limit
$list=M("goods")->limit(5)->select();
$list=M("goods")->limit(2,5)->select();

//where and limit
$list=M("Model")->where("goods_price>1000")->limit(3)->select();

//排序
$list=M("goods")->where("goods_price desc")->select();

//指定字段
$list=M("goods")->field("goods_nae,goods_price")->select();

//having
$list=M("goods")->having("goods_price>2000")->select();

//分组
$list=M("goods")->group("goods_brand_id")->field("goods_brand_id,max(goods_price) m")->having('m>2000')->select();

having和where的区别
区别一:
where后面跟的字段必须在数据表中有
having后面跟的字段必须在数据集中有
区别二:
select * from 表  where 条件  group by 分组  having 条件


动态查询

getby+字段名

$data=M('goods')->getBygoods_id(9); //返回一条记录

聚合函数

$goods=M("goods");
$goods->count();
$goods->max("goods_price");
$goods->min("goods_price");
$goods->mavg("goods_price");
$goods->sum("goods_price");


数据添加

1、通过关联数组的方法添加:如果主键自动增长
则返回自动增长的编号,否则返回受记录的记录数.如果SQL遇见有错误,则返回false;

$data = array(
    'good_name'=>'phone',
    'goods_price'=>2400
);

echo M('goods')->add($data);

2、通过AR(active  record)方式来添加
$goods=M('goods');
$goods->goods_name = 'TV';
$goods->goods_price = 45332;

echo $goods->add();


数据修改
1、通过关联数组的方法

$data = array(
    'goods_name'=>'phone222',
    'goods_price'=>2234,
    'goods_id'=>22
);

echo M('goods')->save($data); //返回受影响的记录

2、通过AR(active  record)方式
$goods=M("goods");
$goods->goods_name='TV333';
$goods->goods_price =22334;
$goods_goods_id = 222;
echo $goods->save();


删除数据

M("goods")->delete(123);
M("goods")->delete("112,33");
M(goods)->where("goods_name='apple'")->delete();

$goods=M('goods');
$goods->goods_id = 33;
$goods->delete();


执行SQL语句

//查询用query方法
$list=M()->query('select * from sw_goods');
var_dump($list);


//增加,删除,修改用execute方法
echo M()->execute('delete from sw_goods where good_id=23');




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容