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
namespace是的作用是定义一个在inc.php 文件中使用的,在inc.php文件:namecpasce foo class bar{ } 那么在在inc.php文件中出现的接口,类,函数 ,等只能在该命名空间有效,其他文件要想使用这个inc.php文件的接口或类,可以有如下两种方法:
1
2
3
也就是说:当引用一个申明了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 了