Think PHP 基础
ThinkPHP
一、什么框架:
一堆代码的集合,里边有变量、函数、类、常量,里边也有许多设计模式MVC、AR数据库、单例等等。
框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次。
二、PHP开发存在的问题:
1. 多人开发项目,分工不合理,(html php mysql)
2. 代码风格不一样,后期维护十分困难
3. 项目生命周期十分短,项目生命没有延续性,造成资源浪费、人员浪费
4. 项目不能很好适应客户需求,牵一发而动全身。
三、为什么使用框架
框架可以帮组我们快速、稳定、高效搭建程序系统
该系统由于框架的使用使得本身的维护性、灵活性、适应客户需求方面得到最大化的增强。
使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关心程序的底层架构。
四、相关框架
1. zendframework zend php语言公司发布的官方框架,重量级(功能多)
2. yii 美国华人开发的框架,xue qiang, qiang, 重量级框架,纯OOP框架
3. CI CodeIgniter 轻量级框架,开发速度快,部署灵活
4.cakephp 外国框架,重量级,速度慢
5.symfony 外国重量级框架
6.ThinkPHP 轻量级框架,国人框架,入门容易
【使用框架】
现在已经更新到5.0版本 不过我们现在学习的是3.2版本
Think PHP 3.2 版本 下载下来 解压之后
【MVC模式】
M:Model 数据模型层,负责数据操作 例如 之前写的 DBDA类 就相当于一个数据模型层 和数据库进行一些相关操作
V:View 视图层,负责显示视图 相当于模板
C:Controller 控制器,实现业务逻辑 业务逻辑层 核心
如果你的程序使用了MVC 模式 有一句话一定要记住 “约定胜于配置!!!”
如果使用了MVC 模式 里面有很多约定 非强制性 但是一定要遵循这些约定 不然会出问题 只有遵循这些约定 才不用去修改一些单独的配置 所以尽量按照约定来写
举一个约定的例子:
约定里面有一个驼峰法 针对文件的命名
比如类文件 在MVC 模式里面必须用驼峰法写 : RenMin 首字母大写 类文件后面必须加.class.php 也就是类文件命名必须这样写 RenMin.class.php
还有类文件class前面的名字必须跟类名一样 你写了一个RenMin 的 类 文件的命名也必须是 RenMin ,也就是类文件命名必须这样写 RenMin.class.php
文件夹的命名也是一种约定 不能随意改换。必须是这样
【框架项目部署】
创建入口文件:
- 在ThinkPHP目录下创建一个入口文件index.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +---------------------------------------------------------------------- // 应用入口文件 // 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为 false 生产模式
define('APP_DEBUG',True);//开发调试模式
// 定义应用目录
define('APP_PATH','./Shop/');//更改shop访问入口文件 系统会自动创建对应的应用目录文件 // 引入ThinkPHP入口文件 核心操作
require './ThinkPHP/ThinkPHP.php'; // 亲^_^ 后面不需要任何代码了 就是如此简单
2、访问入口文件的同时系统会自动把对应的应用目录文件创建出来
3、打开Home文件夹
如图所示 上图 也有配置文件 Conf 这是Home文件夹里的配置文件 有些程序需要修改配置文件 要修改自带的 Conf 不要动 TP框架里的Conf 一旦动了 用这个框架的所有程序都会出现改变 切记切记!
如果你不想使用Home模块 可以自定义一个其他名字的模块 比如:Admin
但是 如果想让Admin像Home般 正常使用,就要在Admin下建好相应的文件夹 文件夹名字必须是这样 不能随意更换。
然后需要在controller文件夹里面写控制器,控制器文件的命名必须使用驼峰法再加上控制器,比如我新建了一个名字叫login 的控制器,名字必须是 LoginController.class.php
控制器内的写法为:
<?php
//命名空间 相当于虚拟目录 注意命名空间里面用的是反斜杠 Admin 模块名
namespace Admin\Controller;
use Think\Controller;//也是命名空间 use 继承父类控制器
class LoginController extends Controller {//定义类 类名 extends 继承 父类控制器
//写操作方法 访问时 访问的是控制器里面的操作方法
public function index(){//操作方法 首字母小写 但如果有第二个字母需要大写 注意书写规范
echo "这是Admin下的登录控制器"; } }
访问成功
一个控制器内有多个操作方法 一个操作方法对应一个模板文件 其他控制器中也可能出现这个操作方法对应这个模板文件 所以 在 View 文件夹下建模板文件是 需要先建一个对应控制器的文件夹 以免出错 比如写 LoginController.class.php控制器的模板文件 需要先在View 文件夹下 建一个Login文件夹,在Login文件夹下写对应方法的模板文件 ,index方法 对应 index.html模板文件。
index.html模板文件内的写法:
在LoginController.class.php控制器 index方法 里面调用: 或
访问显示:
注册变量:
首先 在控制器里面 调用assign()方法,里面写变量
在index.html里面调用test 首先需要知道 分隔符是什么 所以打开父类conf文件夹下的convention.php文件 找到
'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记
'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记
复制粘贴 拿到本模块 conf文件夹下config.php文件内 也可以进行修改 我在这里修改成了
在index.html里面调用test
访问
在index.PHP里面嵌入form表单:
<!-- <form action=" http://localhost/TP/index.php/Admin/Login/chuli" method="post"> --> <form action="__CONTROLLER__/chuli" method="post">
<!--表示找当前控制器下chuli操作方法-->
<!--action 之前指向页面 因为 现在是 MVC模式 它 应该指向控制器的操作方法 浏览器访问页面的地址
地址 太长 可以简化一下 需要获取一下系统常量-->
<input type="submit" value="提交"/> <!--点击提交转入处理页面-->
</form>
<!--
action 和 self 的区别 action:特指当前操作方法的路径 self:指浏览器中有什么他就有什么
如果操作方法有get传值 action只能取到操作方法 而 self 能全部取到包括操作方法后get传的值
_APP_:程序目录
_SELF_:代表自身
__MODULE_:代表模块 例如:Home、Admin
_CONTROLLER_:代表找到控制器
_ACTION_:找到操作方法 -->
点击提交
转到处理页面
【控制器访问及路由解析】
在浏览器中访问操作方法 可以有一下四种方式
通过url地址get参数找到指定的控制器,并进行对应方法调用请求
http://网址/index.php?m=模块名称&c=控制器&a=方法
以上url地址信息代码不够优雅、不安全。
tp框架url地址可以由以下四种
- http://网址/index.php?m=XX&c=XX&a=XX 基本get模式
- http://网址/index.php/模块/控制器/操作方法 路径模式pathinfo 最常用
- http://网址/模块/控制器/操作方法 rewrite重写模式
- http://网址/index.php?s=/模块/控制器/方法 兼容模式
这四种方式可以通过修改配置文件 来修改URL的模式
打开之前建的 Home文件夹 里面的的 Conf配置文件
打开config.php 文件 index.html文件没什么用 可以直接删掉
打开之后的样子 可以在这里面写配置
可是要写什么配置呢?
我们可以找到TP 框架里的 conf文件夹 打开convention.php文件
找到URL_MODEL 复制 放到config.php 里面修改 不要动 convention.php里面的内容
将它复制到config.php里面修改,0为普通模式 也就是get模式 , 1为PATHINFO 模式 也就是 最常用的 路径模式, 2 REWRITE 模式 也就是 重写模式 3 兼容模式
默认为路径模式模式。//无论这里修改成0 1 2 3 中的任意一个数组 在浏览器访问时其他三种方式依然可以使用 此处修改 非是针对于访问而是针对于生成。
如果想生成UL地址的话 可以使用U()方法 在IndexController.class.php里面作如下修改:
不做修改时默认为1,1生成的UL地址是:
接下来我们将1改成0 来看一下生成的UL地址:
将0改成2 生成的UL地址是:
将2改成3 生成的UL地址是:
生成UL地址的作用:跳转页面 生成一个地址跳转 要用到UL地址时可以自动生成一个
U()里面写index 生成的地址是当前模块 当前控制器下index操作方法 在这里就是 Home模块下 Index控制器下 index操作方法
如果要生成其他控制器比如Login控制器下的操作方法的地址 需要在U()方法里面 加上Login(控制器名) 然后/ 如下图所示 生成的就是 Home模块下 Login控制器下 index操作方法的UL地址
如果模块也不一样 就在控制器前再加模块名和/ 如下图:
参数不同 创建的访问路径也会不同。
快捷方法:
TP里面快捷方法比较多 U()方法是其中一个 用来创建UL地址 还有其他快捷方法 比如:
U() 制作url地址的快捷函数
C(名称) 获得配置变量(convertion.php config.php)信息
C(名称,值) 设置配置变量信息
L() 获得语言变量信息
E() 给页面输出错误信息
A("项目://模块/控制器") 实例化控制器对象
A("Home/User") 实例化User控制器对象
A("book://Home/User") 实例化book项目的Home模块的User控制器对象
R("Home(模块)/Main(控制器)/mceshi(操作方法)"); 调方法
【url地址大小写设置】
默认是不敏感的:
在config.php里边对url大小写敏感进行设置
显示tract信息:
需要在配置(config.php)里面加上一句话('SHOW_PAGE_TRACE'=>true,),如图所示:
再次访问时,浏览器右下角会多一个图标:
点开之后会:
显示一些信息 在开发时 尽量打出来 便于查错 开发完毕 可以关掉。
【空操作和空控制器处理】
空操作:就没有指定的操作方法
空控制器:没有指定控制器
前面提到过在网页中访问 最常用的是http://网址/index.php/模块/控制器/操作方法 路径模式 ,如果我们访问了不存在的操作方法或者不小心打错了字母 会出现
处于安全考虑 最好不要给用户提示任何错误信息,如上图所示 ,既降低了用户体验又增加了安全隐患,所以我们现在需要一个方法把这些都隐藏掉,在父类里面有一个__call (); 方法。
首先 上图 第二条 检查是否存在默认模版 如果有直接输出模版,上面的非法操作一图,我原本想要访问的是chuli操作方法,可是我只打到了chu就进行了访问,如果现在 在 view文件夹中有一个名字叫chu的模板的话就会直接输出了,如下图:
访问chu
这样就避免了信息的泄露,可是下次访问我如果打成chul 还是显示 非法操作的图 ,想要用这种办法完全杜绝是非常麻烦而又不现实的,所以我们再看第一条:如果定义了_empty操作 则调用,我们在控制器里定义一个_empty
在浏览器中随意访问不在的操作方法:
这样就好了,我们再来看控制器:
访问一个不存在的控制器:
与空操作一样 在父类中有一个
里面有
所以 我们制作一个EmptyController.class.php控制器就好了
里面这样写
再次访问:
在同一控制器下调用其他方法:
首先,我们在Login控制器下作两个方法:
用$this->ceshi();调用 访问caozuo();
【跨控制器调用】
一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。
跨控制器调用可以节省我们代码的工作量,比如有个操作方法需要重复使用,直接调用就可以,不用重复书写。
在Main控制器中有一个mceshi()操作方法
在Login控制器中通过caozuo()方法来调用,有两个方法
其一: echo不写也可以
其二:通过快捷方法A()来调用
显示:
【跨模块调用】
首先在Home模块Main控制器下写操作方法
然后在Admin模块Login控制器下调用 我们有以下三种方法
其一:造对象
其二:A()方法
其三:R()方法
A() 方法 和 R()方法 的区别:
A():造对象调用 可操作对象
R():直接调用方法,比较方便,不可操作
在浏览器中访问
【命名空间】
相当于虚拟目录
实现自动加载类的机制
初始命名空间:ThinkPHP\Library 相当于根 (最底层)
初始命名空间有很多根命名空间(相当于根路径下有很多文件夹):
只有下面两个地方可以存放类
1.Library里面的文件夹
2.APP(应用程序)的模块文件夹 比如:Home,Admin
在定义的时候:在写命名空间的时候需要从根写起,写到该文件所在的文件夹结束,
用的时候:use在写命名空间的时候需要从根写起,写到该文件名(类名)结束
命名空间用\反斜杠
【模型层】
【连接数据库配置及Model数据模型层】
convertion.php
config.php
- 在config.php做数据库连接配置
未完待续。。。。。。。。。
Think PHP 基础的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- css3实战版的点击列表项产生水波纹动画——之jsoop面向对象封装版
1.html: <!DOCTYPE html><html><head lang="en"> <meta charset=" ...
- Spring的IOC原理[通俗解释一下]
Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...
- Spring context:component-scan中使用context:include-filter和context:exclude-filter
Spring context:component-scan中使用context:include-filter和context:exclude-filter XML: <?xml version= ...
- Docker环境中部署OwnCloud 9.0
整体思路: 1.官方获取mysql.php+apache镜像: 2.基于php+apache,创建OwnCloud镜像: 3.启动mysql镜像: 4.启动OwnCloud镜像,链接mysql镜像,访 ...
- 你真的了解如何将 Nginx 配置为Web服务器吗
阅读之前,建议先阅读初识 Nginx. 之后,我们来了解一下 Nginx 配置. 抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和如何处理这些URLS 对应的请求.具体来 ...
- 游戏音频技术备忘 (三) 集成Wwise到Unreal Engine
当前受众较广的商业游戏引擎有 Unreal Engine.Unity.cocos2d-x等,在音频领域的第三方中间件则有Wwise.FMOD.Criware等,言多且烦,我们首先集成Wwise到 Un ...
- Kafka 0.10 Metadata的补充
什么是Metadata? Topic/Partion与broker的映射关系:每一个Topic的每一个Partion的Leader.Follower的信息. 它存在哪里?持久化在Zookeeper中: ...
- Oracle执行计划顺序
先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行:对于并列的,靠上的先执行. 即并列的缩进块,从上往下执行,非并列的缩进块,从下往上执行. 如下示例: Execu ...
- 智能指针shared_ptr
// 智能指针会自动释放所指向的对象. // shared_ptr的应用场景是:程序需要在多个对象间共享数据 /* 先从应用场景入手吧,说矿工A发现了一个金矿. * 然后矿工A喊来了矿工B,一起开采, ...
- PLSQL游标使用
游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据.由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标.游标可以看做是指向记录 ...