日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

ThinkPHP入门

發(fā)布時(shí)間:2024/7/23 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThinkPHP入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ThinkPHP項(xiàng)目的創(chuàng)建

<?php include "../../ThinkPHP/ThinkPHP.php";

在index.php中導(dǎo)入ThinkPHP.php即可,會(huì)自動(dòng)創(chuàng)建目錄。

tp創(chuàng)建流程分析

1. 入口文件index.php2. ThinkPHP/ThinkPHP.phprequire THINK_PATH.'Common/runtime.php';3. ThinkPHP/Common/runtime.php聲明許多常量信息加載系統(tǒng)核心類文件if(is_file($file)) require_cache($file);自動(dòng)創(chuàng)建應(yīng)用目錄build_app_dir();Think::Start(); 4. ThinkPHP/lib/Core/Think.class.phpstatic function start(){}Think::buildApp(); // 預(yù)編譯項(xiàng)目引入相關(guān)配置文件App::run(); 5. ThinkPHP/lib/Core/App.class.phpstatic public function run(){}App::init();Dispatch分析路由分析路由(控制器MODULE_NAME 方法ACTION_NAME) index.php?c=控制器&a=方法App::exec();通過反射ReflectionMethod使得控制器對(duì)象調(diào)用對(duì)應(yīng)的方法

PHP中的反射

<?phpclass Person{public $name = "xiaoming";function say(){echo "I am ".$this->name;}function run($addr,$age){echo "I am ".$this->name;echo ",I at ".$addr;echo ", my age is ".$age;echo ",running";} } $per = new Person; //$per -> say();//利用反射實(shí)現(xiàn)對(duì)象調(diào)用方法 //$md = new ReflectionMethod(類名,方法名); //反射方法對(duì)象 //反射好處:可以獲得 方法的屬性(是否公開的、私有的、受保護(hù)的等等) //$md = new ReflectionMethod("Person","say"); //讓指定的對(duì)象調(diào)用這個(gè)方法 //$md -> invoke($per);//通過反射執(zhí)行帶參數(shù)的方法 $mda = new ReflectionMethod("Person","run"); $mda -> invokeArgs($per,array('beijing',23));

空操作和空模塊

tp框架把MVC中的控制器稱作是模塊(module) index.php?m=控制器&a=操作
http://網(wǎng)址/index.php/User/login 正常請(qǐng)求
http://網(wǎng)址/index.php/User/beijing “空操作”請(qǐng)求
http://網(wǎng)址/index.php/American/login “空模塊”

  • 什么是空操作:
    用戶訪問一個(gè)控制器中不存在的方法,就是空操作。
    實(shí)例化對(duì)象,這個(gè)對(duì)象去調(diào)用類里邊不存在的方法
    在OOP中有魔術(shù)方法,__call(),自動(dòng)調(diào)用方法,
    對(duì)象調(diào)用類中不存在方法要統(tǒng)一走這個(gè)方法
  • 2.空操作處理:
    a)在對(duì)應(yīng)的控制器里邊定義方法_empty()
    b)給應(yīng)用添加一個(gè)函數(shù)名字是:__hack_action() 推薦使用
    應(yīng)用函數(shù)庫(kù)文件:shop/Common/common.php

    3.空模塊(空控制器)
    tom=newAmerican();tom是不存在的對(duì)象

    處理方式:
    ①定義函數(shù)__hack_module() 推薦使用
    ②給系統(tǒng)定義空模塊:EmptyAction.class.php

    跨模塊調(diào)用

    一個(gè)控制器可以實(shí)例化另一個(gè)控制器,并調(diào)用其相關(guān)方法

    /系統(tǒng)有自動(dòng)加載機(jī)制,會(huì)完成控制器類的引入// ThinkPHP/Lib/Core/Think.class.php//$user = new UserAction();//echo $user -> number();//系統(tǒng)給我們提供快捷函數(shù),實(shí)現(xiàn)控制器的實(shí)例化//A('控制器標(biāo)志')//A('[項(xiàng)目://][分組/]控制器');//A() ThinkPHP/Common/common.php$user = A('home/User');echo $user -> number();$indx = A("book://Index");echo $indx -> apple();//R("[項(xiàng)目://][分組/]模塊/操作方法") 跨模塊調(diào)用函數(shù)//實(shí)例化控制器并直接調(diào)用相關(guān)方法//R()方法有封裝A()方法,之后利用對(duì)象調(diào)用相關(guān)操作echo R("home/User/number");echo R("book://Index/apple",array('hello','world'));

    ThinkPHP數(shù)據(jù)庫(kù)操作

    在config.php中配置

    //數(shù)據(jù)庫(kù)配置'DB_TYPE' => 'mysql', // 數(shù)據(jù)庫(kù)類型'DB_HOST' => 'localhost', // 服務(wù)器地址'DB_NAME' => 'shop', // 數(shù)據(jù)庫(kù)名'DB_USER' => 'root', // 用戶名'DB_PWD' => '111111', // 密碼'DB_PORT' => '', // 端口'DB_PREFIX' => 'sw_', // 數(shù)據(jù)庫(kù)表前綴'DB_FIELDTYPE_CHECK' => false, // 是否進(jìn)行字段類型檢查////處于性能考慮,把數(shù)據(jù)表字段放入緩存里邊,//這樣下次訪問就避免執(zhí)行sql語(yǔ)句重復(fù)執(zhí)行重新獲取//開發(fā)調(diào)試模式APP_DEBUG=true,下邊緩存無(wú)效//生產(chǎn)模式APP_DEBUG=false,緩存有效'DB_FIELDS_CACHE' => true, // 啟用字段緩存//修改模板引擎為smarty'TMPL_ENGINE_TYPE' => 'Smarty', // 默認(rèn)模板引擎 //在頁(yè)面底部顯示日志信息'SHOW_PAGE_TRACE' => true, // 顯示頁(yè)面Trace信息

    實(shí)例化數(shù)據(jù)模型model的三種方法
    1.goodsmodel=newGoodsModel();2.goods_model = D(“Goods”); 快捷函數(shù)
    a)obj=D();//創(chuàng)個(gè)model對(duì)數(shù)據(jù)b)個(gè)obj就可以執(zhí)行原生的sql語(yǔ)句
    3.model=M();創(chuàng)model對(duì)a)model = M(‘User’); 創(chuàng)建基類model對(duì)象,但是操作的數(shù)據(jù)表sw_user

    查詢數(shù)據(jù)信息

    ① Model.class.php類本身就存在該方法,例如(where() field() limit() select())
    ② __call()自動(dòng)調(diào)用方法集成了一些方法,例如(table() order() group())
    這些方法可以進(jìn)行連貫操作info=obj -> where()->order()->limit()->select()

    $goods_model = D('Goods'); $info=$goods_model->select();//通過select()方法查詢數(shù)據(jù) //返回二維數(shù)組 //select(記錄主鍵值) //select("13,26,33"); $info = $goods_model -> select(); 全部記錄信息 $info = $goods_model -> select(19); //根據(jù)主鍵值查詢指定記錄 $info = $goods_model -> select("13,26,33"); //根據(jù)主鍵值查詢?nèi)舾蓷l記錄//find()方法返回一個(gè)一維數(shù)組數(shù)據(jù) //每次只返回一條記錄信息 $info = $goods_model -> find(19); $info = $goods_model -> find("29,32,45,19"); show_bug($info);//限制字段查詢field("字段,字段..."); $info = $goods_model -> select(); //全部字段、全部記錄信息 $info = $goods_model->field("goods_name,goods_number,goods_create_time")->select();//顯示查詢條數(shù)limit([偏移量,]長(zhǎng)度) $info = $goods_model -> limit(5)->select(); $info = $goods_model -> limit(5,5)->select();//排序查詢order("price asc/desc") $info = $goods_model -> order('goods_price desc')->select(); $info = $goods_model -> order('goods_price desc')->limit(5)->select(); //model對(duì)象調(diào)用本身不存在的方法order() //實(shí)際會(huì)執(zhí)行魔術(shù)方法__call()自動(dòng)調(diào)用//下邊的連貫操作,多個(gè)條件彼此沒有順序要求,最后都被傳遞給options屬性 //options屬性最后會(huì)把sql語(yǔ)句根據(jù)條件給拼裝好 $info = $goods_model ->limit(5)->field('goods_name,goods_price')-> order('goods_price desc')->select();//設(shè)置where條件 where() $info = $goods_model->where('goods_price > 5000')->select(); $info = $goods_model ->table('sw_goods')->select(); $info = $goods_model -> group("goods_category_id")->select();

    1.select() 返回二維數(shù)組
    2.find() 返回一維數(shù)組
    3.getByXXX(); 根據(jù)指定字段進(jìn)行數(shù)據(jù)查詢
    返回一維數(shù)組
    getByGoods_price(12000);
    getByGoods_name(); 魔術(shù)__call();
    4.having() 設(shè)置查詢條件
    與where比較類似
    select * from sw_goods where goods_price>100;
    select * from sw_goods having goods_price >100;

    function showlist(){$goods_model = D("Goods");//查詢名字為"三星BC01"商品信息//$info = $goods_model -> getByGoods_name('三星BC01');//$info = $goods_model -> getByGoods_price('5999');//show_bug($info);//$info = $goods_model -> having("goods_name like '諾%'")->select();//執(zhí)行原生sql語(yǔ)句$sql = "select * from sw_goods a join sw_category b on a.goods_category_id=b.cat_id";$info = $goods_model->query($sql);$this -> assign('info', $info);$this -> display();}

    model聚合函數(shù)使用
    count() sum() max() avg() min()

    執(zhí)行原生sql語(yǔ)句
    model?>query()語(yǔ)數(shù)model -> execute() 增加、修改、刪除
    insert update delete
    成功執(zhí)行返回受影響的記錄數(shù)目

    添加數(shù)據(jù)add

    兩種方式實(shí)現(xiàn)數(shù)據(jù)添加:數(shù)組方式、AR方式
    AR規(guī)則:
    1.數(shù)據(jù)庫(kù)中的每個(gè)數(shù)據(jù)表都對(duì)應(yīng)一個(gè)類,model
    2.數(shù)據(jù)表中的每條記錄都是類的一個(gè)對(duì)象
    3.記錄信息的每個(gè)字段都是對(duì)象的屬性
    在tp框架中AR模型是假的

    數(shù)據(jù)查詢有options屬性匯集各種連貫查詢條件
    數(shù)據(jù)添加有data屬性實(shí)現(xiàn)各種信息的收集

    //添加商品function add1(){$goods_model = D("Goods");//實(shí)現(xiàn)數(shù)據(jù)添加//數(shù)組下標(biāo) 與 數(shù)據(jù)庫(kù)表 字段 一致/*$d = array('goods_name'=>'htc230','goods_price'=>'3999','goods_number'=>45,'goods_weight'=>103);$rst = $goods_model -> add($d);*///AR方式實(shí)現(xiàn)數(shù)據(jù)添加//對(duì)象調(diào)用不存在的屬性需要調(diào)用魔術(shù)方法__set();/*$goods_model -> goods_name = "iphone6";$goods_model -> goods_price = "5700";$goods_model -> goods_number = 31;$goods_model -> goods_weight = 110;* *///以上4個(gè)信息最后被$this->data收集$rst = $goods_model -> add();show_bug($rst); //被添加記錄本身的id值$this -> display();}

    通過表單form實(shí)現(xiàn)數(shù)據(jù)添加

    function add(){$goods_model = D("Goods");//判斷是否提交表單if(!empty($_POST)){//數(shù)據(jù)添加//foreach($_POST as $k => $v){// $goods_model -> $k = $v;//}$goods_model -> create(); //tp框架本身收集表單數(shù)據(jù)方法$rst = $goods_model -> add();if($rst){$this -> success('添加成功',__URL__."/showlist");}} else {$this -> display();}}

    修改數(shù)據(jù)

    查詢:select() 添加:add()
    修改關(guān)鍵字:save() 返回受影響的記錄數(shù)目

    添加數(shù)據(jù):數(shù)組 和 AR
    修改數(shù)據(jù):數(shù)組 和 AR
    注意:實(shí)現(xiàn)數(shù)據(jù)修改必須符合兩個(gè)條件(主鍵id 或 where條件)

    //修改商品function upd1(){$goods_model = D("Goods");//修改數(shù)據(jù)$d = array('goods_name'=>'小米手機(jī)','goods_price'=>3200);$rst = $goods_model->where('goods_id>50') -> save($d);//在實(shí)際生產(chǎn)中,是不允許一次性修改全部記錄信息show_bug($rst);// $goods_model -> goods_name = "xxx"; // $goods_model -> goods_price = "xxx"; // $goods_model -> save();$this -> display();}

    具體案例實(shí)現(xiàn)update
    以前:http://網(wǎng)址/index.php?m=控制器&a=操作&goods_id=100&goods_price=2300
    現(xiàn)在:http://網(wǎng)址/index.php/控制器/操作/參數(shù)1/值/參數(shù)2/值/參數(shù)3/值。。。。。。

    function upd(參數(shù)1,參數(shù)2,參數(shù)3){//$_GET[‘參數(shù)1’];//$_GET[‘參數(shù)2’];參數(shù)1,參數(shù)2,參數(shù)3具體使用 } //以下方法被訪問必須傳遞參數(shù)//http://網(wǎng)址/index.php/控制器/方法/goods_id/102/goods_price/305//url地址參數(shù)名字要求與方法參數(shù)一致function upd($goods_id,$goods_price=506){//把被修改的商品信息查詢出來(lái),傳遞給模板顯示$goods_model = D("Goods");if(!empty($_POST)){//接收修改的表單數(shù)據(jù)$goods_model -> create(); //收集表單信息$rst = $goods_model -> save();if($rst){//$this -> success(提示信息,跳轉(zhuǎn)地址);$this -> success('修改成功',__URL__."/showlist");}} else {$info = $goods_model -> getByGoods_id($goods_id);$this -> assign('info',$info);$this -> display();}}

    tp框架中表單域驗(yàn)證

    表單驗(yàn)證:
    通過tp框架進(jìn)行表單驗(yàn)證
    先決條件:收集表單數(shù)據(jù)必須通過create()收集
    create()方法內(nèi)部有集成表單驗(yàn)證規(guī)則

    具體使用

    //注冊(cè)操作function register(){$user_model = D("User");if(!empty($_POST)){show_bug($_POST);$z = $user_model -> create(); //收集數(shù)據(jù)if($z){//把愛好的數(shù)組變?yōu)樽址?/span>$user_model -> user_hobby = implode(',',$_POST['user_hobby']);$rst = $user_model -> add();if($rst){echo "ok";} else {echo "failure";}} else {//表單域驗(yàn)證有錯(cuò)誤show_bug($user_model -> getError());}}else {}$this -> display();}

    在create()時(shí)會(huì)發(fā)生驗(yàn)證,驗(yàn)證的代碼寫在model中

    <?phpclass UserModel extends Model{//批量錯(cuò)誤信息顯示// 是否批處理驗(yàn)證protected $patchValidate = true;//進(jìn)行表單域驗(yàn)證//protected $_validate = array(); // 自動(dòng)驗(yàn)證定義protected $_validate = array(//array(驗(yàn)證字段,驗(yàn)證規(guī)則,錯(cuò)誤提示,[驗(yàn)證條件,附加規(guī)則,驗(yàn)證時(shí)間])array('username','require','用戶名必須填寫'),//密碼必須填寫array('password','require','密碼必須填寫'),//確認(rèn)密碼必須填寫/與密碼保存一致array('password2','require','確認(rèn)密碼必須填寫'),array('password2','password','兩次密碼必須一致',0,'confirm'),//驗(yàn)證郵箱array('user_email','email','郵箱格式必須正確',2),//驗(yàn)證qq號(hào)碼//全部數(shù)字、長(zhǎng)度5-12位、第一位非0array('user_qq','/^[1-9]\d{4,11}$/','qq格式必須正確'),//手機(jī)號(hào)碼驗(yàn)證,正則驗(yàn)證//學(xué)歷必須選擇一項(xiàng)//value值必須在一個(gè)范圍內(nèi) 2,3,4,5,array('user_xueli',array(2,3,4,5),'學(xué)歷必須選擇一項(xiàng)',0,'in'),//愛好,必須選擇兩個(gè)或以上項(xiàng)目//計(jì)算$_POST['user_hobby']這個(gè)數(shù)組里邊元素的個(gè)數(shù)array('user_hobby','check_hobby','愛好必須選擇兩項(xiàng)以上',1,'callback'),);//驗(yàn)證愛好的方法function check_hobby($hobby){//獲取$_POST['user_hobby']具體信息值//這個(gè)check_hobby被調(diào)用的時(shí)候已經(jīng)把$_POST['user_hobby']//當(dāng)成是參數(shù)給check_hobby了//show_bug($hobby);if(count($hobby) < 2){return false;} else {return true;}}//自定義個(gè)性方法進(jìn)行用戶名和密碼校驗(yàn)function checkNamePassword(){//sljdlsjdlk} }

    第四個(gè)參數(shù),驗(yàn)證條件
    驗(yàn)證條件:(可選)包含下面幾種情況:
    Model::EXISTS_VALIDATE 或者0 存在字段就驗(yàn)證(默認(rèn))
    Model::MUST_VALIDATE 或者1 必須驗(yàn)證
    Model::VALUE_VALIDATE或者2 值不為空的時(shí)候驗(yàn)證

    總結(jié)

    以上是生活随笔為你收集整理的ThinkPHP入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。