一 、 什么是php框架
php框架有助于促進(jìn)應(yīng)用開(kāi)發(fā),不但節(jié)省開(kāi)發(fā)時(shí)間,有助于建立更為穩(wěn)定的應(yīng)用,而且減少了重復(fù)代碼的開(kāi)發(fā)。
目錄結(jié)構(gòu)
初始的目錄結(jié)構(gòu)如下:
www? WEB部署目錄(或者子目錄)
├─application? ? ? ? ? 應(yīng)用目錄
│? ├─common? ? ? ? ? ? 公共模塊目錄(可以更改)
│? ├─module_name? ? ? ? 模塊目錄
│? │? ├─common.php? ? ? 模塊函數(shù)文件
│? │? ├─controller? ? ? 控制器目錄
│? │? ├─model? ? ? ? ? 模型目錄
│? │? ├─view? ? ? ? ? ? 視圖目錄
│? │? └─ ...? ? ? ? ? ? 更多類庫(kù)目錄
│? │
│? ├─command.php? ? ? ? 命令行定義文件
│? ├─common.php? ? ? ? 公共函數(shù)文件
│? └─tags.php? ? ? ? ? 應(yīng)用行為擴(kuò)展定義文件
│
├─config? ? ? ? ? ? ? ? 應(yīng)用配置目錄
│? ├─module_name? ? ? ? 模塊配置目錄
│? │? ├─database.php? ? 數(shù)據(jù)庫(kù)配置
│? │? ├─cache? ? ? ? ? 緩存配置
│? │? └─ ...? ? ? ? ? ?
│? │
│? ├─app.php? ? ? ? ? ? 應(yīng)用配置
│? ├─cache.php? ? ? ? ? 緩存配置
│? ├─cookie.php? ? ? ? Cookie配置
│? ├─database.php? ? ? 數(shù)據(jù)庫(kù)配置
│? ├─log.php? ? ? ? ? ? 日志配置
│? ├─session.php? ? ? ? Session配置
│? ├─template.php? ? ? 模板引擎配置
│? └─trace.php? ? ? ? ? Trace配置
│
├─route? ? ? ? ? ? ? ? 路由定義目錄
│? ├─route.php? ? ? ? ? 路由定義
│? └─...? ? ? ? ? ? ? ? 更多
│
├─public? ? ? ? ? ? ? ? WEB目錄(對(duì)外訪問(wèn)目錄)
│? ├─index.php? ? ? ? ? 入口文件
│? ├─router.php? ? ? ? 快速測(cè)試文件
│? └─.htaccess? ? ? ? ? 用于apache的重寫(xiě)
│
├─thinkphp? ? ? ? ? ? ? 框架系統(tǒng)目錄
│? ├─lang? ? ? ? ? ? ? 語(yǔ)言文件目錄
│? ├─library? ? ? ? ? ? 框架類庫(kù)目錄
│? │? ├─think? ? ? ? ? Think類庫(kù)包目錄
│? │? └─traits? ? ? ? ? 系統(tǒng)Trait目錄
│? │
│? ├─tpl? ? ? ? ? ? ? ? 系統(tǒng)模板目錄
│? ├─base.php? ? ? ? ? 基礎(chǔ)定義文件
│? ├─console.php? ? ? ? 控制臺(tái)入口文件
│? ├─convention.php? ? 框架慣例配置文件
│? ├─helper.php? ? ? ? 助手函數(shù)文件
│? ├─phpunit.xml? ? ? ? phpunit配置文件
│? └─start.php? ? ? ? ? 框架入口文件
│
├─extend? ? ? ? ? ? ? ? 擴(kuò)展類庫(kù)目錄
├─runtime? ? ? ? ? ? ? 應(yīng)用的運(yùn)行時(shí)目錄(可寫(xiě),可定制)
├─vendor? ? ? ? ? ? ? ? 第三方類庫(kù)目錄(Composer依賴庫(kù))
├─build.php? ? ? ? ? ? 自動(dòng)生成定義文件(參考)
├─composer.json? ? ? ? composer 定義文件
├─LICENSE.txt? ? ? ? ? 授權(quán)說(shuō)明文件
├─README.md? ? ? ? ? ? README 文件
├─think? ? ? ? ? ? ? ? 命令行入口文件
一、 URL訪問(wèn)
在沒(méi)有定義路由的情況下典型的URL訪問(wèn)規(guī)則是:
http://serverName/index.php(或者其它應(yīng)用入口文件)/模塊/控制器/操作/[參數(shù)名/參數(shù)值...]
開(kāi)發(fā)規(guī)范
1、目錄和文件
1. 目錄使用小寫(xiě)+下劃線;
2. 類庫(kù)、函數(shù)文件統(tǒng)一以.php為后綴;
3. 類的文件名均以命名空間定義,并且命名空間的路徑和類庫(kù)文件所在路徑一致;
4. 類名和類文件名保持一致,統(tǒng)一采用駝峰法命名(首字母大寫(xiě));
2、函數(shù)和類、屬性命名
1. 類的命名采用駝峰法(首字母大寫(xiě)),例如User、UserType,默認(rèn)不需要添加后綴,例如UserController應(yīng)該直接命名為User;
2. 函數(shù)的命名使用小寫(xiě)字母和下劃線(小寫(xiě)字母開(kāi)頭)的方式,例如get_client_ip;
3. 方法的命名使用駝峰法(首字母小寫(xiě)),例如getUserName
4. 類的命名采用駝峰法(首字母大寫(xiě)),例如User、UserType,默認(rèn)不需要添加后綴,例如UserController應(yīng)該直接命名為User;
3、常量和配置
1. 常量以大寫(xiě)字母和下劃線命名,例如APP_PATH;
2. 配置參數(shù)以小寫(xiě)字母和下劃線命名,例如url_route_on和url_convert;
4、數(shù)據(jù)表和字段
數(shù)據(jù)表和字段采用小寫(xiě)加下劃線方式命名,并注意字段名不要以下劃線開(kāi)頭,例如 think_user 表和 user_name字段,不建議使用駝峰和中文作為數(shù)據(jù)表及字段命名。
5、應(yīng)用類庫(kù)名空間規(guī)范
應(yīng)用類庫(kù)的根命名空間統(tǒng)一為app(可以設(shè)置app_namespace配置參數(shù)更改);例如:app\index\controller\Index 和app\index\model\User;
6、避免使用PHP保留字作為常量。
二、請(qǐng)求
1、請(qǐng)求信息
Request對(duì)象的作用是與客戶端交互,收集客戶端的From、Cookie、超鏈接,或者收集服務(wù)器端的環(huán)境變量。
2、獲取URL信息
3、變量獲取
變量獲取使用\thinkk\Request類的如下方法及參數(shù):
變量類型方法包括:
方法???????????????????????????????????????????????????????????????????? 含義
host????????????????????????????????????????????????????????????????????? 當(dāng)前訪問(wèn)域名或者IP
scheme???????????????????????????????????????????????????????????????? 當(dāng)前訪問(wèn)協(xié)議
port??????????????????????????????????????????????????????????????????????? 當(dāng)前訪問(wèn)的端口
remotePort??????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求的REMOTE_PORT
protocol????????????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求的SERVER_PROTOCOL
contentType??????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求的CONTENT_TYPE
domain??????????????????????????????????????????????????????????????????? 當(dāng)前包含協(xié)議的域名
subDomain????????????????????????????????????????????????????????????? 當(dāng)前訪問(wèn)的子域名
panDomain????????????????????????????????????????????????????????????? 當(dāng)前訪問(wèn)的泛域名
rootDomain????????????????????????????????????????????????????????????? 當(dāng)前訪問(wèn)的根域名(V5.1.6+)
url??????????????????????????????????????????????????????????????????????????? 當(dāng)前完整URL
baseUrl??????????????????????????????????????????????????????????????????? 當(dāng)前URL(不含QUERY_STRING)
query?????????????????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求的QUERY_STRING參數(shù)
baseFile?????????????????????????????????????????????????????????????????? 當(dāng)前執(zhí)行的文件
rootURL?????????????????????????????????????????????????????????????????? 訪問(wèn)根地址
rootUrlURL????????????????????????????????????????????????????????????? 訪問(wèn)根目錄
pathinfo??????????????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求URL的pathinfo信息(含URL后綴)
path ??????????????????????????????????????????????????????????????????????? 請(qǐng)求URL的pathinfo信息(不含URL后綴)
ext?????????????????????????????????????????????????????????????????????????? 當(dāng)前URL的訪問(wèn)后綴
time???????????????????????????????????????????????????????????????????????? 獲取當(dāng)前請(qǐng)求的時(shí)間
type??????????????????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求的資源類型
method?????????????????????????????????????????????????????????????????? 當(dāng)前請(qǐng)求類型
三、數(shù)據(jù)庫(kù)
db助手函數(shù)默認(rèn)會(huì)每次重新連接數(shù)據(jù)庫(kù),因此應(yīng)當(dāng)盡量避免多次調(diào)用。
注意:使用db助手函數(shù)默認(rèn)每次都會(huì)重新連接數(shù)據(jù)庫(kù),而使用Db::name 或者Db::table方法的話都是單例。db函數(shù)如果需要采用相同的鏈接,可以傳入第三個(gè)參數(shù),例如:
db('user',[],false)->where('id',1)->find();
db('user',[],false)->where('status',1)->select();
上面的方式會(huì)使用同一個(gè)數(shù)據(jù)庫(kù)連接,第二個(gè)參數(shù)為數(shù)據(jù)庫(kù)連接參數(shù),留空表示采用數(shù)據(jù)庫(kù)配置文件的配置。
四、查詢數(shù)據(jù)
select()方法用于查詢數(shù)據(jù)集,如果成功,返回的是一個(gè)二維數(shù)組,如果沒(méi)有成功則返回空數(shù)組,find()方法用于查找滿足條件的第一個(gè)記錄,如果成功,返回一個(gè)一維數(shù)組,沒(méi)有滿足條件返回null。