thinkphp-----1

thinkphp3.2要求php5.3以上

访问web服务器下的目录是可以查看该目录下的文件信息的,所以一般在目录下都新建一个index.html 是空的

thinkphp默认有以下目录结构:

application 目录就是一个网站,public目录是网站的公共目录,所有网站公用的目录,ThinkPhp目录是用来存放thinkphp框架的核心类包的,还有一个index.php文件,

index.php文件是整个网站的入口文件,他里面检测了php的版本是否是5.3 开启了调试模式define('APP_DEBUF',true);引入了ThinkPhp框架的类,require ./ThinkPHP/ThinkPhp.php  通过引入这个文件就引入了thinkphp的框架所需要的包,define('APP_PATH' ‘./Application’) 定义了网站的目录,通过这个index.php访问的就是Application里面的控制器

当我们访问index.php时,他还会在定义的APP_PATH下Application下创建三个目录,Common ,Home,Runtime目录,同样每个目录下也有 index.html,防止别人查看目录结构,Home是网站Application的前台模块,里面有Model目录 View目录Controller目录 conf目录,是配置Home模块的相关设置的,Common目录,是用来存放Home模块下的公共文件的

index.php下定义的define(APP_PATH  'Weibo')  是可以自动创建Weibo目录,并且在Weibo目录下创建View  Model  Controller  Common Conf 目录

首页的index.php  index.html  一般不用输入,web服务器会自动找到这些文件 并加载


thinkphp是单入口的,index.php对应的是APP_PATH 定义的应用目录,通过/就能访问了, 而我们可以在定义一个admin.php文件,复制index.php里面的内容,并且定义define(APP_PATH Admin) ,通过 localhost/admin.php 就能访问,他会创建一个Admin应用目录,还会创建Common View Controller Conf Model 等 文件,也就说这事通过两个index.php admin.php 文件访问了 两个应用 


在单入口文件处index.php admin.php可以定义默认目录的防止偷看目录结构的文件名 define(DIR_SECURE_FILENAME  default.html) 就是在 Weibo目录下默认会生成default.html而不是原来的index.html,设置完默认访问文件后, 还可以设置 默认访问文件的内容, define(DIR_SECURE_CONTENT “目录不能被访问) 你访问该目录时,就是显示了define(DIR_SECURE_FILENAME  default.html) 定义的defaul.html ,通过 define(DIR_SECURE_CONTENT “目录不能被访问) 设置了 他default.html里面的内容

define(BUILD_SECURE  false)  在生成应用程序目录时, 就不会生成default.html了  禁用了


IndexController.class.php

namesapce  Hom\Controller  不用写应用项目名称,直接是模块名称\控制器名称

use Think\Controller    通过  use找到ThinkPHP\Library\ 使用了 Think\Controller





  1. // inc.php  
  2. namespace Foo;  
  3. class Bar {} 

namespace是的作用是定义一个在inc.php 文件中使用的,在inc.php文件:namecpasce foo  class  bar{  }  那么在在inc.php文件中出现的接口,类,函数 ,等只能在该命名空间有效,其他文件要想使用这个inc.php文件的接口或类,可以有如下两种方法:

  1. require 'inc.php';  
  2. $foo = new \Foo\Bar();

2

  1. // 访问Foo的第二种方法  
  2. namespace Foo; // 调整当前脚本到Foo这个ns域,而且namespace申明必须在第一句  
  3. require 'inc.php';  
  4. $foo = new Bar(); 
第二种方法,namespace调整当期文件的命名空间到foo,然后new Bar();

3

  1. // 第三种用法  
  2. require 'inc.php';  
  3. use Foo\Bar; // 这样Bar就等于Foo\Bar了  
  4. $foo = new Bar();


也就是说:当引用一个申明了namespace的包含文件,想要调用这个ns里面的东西,那必须调整当前脚本也到此ns域,否则就得用全称()包含ns全称)


namespace 是可以随便起名的   而use是通过命名空间直接找到该命名空间下的类或接口,必须定义到你要引用的类 use Foo\Bar ;

namespace 当在文件中没有是定义该文件的命名空间,namespace Foo ,在另一个文件中使用了已经存在的Foo,那么久会把该文件的命名空间切换到Foo,使Foo下面的类或接口


访问的单文件入口后面跟的是?模块名/ 控制器类 / 该控制器类的某个方法  默认的是 index.php/Home/Index/index   Index 控制器类不用写Controller,只要写前面的就行了


thinkphp单文件入口默认是/Home/Index/index方法,当然我们一般是创建一个入口文件,一个应用目录(网站),多个模块的,我们模仿Home模块,创建一个Admin后台模块,修改IndexController。class.php的namecpace  Admin\Controller    这样通过一个单入口 就能访问实现多模块了 单入口 多模块了 

index.php/Admin/Index/index   当然所有的index  是不用打的 默认就是index


禁用摸个模块:

Weibo\Common模块下的Conf目录下的config.php文件是用来  配置该应用下的所有配置的的,config里面就是一个数组,MODULE_DENY_LIST=>array('common,Runtime)

允许访问模块访问:

MODULE_ALLOW_LIST =>array(”Home“  ”Admin)当你两个都写上,都能访问,写一个是只能访问一个的MODULE_ALLOW_LIST =>array(”Home“  )只能访问Home,Admin就不能访问了,而系统默认是除了Common Runtime 模块是都能访问的

设置默认单文件后省略的模块名:(Common/conf/config.php)

DEFAULT_MODULE=>"Admin" 修改了默认加载的模块是Admin  而不是Home  模块了 


不允许多个控制器被访问:

MUTI_MODULE => false   只能有一个控制器被访问 其他的不被访问


多模块也可以对应多个入口文件,Admin模块可以对应admin.php  具体方法是:复制一个index.php命名为admin.php 修改$_GET['m ] =Admin  修改默认的模块为Admin 而不是Home模块了 


注意多入口 多站点     多模块  多入口  的区别 设置  多入口 多种站点:通过 define(APP_PATH Weibo)   define(APP_PATH Admin)    来设置多个站点,  

多模块 多入口 是定义了一个在admin.php 中  define(APP_PATH Weibo)  改变了$_GET[ m ] = Admin  改变了 模块名  也就说是一个define(APP_PATH)而改变了 $_GET[ m ]

$_GET[ c ]  = user  设置默认的控制器类 


URL模式:

默认是pathinfo模式  index.php/Home/user/test/name/crisis/pass/liang  访问了 Home模块下UserController类的test方法,并且还要求传递两个参数,name =crisis pass=liang


Home模块 Admin模块公用一个Common模块  在Common\conf\config。php 中设置 pathinfo 的访问方式:

URL_PATHINFO_DEPR => " _ " 访问方式就变成了 index.php/Home_User_Test_name_crisis_pass_liang


普通模式:index.php?m=Home&c=user&atest&name=crisis&pass=liang

修改键值对的名称在Common/conf/config.php中 VAR_MODULE=>"mm"  var_controller => cc  var_action=>aa  注意改成了 mm  cc  aa

index.php?mm=Home&cc=user&aa=test&name=crisis&pass=liang


URL重写是去掉index.php的 在apache 服务器中使用:在apache的配置文件httpd.conf中  找到mod_rewrite_so   去掉前面的注释 ,打开apache的URL重写,找到AllowOver None 将none 改为All


链接数据库:thinkphp支持 mysql  sqlserver  oracle  slite  等数据库, 他底层 封装了这些数据库的连接 和 发送sql语句 ,终极解决 方案 pdo  我们不需要为不同的数据库写不同的连接和 数据库 操作

在 Weibo下的Common模块Conf下的config.phhp  设置Home 模块 Admin 模块的 共同设置 

DB_TYPE=>mysql   DB_HOST=>localhost  DB_USER=>root  DB_PWD=>root   DB_NAME=>think  DB_POET=> 3306  DB_PREFIX=>  think_

通过上面的设置后就连接到了本地的think 数据库, 使用前缀think_

在UserController{ }类里面  $model =  new Model( user )  实例化一个Model对象,传入user , 就是数据库的表名, 没有前缀,该对象封装了 得到的信息,错误信息,从数据库查到的信息,等等 通过var_dump可以查看 该类的详细信息


在Weibo/Common/Conf/config.php中可以设置调试工具打开, SHOW_PAGE_TRACE=>true   这样就会显示出错误信息,Model类构造函数 接受三个参数, 第一个是要操作数据库的表名,第二个是表前缀, 设置后会覆盖原来的表前缀,第三个参数 是数据库连接信息, 第三个参数可以修改config指定的数据库,可以修改成其他数据库 ,


定义和表的关联,还可以通过M(表名)建立 和表的关联 ,他会返回一个Model类的对象,  

第三种方法是:Weibo/Home/Mode/下建立一个UserModel  类,user与数据库的表think_user 对应,  在里面可以设置 操作的一些信息 参考手册吧 ............................


如果我们仅仅时对数据库的增删改查,我们使用Model类的方法M() 

D()方法是先实例化本身模块下/Home/Model/userModel 类的对象 ,当该目录下没有UserModel类时,实例化Weibo/Common/Model/userModel 类实例化对象,当这个类也没有时 ,最后调用Model(user) 这个类来实例化对象,

php中子类有构造函数,就不调用父类的构造函数了,要调用父类的构造函数,在构造函数开始写上:parent::__construct();   这个和java  c# c++ 的构造方法是不一样的  java c++ 是调用子类的构造方法前,先调用付类的构造方法,


使用原生sql语句的方法:使用M()方程创建一个对象,或者new Modes( )  在或者 使用D()也是可以的  不过一般使用 M() 方法

$user=M()$user—>query( select * from think_user) 选取了原生sql的方法

原生的M()方法是不用传递表名的在实例化Model()时


字段缓存:在实例化Model时(执行M()D())方法时,在Weibo/Runtime/Data/_Fields/下生成一个存放你实例化表的 缓存文件 记录了表的字段 名称 ,字段类型,

如果开启了字段缓存,数据库中新增了字段,程序中可能无法立刻显示出来,需要删除Weibo/Runtime/Data/_Fields/下的文件才可以 显示出来

关闭字段缓存方法:DB_FIELDS_CACHE=》false


连贯操作:

$user=new Model() $->where(id=1&name=crisis)->select()  

建议使用数组封装条件$condition['id']=1 $condition[ name ] = crisis    $->where($condition )->select()   select  * from user where  id=1 and name= crisis

 $condition数组默认是 and  如果想改变为or  $condition[_logic] = or 即可 select  * from user where  id=1 or  name= crisis

还可以使用对象形式封装:

$con = new \stdClass( )  这事一个php提供的空类, 可以用来封装数据的  \的作用是使得命名空间设置到php的根目录

 $con->id = 1  $con ->name = crisis $con->_logic= or     $->where($con )->select()   


还可以使用下面的形式:

$map[id] = array( eq , 1 )  $->where($map )->select()     select  * from user where  id=1 

$map[id] = array( exp , =1 )  $map[id] = array( exp , >1 )  这种写法就不要使用 eq lt  gt  了 









你可能感兴趣的:(thinkphp)