thinkphp5基礎

前面的話

  ThinkPHP是一個免費開源的,快速、簡單的面向對象的輕量級PHP開發框架,是爲了敏捷WEB應用開發和簡化企業應用開發而誕生的。ThinkPHP從誕生以來一直秉承簡潔實用的設計原則,在保持出色的性能和至簡的代碼的同時,也注重易用性。遵循Apache2開源許可協議發佈,意味着能夠無償使用ThinkPHP,甚至容許把基於ThinkPHP開發的應用開源或商業產品發佈/銷售。ThinkPHP5.0版本是一個顛覆和重構版本,採用全新的架構思想,引入了更多的PHP新特性,優化了核心,減小了依賴,實現了真正的惰性加載,支持composer,並針對API開發作了大量的優化,包括路由、日誌、異常、模型、數據庫、模板引擎和驗證等模塊都已經重構,不適合原有3.2項目的升級,但絕對是新項目的首選php

 

目錄結構

  thinkphp5安裝完成後,初始目錄結構以下所示css

www  WEB部署目錄(或者子目錄)
├─application           應用目錄
│  ├─common             公共模塊目錄(能夠更改)
│  ├─module_name        模塊目錄
│  │  ├─config.php      模塊配置文件
│  │  ├─common.php      模塊函數文件
│  │  ├─controller      控制器目錄
│  │  ├─model           模型目錄
│  │  ├─view            視圖目錄
│  │  └─ ...            更多類庫目錄
│  │
│  ├─command.php        命令行工具配置文件
│  ├─common.php         公共函數文件
│  ├─config.php         公共配置文件
│  ├─route.php          路由配置文件
│  ├─tags.php           應用行爲擴展定義文件
│  └─database.php       數據庫配置文件
│
├─public                WEB目錄(對外訪問目錄)
│  ├─index.php          入口文件
│  ├─router.php         快速測試文件
│  └─.htaccess          用於apache的重寫
│
├─thinkphp              框架系統目錄
│  ├─lang               語言文件目錄
│  ├─library            框架類庫目錄
│  │  ├─think           Think類庫包目錄
│  │  └─traits          系統Trait目錄
│  │
│  ├─tpl                系統模板目錄
│  ├─base.php           基礎定義文件
│  ├─console.php        控制檯入口文件
│  ├─convention.php     框架慣例配置文件
│  ├─helper.php         助手函數文件
│  ├─phpunit.xml        phpunit配置文件
│  └─start.php          框架入口文件
│
├─extend                擴展類庫目錄
├─runtime               應用的運行時目錄(可寫,可定製)
├─vendor                第三方類庫目錄(Composer依賴庫)
├─build.php             自動生成定義文件(參考)
├─composer.json         composer 定義文件
├─LICENSE.txt           受權說明文件
├─README.md             README 文件
├─think                 命令行入口文件

 

開發規範

【目錄和文件】html

  一、目錄不強制規範,駝峯和小寫+下劃線模式均支持mysql

  二、類庫、函數文件統一以.php爲後綴sql

  三、類的文件名均以命名空間定義,而且命名空間的路徑和類庫文件所在路徑一致thinkphp

  四、類名和類文件名保持一致,統一採用駝峯法命名(首字母大寫)數據庫

【函數和類、屬性命名】apache

  一、類的命名採用駝峯法,而且首字母大寫,例如 UserUserType,默認不須要添加後綴,例如UserController應該直接命名爲User編程

  二、函數的命名使用小寫字母和下劃線(小寫字母開頭)的方式,例如 get_client_ipjson

  三、方法的命名使用駝峯法,而且首字母小寫,例如 getUserName

  四、屬性的命名使用駝峯法,而且首字母小寫,例如 tableNameinstance

  五、以雙下劃線「__」打頭的函數或方法做爲魔法方法,例如 __call 和 __autoload

【常量和配置】

  一、常量以大寫字母和下劃線命名,例如 APP_PATH和 THINK_PATH

  二、配置參數以小寫字母和下劃線命名,例如 url_route_on 和url_convert

【數據表和字段】

  一、數據表和字段採用小寫加下劃線方式命名,並注意字段名不要如下劃線開頭,例如 think_user 表和 user_name字段,不建議使用駝峯和中文做爲數據表字段命名

 

常見概念

  ThinkPHP5.0應用基於MVC(模型-視圖-控制器)的方式來組織。下面是一些常見概念

【入口文件】

  用戶請求的PHP文件,負責處理一個請求(注意,不必定是URL請求)的生命週期,最多見的入口文件就是index.php,有時候也會爲了某些特殊的需求而增長新的入口文件,例如給後臺模塊單獨設置的一個入口文件admin.php或者一個控制器程序入口think都屬於入口文件

【應用】

  應用在ThinkPHP中是一個管理系統架構及生命週期的對象,由系統的 \think\App類完成,應用一般在入口文件中被調用和執行,具備相同的應用目錄(APP_PATH)的應用咱們認爲是同一個應用,但一個應用可能存在多個入口文件。應用具備本身獨立的配置文件、公共(函數)文件

【模塊】

  一個典型的應用是由多個模塊組成的,這些模塊一般都是應用目錄下面的一個子目錄,每一個模塊都有本身獨立的配置文件、公共文件和類庫文件

【控制器】

  每一個模塊擁有獨立的MVC類庫及配置文件,一個模塊下面有多個控制器負責響應請求,而每一個控制器其實就是一個獨立的控制器類。

  控制器主要負責請求的接收,並調用相關的模型處理,並最終經過視圖輸出。嚴格來講,控制器不該該過多的介入業務邏輯處理

  一個典型的Index控制器類以下:

namespace app\index\controller;
class Index 
{
    public function index()
    {
        return 'hello,thinkphp!';
    }
}

【操做】

  一個控制器包含多個操做(方法),操做方法是一個URL訪問的最小單元。

  下面是一個典型的Index控制器的操做方法定義,包含了兩個操做方法:

namespace app\index\controller;
class Index 
{
    public function index()
    {
        return 'index';
    }
    public function hello($name)
    {
        return 'Hello,'.$name;
    }
}

  操做方法能夠不使用任何參數,若是定義了一個非可選參數,則該參數必須經過用戶請求傳入,若是是URL請求,則一般是$_GET或者$_POST方式傳入

【模型】

  模型類一般完成實際的業務邏輯和數據封裝,並返回和格式無關的數據

【視圖】

  控制器調用模型類後返回的數據經過視圖組裝成不一樣格式的輸出。視圖根據不一樣的需求,來決定調用模板引擎進行內容解析後輸出仍是直接輸出。

  視圖一般會有一系列的模板文件對應不一樣的控制器和操做方法,而且支持動態設置模板目錄

【驅動】

  系統不少的組件都採用驅動式設計,從而能夠更靈活的擴展,驅動類的位置默認是放入核心類庫目錄下面,也能夠從新定義驅動類庫的命名空間而改變驅動的文件位置

【行爲】

  行爲(Behavior)是在預先定義好的一個應用位置執行的一些操做。相似於AOP編程中的「切面」的概念,給某一個切面綁定相關行爲就成了一種類AOP編程的思想。因此,行爲一般是和某個位置相關,行爲的執行時間依賴於綁定到了哪一個位置上。

  要執行行爲,首先要在應用程序中進行行爲偵聽,例如:

// 在app_init位置偵聽行爲
\think\Hook::listen('app_init');

  而後對某個位置進行行爲綁定:

// 綁定行爲到app_init位置
\think\Hook::add('app_init','\app\index\behavior\Test');

  一個位置上若是綁定了多個行爲的,按照綁定的順序依次執行,除非遇到中斷

【命名空間】

  ThinkPHP5採用了PHP的命名空間進行類庫文件的設計和規劃,而且符合PSR-4的自動加載規範、

 

入口文件

  ThinkPHP5.0版本的默認自帶的入口文件位於public/index.php(實際部署的時候public目錄爲應用對外訪問目錄),入口文件內容以下:

// 定義應用目錄
define('APP_PATH', __DIR__ . '/../application/');
// 加載框架引導文件
require __DIR__ . '/../thinkphp/start.php';

  這段代碼的做用就是定義應用目錄APP_PATH和加載ThinkPHP框架的入口文件,這是全部基於ThinkPHP開發應用的第一步

  官方提供的默認應用的實際目錄結構和說明以下:

├─application           應用目錄(可設置)
│  ├─index              模塊目錄(可更改)
│  │  ├─config.php      模塊配置文件
│  │  ├─common.php      模塊公共文件
│  │  ├─controller      控制器目錄
│  │  ├─model           模型目錄
│  │  └─view            視圖目錄
│  │
│  ├─command.php        命令行工具配置文件
│  ├─common.php         應用公共文件
│  ├─config.php         應用配置文件
│  ├─tags.php           應用行爲擴展定義文件
│  ├─database.php       數據庫配置文件
│  └─route.php          路由配置文件

  5.0版本採用模塊化的設計架構,默認的應用目錄下面只有一個index模塊目錄,若是要添加新的模塊可使用控制檯命令來生成。

  切換到命令行模式下,進入到應用根目錄並執行以下指令:

php think build --module demo

  就會生成一個默認的demo模塊,包括以下目錄結構:

├─demo   
│  ├─controller      控制器目錄
│  ├─model           模型目錄
│  ├─view            視圖目錄
│  ├─config.php      模塊配置文件
│  └─common.php      模塊公共文件

  同時也會生成一個默認的Index控制器文件

 

資源訪問

  網站的資源文件訪問不會影響正常的操做訪問,只有當訪問的資源文件不存在的時候纔會解析到入口文件,通常就會提示模塊不存在的錯誤。

  網站的資源文件通常放入public目錄的子目錄下面,例以下面是一個建議規範:

public
├─index.php       應用入口文件
├─static                靜態資源目錄   
│  ├─css      樣式目錄
│  ├─js         腳本目錄
│  └─img      圖像目錄

  訪問資源文件的URL路徑是:

http://tp5.com/static/css/style.css
http://tp5.com/static/js/common.js
http://tp5.com/static/img/picture.jpg

  若是沒有設置域名綁定,而是使用子目錄方式訪問的話,那麼可能的資源訪問地址是:

http://localhost/public/static/css/style.css
http://localhost/public/static/js/common.js
http://localhost/public/static/img/picture.jpg

 

調試模式

  ThinkPHP支持調試模式,默認狀況下是開啓狀態(5.0.10+版本開始,默認關閉調試模式,須要本身開啓)。調試模式以除錯方便優先,並且在異常的時候能夠顯示儘量多的信息,因此對性能有必定的影響。

  強烈建議開發者在使用ThinkPHP開發的過程當中使用調試模式,5.0默認狀況下能夠捕獲到任何細微的錯誤並拋出異常,這樣能夠更好的獲取錯誤提示和避免一些問題和隱患,不要畏懼錯誤,要勇敢面對,並消除隱患。

  開發完成後,實際進行項目部署的時候,修改應用配置文件(application/config.php)中的app_debug配置參數:

// 關閉調試模式
'app_debug' =>  false,

 

控制器

  找到index模塊的Index控制器(文件位於application/index/controller/Index.php 注意大小寫),把Index控制器類的index方法修改成Hello,World!

<?php
namespace app\index\controller;
class Index
{
    public function index()
    {
        return 'Hello,World!';
    }
}

  訪問URL地址時,就會看到Hello,World!的輸出結果

  若是要訪問一個駝峯命名的控制器,例如咱們把上面的例子改爲一個HelloWorld控制器

<?php
namespace app\index\controller;
class HelloWorld
{
    public function index($name = 'World')
    {
        return 'Hello,' . $name . '';
    }
}

  默認狀況下正確的方法是使用下面的URL進行訪問

http://tp5.com/index.php/index/hello_world

  下面的訪問地址是錯誤的

http://tp5.com/index.php/index/HelloWorld

  由於默認的URL訪問是不區分大小寫的,所有都會轉換爲小寫的控制器名,除非在應用配置文件中,設置了關閉url自動轉換以下:

'url_convert' => false,

  那麼就能夠正常訪問

http://tp5.com/index.php/index/HelloWorld

  若是要繼承一個公共的控制器類,可使用:

<?php

namespace app\index\controller;

use app\index\controller\Base;

class Index extends Base
{
    public function index()
    {
        return 'Hello,World!';
    }
}

  能夠爲操做方法定義參數,例如:

<?php

namespace app\index\controller;

class Index
{
    public function index($name = 'World')
    {
        return 'Hello,' . $name . '';
    }
}

  當帶name參數訪問入口文件地址(例如 http://tp5.com?name=ThinkPHP)的時候,在瀏覽器中能夠看到以下輸出:

Hello,ThinkPHP!

  控制器類能夠包括多個操做方法,但若是操做方法是protected或者private類型的話,是沒法直接經過URL訪問到該操做的,也就是說只有public類型的操做方法纔是能夠經過URL訪問的。

  下面來驗證下,把Index控制器類的方法修改成:

<?php
namespace app\index\controller;

class Index
{
    public function hello()
    {
        return 'hello,thinkphp!';
    }

    public function test()
    {
        return '這是一個測試方法!';
    }

    protected function hello2()
    {
        return '只是protected方法!';
    }

    private function hello3()
    {
        return '這是private方法!';
    }
}

  當咱們訪問以下URL地址的時候,前面兩個是正常訪問,後面兩個則會顯示異常

http://tp5.com/index.php/index/index/hello
http://tp5.com/index.php/index/index/test
http://tp5.com/index.php/index/index/hello2
http://tp5.com/index.php/index/index/hello3

 

視圖

  如今咱們在給控制器添加視圖文件功能,咱們在application/index目錄下面建立一個view目錄,而後添加模板文件view/index/hello.html(注意大小寫),咱們添加模板內容以下:

<html>
<head>
<title>hello {$name}</title>
</head>
<body>
    hello, {$name}!
</body>
</html>

  要輸出視圖,必須在控制器方法中進行模板渲染輸出操做,如今修改控制器類以下:

<?php
namespace app\index\controller;

use think\Controller;

class Index extends Controller
{
    public function hello($name = 'thinkphp')
    {
        $this->assign('name', $name);
        return $this->fetch();
    }
}

  [注意]若是沒有使用use think\Controller;就必須使用class Index extends \think\Controller

  Index控制器類繼承了 think\Controller類以後,咱們能夠直接使用封裝好的assignfetch方法進行模板變量賦值和渲染輸出。

  fetch方法中咱們沒有指定任何模板,因此按照系統默認的規則(視圖目錄/控制器/操做方法)輸出了view/index/hello.html模板文件。

  接下來,咱們在瀏覽器訪問

http://tp5.com/index.php/index/index/hello

  輸出:

hello,thinkphp!

 

讀取數據

  在開始以前,咱們首先在數據庫demo中建立一個think_data數據表(這裏以mysql數據庫爲例):

CREATE TABLE IF NOT EXISTS `think_data`(
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
    `data` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

INSERT INTO `think_data`(`id`,`data`) VALUES
(1,'thinkphp'),
(2,'php'),
(3,'framework');

  首先咱們須要在應用的數據庫配置文件application/database.php中添加數據庫的鏈接信息以下:

return [
    // 數據庫類型
    'type'        => 'mysql',
    // 服務器地址
    'hostname'    => '127.0.0.1',
    // 數據庫名
    'database'    => 'demo',
    // 數據庫用戶名
    'username'    => 'root',
    // 數據庫密碼
    'password'    => '',
    // 數據庫鏈接端口
    'hostport'    => '',
    // 數據庫鏈接參數
    'params'      => [],
    // 數據庫編碼默認採用utf8
    'charset'     => 'utf8',
    // 數據庫表前綴
    'prefix'      => 'think_',
    // 數據庫調試模式
    'debug'       => true,
];

  接下來,咱們修改下控制器方法,添加讀取數據的代碼:

<?php
namespace app\index\controller;

use think\Controller;
use think\Db;

class Index extends Controller
{
    public function index()
    {
        $data = Db::name('data')->find();
        $this->assign('result', $data);
        return $this->fetch();
    }
}

  定義好控制器後,咱們修改模板文件,添加數據輸出標籤以下:

<html>
<head>
<title></title>
</head>
<body>
{$result.id}--{$result.data}
</body>
</html>

  模板標籤的用法和Smarty相似,就是用於輸出數據的字段,這裏就表示輸出think_data表的iddata字段的值。

  咱們訪問會輸出:

1--thinkphp
相關文章
相關標籤/搜索