美文网首页
ThinkPHP学习

ThinkPHP学习

作者: 小Q逛逛 | 来源:发表于2017-01-16 17:22 被阅读332次

    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 '当前请求的地址:'./subject/bmspbttx.html.'<br>';
        echo '当前分组:'.__MODULE__.'<br>';
        echo '当前控制器:'.__CONTROLLER__.'<br>';
        echo '当前方法:'./index/article.'<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="/index/head" frameborder=0 noresize scrolling=no>
                <frameset>
                    <frame name=left src="/index/left" frameborder=0 noresize />
                    <frame name=left src="/index/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');
    
    
    
    
    

    相关文章

      网友评论

          本文标题:ThinkPHP学习

          本文链接:https://www.haomeiwen.com/subject/bmspbttx.html