日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

thinkphp一句话疑难解决笔记

發(fā)布時間:2023/12/19 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 thinkphp一句话疑难解决笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

URL_PATHINFO_DEPR, depr表示 網(wǎng)頁路徑"分隔符",用"-", 有利于seo,注意是從 sername/index.php(開始的)/home-user-login-var-value開始的,pathinfo也支持普通的參數(shù)傳值(僅僅支持參數(shù)...). 在thinkphp中,有兩個地方使用depr,另一個就是tpl的文件目錄組織分隔符: 'TMPL_FILE_DEPR'=>'-'

URL_PATHINFO: 意思是路徑信息,意思是 網(wǎng)頁的url地址就表明了 網(wǎng)頁的模塊/控制器/操作等信息, 即path indicates info of the page.

'TAGLIB_BEGIN' => '<' 如果修改為[, 則擴(kuò)展標(biāo)簽(也叫xml標(biāo)簽)的調(diào)用就是 [volist....]... [/volist], xml標(biāo)簽定界符 不能跟基本標(biāo)簽符號如{,相沖突...否則會引起解析錯誤.

如何生成tp3.2.3的多個模塊?

  • 可以用手動創(chuàng)建類似Home模塊的Admin模塊目錄
  • 用define('BIND_MODULE' => 'Admin'); 將index.php入口文件綁定到Admin模塊,由于Admin模塊不存在,所以第一次訪問localhost時會自動創(chuàng)建 Admin模塊的目錄.
  • 以后要注釋掉 BIND_MODULE 模塊, 恢復(fù)默認(rèn)的入口為Home模塊..., 以后使用Admin模塊就如同Home模塊一樣的方法使用了...
  • 標(biāo)簽庫的配置,TAGLIB_PRE_LOAD => "cx,custom" 和TAGLIB_BUILT_IN=>"cx,custom"是兩個不同的配置,前者主要是 用于外在的 自定義的 自己創(chuàng)建的標(biāo)簽庫在tp啟動時就載入,適用于外在標(biāo)簽在多個模板大量使用的場合,不必在 模板頁面再用<taglib name="custom"> 注意,所有的標(biāo)簽都是小寫的 載入;后者是指在使用標(biāo)簽時不必在前面加上標(biāo)簽庫名稱,如<custom:great name="uid" value="1">...</custom:great>, 如果定義了custom為內(nèi)置標(biāo)簽,則直接寫<great name="uid" value="1">....</great>

    在tp中,在模板html文件中,凡是可以使用普通變量如 {$name} 的地方,都可以使用系統(tǒng)變量,{$_Get["name"]},{$Think.config.name},而且可以使用函數(shù)...

    在xml標(biāo)簽中,注意區(qū)分 "變量" 和 "變量名稱"的區(qū)別, 變量是要加$,而變量名稱 則不加$. 通常像 <volist name="user" id="vo">....</volist>中的name屬性使用的是變量名稱, 在value屬性中要使用變量,則要加上$. 同時在標(biāo)簽外面的,純粹的普通變量的輸出要加$: {$name}

    volist和foreach?
    volist 中的vo可以認(rèn)為是, vector output,(數(shù)組/矢量輸出) 也可以認(rèn)為是數(shù)組/矢量 對象vector object. volist就是矢量對象列表. volist主要是用于數(shù)據(jù)表查詢結(jié)果或二維數(shù)組的輸出, foreach主要用于對象或數(shù)組的輸出. volist的屬性主要有name, id, offset-length(用于部分輸出),mod. 而foreach的屬性有name,item ,key

    volist的mod?
    它是一個屬性,也可以認(rèn)為是一個賦值, <volist ... mod="2,5,x"> 等價于 <volist name="result" id="vo" key="i"> ...<assign name="mod" value="$i mod x"> mod="2" 實(shí)際上是 mod="key % 2" 但是你不能單獨(dú)的去賦值mod, 要在volist循環(huán)中賦值,所以就直接 寫在volist的屬性中了, 通常要把olist mod="x" 和 eq name="mod" value="1""2""..." 結(jié)合起來使用.

    通常寫volist的 id就直接寫成 vo, 這是約定 習(xí)慣:<volist name="result" id="vo">

    對tp標(biāo)簽庫的理解,不管有多復(fù)雜, 就是把它理解為 解釋擴(kuò)展的 <?php .... ?>代碼. 解析后的代碼實(shí)際上是一個 php和html混合的頁面. 擴(kuò)展的xml標(biāo)簽是為了在 html中不只是 "肯定的,不變的"輸出 模板變量, 而且還要實(shí)現(xiàn)如同 php/js等代碼程序中的 條件語句if, switch, 和循環(huán)語句for foreach volist等, 用"純粹的html標(biāo)簽式的頁面" 來代替html和php的混合頁面.

    compare標(biāo)簽和eq等標(biāo)簽, range標(biāo)簽和between等標(biāo)簽?
    eq, gt等比較標(biāo)簽,是compare標(biāo)簽的別名, 都有name, value屬性,只是compare標(biāo)簽多了一個type屬性來指明是eq, gt,lt(less than)等.注意, 比較標(biāo)簽和范圍標(biāo)簽其實(shí)都是 條件標(biāo)簽 if,都要解析為if條件語句... 只是比if標(biāo)簽更簡潔.

    tp中的模板標(biāo)簽和 html標(biāo)簽 的用法不同!! html標(biāo)簽是不允許 在標(biāo)簽名 中 嵌套的, 如:<p <span> span text</span>> para text </p>的寫法是錯誤的, 但是tp中的 模板標(biāo)簽, 由于要解析成php代碼, 所以 在 一個標(biāo)簽的名稱中, 在標(biāo)簽的屬性中, 是可以"嵌套" 其他tp標(biāo)簽的, 如: <tr <eq id="uid" value="1">style="background-color:#eee"</eq>> ....<td>....</td> </tr>

    php中的empty和isset的區(qū)別?
    empty是判斷是否為空,而isset是判斷該變量或數(shù)組的元素是否設(shè)置,
    通常, 如果 $var=0,false,null,'', 則empty($var)====true
    對于isseet來說, 跟上面的一樣,當(dāng) $var=0,false,''時, 則isset($var)=true,只有一個, 當(dāng)$var=null的時候, isset($var)===false.

    數(shù)組和對象的寫法區(qū)別?
    數(shù)組的寫法是 $arr['key'], 對象的寫法則是用冒號表示: $obj:member, 而要自動識別時,則用點(diǎn)號 $some.member, 但是,在能夠確定時,最好是寫明確些

    import和vendor函數(shù)的區(qū)別?
    它們其實(shí)都是在內(nèi)部調(diào)用的 require, 只是開始的部分做了些調(diào)整, 如果是ThinkPHP下的 Library/Think(或者core)下的類都是可以直接使用 , 如果是 Library下的Org,則用import來引入類, 如果是Vendor下的類,要引入, 則用vendor函數(shù), 他們的區(qū)別, 只是針對的路徑不同.
    通常自己寫的類/類庫,或引入的 按tp的規(guī)則 寫的其他人,開發(fā)團(tuán)隊(duì)寫的 類庫, 都放在 Org目錄下, 使用import來引入; 如同在C++中一樣,如果是沒有按tp默認(rèn)約定規(guī)則來寫的\放在vendor目錄下的類庫, 就用vendor方法來引用, 只是import和vendor的參數(shù)的默認(rèn)值不同.

    tp的show,display,直接echo的區(qū)別?
    echo就是直接輸出內(nèi)容,跟tp函數(shù)沒有毛關(guān)系; display和show都是View類的成員函數(shù), 都有三個參數(shù)('tmpl對應(yīng)文件','charset,doc-type),但是display要求要有對應(yīng)的tmpl文件, 而show則不一定要有對應(yīng)的tmpl文件, 可以直接輸出html內(nèi)容...

    php是解釋型語言, 解釋一句,再執(zhí)行一句,所以前面有輸出,當(dāng)后面有錯誤時,會終止運(yùn)行,只是并不是直接翻譯成機(jī)器碼: 先將php源代碼轉(zhuǎn)換為opcode(如同在匯編語言中,nop是助記符, 0x90是opcode...,即計算機(jī)的中間代碼),然后由php的解釋引擎(php虛擬機(jī),pvm): zend 來運(yùn)行,也可以用jit技術(shù)在虛擬機(jī)上運(yùn)行時編譯成機(jī)器碼來提高運(yùn)行速度. 現(xiàn)在的語言,編譯和解釋的分別都不是那么嚴(yán)密了.

    使用高版本的php, 功能更強(qiáng)大,

    像__ROOT__, PUBLIC,...等都是在模板文件中,使用的, 不是在 控制器/方法|操作,中使用的, 而且是在 配置文件中的 TMPL_PARSE_STR' => array( '__PUBLIC' => ...,.....)中定義的, 因?yàn)樵谀J(rèn)情況下, ROOT, __PUBLIC__這些都是要被解析\替換的,所以如果確實(shí)要輸出 像ROOT, __PUBLIC__這樣的字符串, 則可以使用 另外的模板字符串定義 TMPL_PARSE_STR' => array( '--PUBLIC--' => '__PUBLIC__' ...,.....)

    ThinkPHP的內(nèi)置標(biāo)簽庫在哪里?
    內(nèi)置標(biāo)簽庫的基類是: \ThinkPHP\Library\Think\Template\TagLib.class.php, 內(nèi)置的標(biāo)簽庫cx(標(biāo)簽庫的名稱都用小寫)在\ThinkPHP\Library\Think\Template\TagLib\Cx.class.php文件中.

    C/C++為什么要使用指針分配對象?
    Object myobj這種方式是自動分配,作用域在函數(shù)范圍內(nèi),當(dāng)1. (使用指針會帶來兩個作用,也可以說是 兩個問題,看你是需要還是避免) 要延長對象的作用域和生命期, 并且要使用的是對象指向內(nèi)存的本身, 而不是對象的拷貝; 2.要指向的對象本身分配的內(nèi)存比較大,如果用對象的拷貝,耗費(fèi)的內(nèi)存比較大,可能溢出棧 時, 使用只能指針比較好, 具有RAII std::unique_ptr, std::shared_ptr, ...(這個比較少見) 因此, 如果只是要在文件作用域內(nèi),進(jìn)行 函數(shù)傳參時, 使用 對象的本身,但是不需要延長生命期的時候, 就不要使用 指針, 而是使用 引用 就可以了, 這樣就避免了指針的 "延長生命期"的 "副作用" . 當(dāng)然還有其他需要使用指針的時候, 如多態(tài)的實(shí)現(xiàn)...

    php中的對象, 因?yàn)槎际怯胣ew來實(shí)例化的,所以都用 ->(叫對象運(yùn)算符)來引用(對象的成員變量,也叫屬性,字段,features), 靜態(tài)用::(叫雙冒號)來引用. 但是在tp的模板中使用冒號:來引用對象的成員.

    后臺模塊 Admin 的配置參考 http://www.mamicode.com/info-detail-1181250.html

    頁面trace是怎樣做到的過程?
    定義'SHOW_PAGE_TRACE' => true,

    模型類的定義問題? - 注意tp中的路徑問題, 很多路徑,都是 規(guī)定, 系統(tǒng)約定, 系統(tǒng)中的解析器, 會從約定的路徑開始解析...
    自定義模型類, 要使用"相對路徑", 不用加 , 從模塊開始寫起:
    <?php namespace Home\Model; use Think\Model; class FooModel extends Model{...} ?>
    而實(shí)例化自定義的模型類時, 要使用 "形式上的 絕對路徑" ,從 ?寫起:
    $User = new \Home\Model\FooModel();


    數(shù)據(jù)庫的連接查詢?
    目的是為了從多個表中獲取字段的信息,條件是兩個表 中要有相關(guān)聯(lián)的字段,字段的數(shù)據(jù)類型要相同,名稱不一定相同.

    內(nèi)連接的方式:
    mysql默認(rèn)的方式就是內(nèi)連接,即join=inner join, 使用join要結(jié)合on使用, on是指明兩個表用 哪兩個字段 進(jìn)行連接查詢; 不同于where,where是過濾 連接查詢結(jié)果 后的條件. 如果不使用join, 則使用 "隱含"內(nèi)連接, 連接字段就放在where中(這時候的where就相當(dāng)于on...).

    mysql支持 中文下標(biāo)key嗎? 是的:如{$vo["學(xué)號"]}

    thinkphp中為什么要使用query函數(shù)?
    如果是針對 單一的一個表, 的insert delete update select等操作, 就使用tp的 鏈接操作函數(shù),
    但是如果要操作的情況比這個復(fù)雜, 如查詢的表不是一個表,操作的是多個表, 或者是不是普通的Crud,而是聯(lián)合查詢,那么這個時候,就不能使用鏈?zhǔn)胶瘮?shù), 而要使用原生的sql語句,調(diào)用query函數(shù)了.如下:

    $Sql= M();$query = "select foo.uid as '學(xué)號',foo.name,score.score from foo,score where foo.uid=score.sno and foo.name='john'";$query = "select foo.uid, foo.name, score.score from foo join score on foo.uid=score.sno where foo.name='john'";$result = $Sql->query($query);dump($result);

    tp支持標(biāo)準(zhǔn)的orm和AR及原生的sql操作,為什么要寫這么多"眼花繚亂"的方法呢? 是因?yàn)樵趯?shí)際中的需求就有這么多,有的是功能的需求,有的是效率性能上的需求.

    tp的"增刪改查"就是add, delete, save, select,跟原生的sql操作名稱不一樣,一是,不能去"占用""覆蓋"原生的操作名稱,二是正好與日常的"叫法"相一致.


    $User=M('user')就是數(shù)據(jù)表對應(yīng)的類的實(shí)例化對象,從oop的觀點(diǎn)來看,它本身就應(yīng)該,也可以用來操作數(shù)據(jù)表的curd操作.

    通常只有在add和save方法中,才需要創(chuàng)建數(shù)據(jù)對象DO, 調(diào)用`$User->create(); create($data);create($another_do); 也可以使用

    data($data)方法`, 只有創(chuàng)建了do(在內(nèi)存中),才能用add/save方法寫入數(shù)據(jù)庫

    create和data創(chuàng)建do的區(qū)別?
    create做的工作很多,包括了獲取ds,ds合法性檢驗(yàn),檢查字段映射, 字段驗(yàn)證,自動完成,令牌檢查等. 而data則沒有那么多的附加工作和
    功能,要自己去完成.

    select子查詢的作用主要有四點(diǎn)?
    1.用作生成子表(返回多條數(shù)據(jù)), 如 join (select....)as another_table...
    2.用作生成一個靜態(tài)數(shù)值, 在算術(shù)表達(dá)式中使用
    3.用作生成 "一個" "相關(guān)子查詢""動態(tài)子查詢" 數(shù)值, 用在 條件等 算數(shù)表達(dá)式中
    4.用作生成數(shù)值范圍,用在exist,not exist語句中.

    rand和mt_rand?
    mt_rand比rand的速度更快(快4倍?),生成的隨機(jī)數(shù)更好? 在windows下, RAND_MAX的值是32768, 并且rand和mt_rand都不需要播種.

    php中生成m,n之間的隨機(jī)數(shù)?
    php生成隨機(jī)整數(shù)值,比aspx,java更簡潔,不需要去/100, 不需要去round,ceil等,直接用mt_rand(m, n)就得到了.

    count(*)和count(column)的區(qū)別?
    http://www.cnblogs.com/wzmenjoy/p/4244590.html count(column)不計 column為null的條數(shù)?
    sum(參數(shù)), 如果參數(shù)是列名, 則表示整個列的數(shù)值的和, 如果是條件表達(dá)式,則是表示 列值滿足條件表達(dá)式 的記錄 行數(shù)的 總和

    不能用count(條件表達(dá)式) 如count(score<60) 來統(tǒng)計不及格的總數(shù), 因?yàn)?count(參數(shù))中,只要參數(shù) !=NULL 則都表示計算總的記錄條數(shù). 所以,count(0)=count(1)=count(2)...=count(*)... 的

    group by ,having等的用法:http://blog.csdn.net/zuiwuyuan/article/details/39431639
    group: 意思是: 分組,聚合,組合,統(tǒng)計函數(shù)

    having和where的區(qū)別?
    where是對記錄進(jìn)行原始條件過濾,在分組 group by語句前使用; where中不能使用聚合函數(shù).
    having是對分組后的結(jié)果,進(jìn)行條件過濾, 在having中可以使用 聚合函數(shù),也可以使用 一般過濾條件.

    where score > max(score): error: invalid use of group function.?
    這個問題就是,"為什么在 where 子句中 要使用where score > = (select avg(score) from table)' 而不是直接使用 where score> avg(score)', 上面已經(jīng)做了回答: 因?yàn)樵趙here字句中不能使用group function! 所以,要用子查詢...

    mysql 為什么要使用group by 分組?
    因?yàn)閷?shí)際項(xiàng)目中, 有"需要分組, 按類別"進(jìn)行數(shù)據(jù)查詢,統(tǒng)計的需求. 將"某列(某個字段)具有相同值的多條記錄合并為一組,最后作為一條記錄輸出", 注意這里是說 作為一條記錄輸出. 通常分組是和 聚合函數(shù)一起進(jìn)行輸出的, 通常輸出的字段是 '分組字段1', '分組字段2...', '字段的聚合函數(shù)' from table group by '分組字段1', '分組字段2...'. 分組字段的選擇是關(guān)鍵,要選擇"某一列的值都相同的" 那個字段作為 "分組字段", 否則就失去了分組的意義,因?yàn)榫蜎]有辦法分組.
    (如果select語句中的 字段 沒有使用組函數(shù),那么它就必須出現(xiàn)在group by字句中, 即作為分組字段,否則,就只會顯示第一條記錄 的那個 字段值). 也就是說, 如果group by 不跟聚合函數(shù)一起使用, select中不是使用的分組字段/group function,則就是沒有意義的分組,就是根本不懂分組的人.

    mysql->php->browser的中文亂碼問題?
    下面的說法是不正確的!!!

    很簡單: 在mysql中不管,不要修改,保持為默認(rèn)的utf-8; php就是連接的橋梁,是保證無亂碼的核心; browser不用手動去設(shè)置, 它的內(nèi)容的編碼, 可以通過php的header函數(shù)來指定,來控制. 也就是說, 只要保證 *.php文件 要寫入到 mysql數(shù)據(jù)庫的文件編碼是 utf-8 就 一切ok 一是, 跟php文件的 編輯器/ide有關(guān), 看editor能不能設(shè)置為utf-8編碼; 二是, 如果編輯器不能設(shè)置為utf-8編碼,就要用字符集轉(zhuǎn)換函數(shù)

    php的 iconv和mb_convert_encoding?
    兩者都不是php的原生函數(shù)庫函數(shù), 要通過擴(kuò)展開啟才能使用: php_icon.dll, php_mbstring.dll(可以通過phpinfo查看);
    iconv的效率比mb_convert_encoding快, 只有當(dāng)不知道原來的編碼,或iconv轉(zhuǎn)換出錯時,才使用后者;
    iconv(in_charset, out_charset, str): out_charset//TRANSLIT(TRANSLATE + IT, 表示不能準(zhǔn)確轉(zhuǎn)換時,轉(zhuǎn)換成一個近似的字符也可以),//IGNORE表示不能轉(zhuǎn)換時,忽略它.
    iconv和mb_convert_encoding, 他們的參數(shù)都是一樣的, 但參數(shù)的方向正好相反. mb_convert_encoding(str, out_charset, [in_charset]最后這個"原來的字符編碼集"參數(shù)是可選的)...

    php header的格式
    header函數(shù)調(diào)用, 要放在方法函數(shù)中, 不能放在php標(biāo)簽后,函數(shù)外部.header("字符串 Content-type: text/html; charset=utf-8 ");

    mysql的查詢操作 "時間"概念?
    通常,一個簡單的查詢操作, 費(fèi)時: 0.000幾秒, 即萬分之幾秒, 多一點(diǎn)的操作 是 0.00幾秒, 即千分之幾秒.


    php的類中的成員變量和成員方法 都要顯式的說明其 訪問類型, public,protected,private, 默認(rèn)的,如果不寫訪問類型,則是public.

    PHP_EOL: end of line
    在mac中: \r, unix-like: \n, windows: \r\n. 只是換行符, 但是在html中仍然只是表現(xiàn)為一個空格, 不會換行.

    控制器中的方法,總是 先輸出本方法中輸出的內(nèi)容, 然后,(如果有this->display()的話), 再輸出對應(yīng)的視圖頁的內(nèi)容.

    注意區(qū)別常量和"模板解析字符串"的區(qū)別?
    因?yàn)檫@些常量和"convention"配置很容易混淆,所以要注意區(qū)別:
    tp的常量包括: 預(yù)定義常量(如: THINK_VERSION,URL_COMMON...), 路徑常量(THINK_PATH,LIB_PATH,CORE_PATH)等,系統(tǒng)常量(APP,ROOT,MODULE,CONTROLLER,ACTION,SELF, IS_POST)等等(這些系統(tǒng)常量中, 分成兩種,有的只能用在PHP文件中,如: IS_POST,有的既可以用于php文件中,又可以用于View視圖的html頁面中, 如: URL之類的系統(tǒng)常量,SELF,MODULE,CONTROLLER,__ACTION__等, 而且這些變量可以用在html模板中的任意地方,既可以是地址之類的,如href,form的action,也可以直接在頁面內(nèi)容中輸出...)

    前面的常量, **只是限于系統(tǒng)已經(jīng)定義了的(__PUBLIC__這個好像是已經(jīng)定義了的, 好像不一定只是幫組手冊上所提到的那些), 如果沒有定義,你就不能在view視圖頁面內(nèi)直接使用,要使用自己定義的模板變量進(jìn)行地址替換, 就必須在配置文件的TMPL_PARSE_STRING中進(jìn)行設(shè)置和規(guī)定.**

    系統(tǒng)常量中的URL地址之類的東西,總是從根路徑 "/"開始輸出的(并且除了__ROOT__之外,其余都是帶index.php入口地址的), 如: ROOT:/, MODULE: /index.php/Home, CONTROLLER: /index.php/Home/Index, 而且通常URL地址類的系統(tǒng)常量,是不帶最后面的斜杠的,所以后面要接地址時,要自己加/

    R函數(shù)是做什么的?
    在同一個控制器內(nèi),調(diào)用方法時,可以直接使用 funcName(); 但是如果一個控制器的方法, 要調(diào)用另一個控制器的方法, 那么就要用R 函數(shù)了,支持從 R(module/controller/method)

    A方法和R方法的區(qū)別?
    都是跨"模塊/控制器"調(diào)用方法的, A方法是明確實(shí)例化一個控制器的對象,然后調(diào)用其中的方法$Con=A('Foo'); $Con->method1(); $Con->method2()..., 相當(dāng)于$Con=new FooController()..., 而R方法是每次都要實(shí)例化一個類的對象,R('Foo')->method1(); R('Foo')->method2(); 這個會生成兩個實(shí)例. 因此,如果要使用其他模塊的多個方法,建議使用A方法.如果只使用其他模塊內(nèi)的一個方法, 用R方法最簡潔.

    U方法和"地址類系統(tǒng)變量"的區(qū)別?
    "地址類系統(tǒng)變量" 只能使用本模塊/本控制器/本操作的方法, 如果要使用其他模塊或控制器的方法地址時,就 要使用U方法了. U方法可以通過在php操作中賦值然后assign的方式使用,也可以直接在模板中使用 {:U(oper)} 會一直生成完整 的路徑 /index.php/Home/Index/oper.html(很奇怪,這個也可以訪問,其實(shí)應(yīng)該是重定向了?)

    如何根據(jù)md5值反向 找到是哪個方法生成的cache?
    這個是不可以的! 因?yàn)閙d5: message-digest algorithm 5,將任意長度的字符串,經(jīng)過算法處理,轉(zhuǎn)換成128bit的整數(shù),共32為16進(jìn)制數(shù)字 md5是 哈希混淆,不可逆的, 也就是md5是不可解密的,將用戶的密碼經(jīng)過md5加密后放入數(shù)據(jù)庫中, 即使是管理員也不能看到用戶的密碼,做到了地位平等 要暴力破解,也是用一些常用的字符串經(jīng)過md5加密后,做成一個表,然后遍歷比較.密碼驗(yàn)證的原理也是這樣的: 將輸入的密碼,md5轉(zhuǎn)換后,然后與數(shù)據(jù)庫中保存的相比較...

    Application/Runtime/Cache/Home/緩存規(guī)則名稱??.php緩存文件名稱是怎么來的,如何知道它是哪個 html文件的緩存?
    為什么thinkphp的 View/Controller_name/oper_name.html 的緩存竟然成了????.php文件呢? 因?yàn)閠p的view下的模板文件中使用了 模板標(biāo)簽,如{$varname}, {:U(....)}等, 所以經(jīng)過緩存后,就成了<?php echo $varname} , echo U(...)...?> 的 php文件 tp手冊上有說明, 靜態(tài)緩存文件的 名稱 有 多種 規(guī)則,(當(dāng)然絕對不是模板文件的名稱, 所以就不要用模板文件名去試探了...) 最后可能使用了md5函數(shù)

    肯定的: convention.php中并沒有包含完全/所有的配置項(xiàng), 如關(guān)于靜態(tài)緩存的配置 TMPL_CACHE_ON => true, TMPL_CACHE_TIME => 60秒... **注意這里應(yīng)該是TMPL,不是HTML. 有些所謂的手冊或文章是錯誤的!

    part: n.部分,零件;v. 使分割,分開,分隔.
    apart: a-part: 分開的;
    partial: 部分的, 偏愛的, 鐘愛的 be partial to Chinese food.
    impartial: 不偏不倚的,公平的,公正的,持平的 as an impartial observer, an impartial view.
    partly:部分地
    depart: de-(分開)-part(分隔): 分隔|分開| -> 離開 he departed from Beijing.
    因此, thinkphp中的DEPR,就是分隔符,分割符的意思.包括: TMPL_FILE_DEPR, URL_PATHINFO_DEPR等.


    thinkphp為什么能夠 全盤(在任何目錄或文件中都可以)應(yīng)用那些 常量/變量/設(shè)置/類/函數(shù)?

  • 所有的請求都被應(yīng)用程序的入口文件index.php所攔截了
  • 入口文件包含了ThinkPHP框架的入口文件 require ...ThinkPHP.php
  • 在ThinkPHP.php, 首先定義了 (最基本的一些常量) 包括框架的const 預(yù)定義常量(const URL_COMMON=0 ... const EXT='.class.php' const THINK_VERSION = '3.2.3'...) , 路徑常量(THINK_PATH, LIB_PATH, CORE_PATH,....), 跟系統(tǒng)信息 有關(guān)的常量(IS_WIN, IS_CGI,IS_CLI) 還有一個 ROOT,是在ThinkPHP.php文件中定義的.

  • 然后調(diào)用了 require CORE_PATH.'Think'.EXT
  • 在Think.class.php是tp 整個底層框架的 引導(dǎo)類, 由它加載所有的底層架構(gòu),包括模型/視圖/緩存/日志/配置等等... 所以可以實(shí)現(xiàn)上面的目的...
    6 最后引導(dǎo)應(yīng)用程序啟動 Think\Think::start();

  • Thinkphp為什么能夠攔截所有請求, 實(shí)現(xiàn)單一入口?
    由index.php來響應(yīng)所有的http請求,來統(tǒng)一調(diào)度 :如同一棟房子中的多個房間只有一扇門,進(jìn)入門之后, 再到哪個房間,則由 dispatch::dispatch() 來決定路由和哪個控制器和action,在dispatch中有 $_SERVER['HTTP_URI'],解析它就知道是哪個controller和action了. 這個 dispatch::dispatch() 里面就對url進(jìn)行了分析, 結(jié)合 getController /Action/ Module 確定出了 ...

    Runtime目錄是在App目錄下, 不是在模塊目錄下Home, 它是包括Cache, Data, Log等在內(nèi)的,其中Cache下再分模塊Home等...

    頁面布局: 按鈕元素靠兩邊, 內(nèi)容占中間.

    開發(fā)功能模塊的思路?
    先要進(jìn)行功能整理, 弄清該模塊(管理)包括哪些功能, 然后可以用兩種方式來組合實(shí)現(xiàn): 一是模塊為目錄,每個功能為一個單獨(dú)的文件,這樣功能之間相互獨(dú)立,但是不利于代碼的共享; 二是,模塊定義為一個類文件,其中的功能定義為類中的方法...

    有關(guān)/module/controller/action____的系統(tǒng)常量 是在: CORE_PATH/dispatch.class.php中定義的, dispatcher類就是完成 /module/controller/action對應(yīng)的常量的定義, 以及解析pathinfo的路徑地址進(jìn)行 路由和調(diào)度 ,將模塊/控制器/動作的形式 解釋調(diào)度到 對應(yīng)的視圖html模板上去...

    class dispatcher{ //這里是erstatic public function dispatch(){ // 這里沒有-er....define('__CONTROLLER__', __MODULE__.$depr.(defined(BIND_CONTROLLER) ? '' :($urlCase ? parse($controller) : $controller ));...}}

    而__PUBLIC__, ROOT, __MODUEL__等在模板中的替換工作, 則是在 THINK_PATH/Behavior/ContentReplace.class.php中 的 入口函數(shù) public function run(&$content)->templateContentReplace($content)中,作為$replace=array(..., 'PUBLIC' => ROOT."/Public"...); 來替換的...

    static 和publi private等的位置關(guān)系?
    static和public等位置可以顛倒. 說法是: 編譯的先后順序不同,但結(jié)果是一樣的; 靜態(tài)的公開成員和公開的靜態(tài)成員; 跟不同語言的編寫"約定"的風(fēng)格有關(guān),比如c++中就把public放在static的前面, php中就把static放在public的前面,遵循大多數(shù)人的/語言的默認(rèn)風(fēng)格就好. 在php中, 類都是public的 ,static是類層次的,public是成員層次的.php中大多數(shù)都是將static放在public的前面的,如: static public function dispatch(){...}

    如何設(shè)置地址重寫?
    地址重寫Rewrite跟 配置文件convention.php中的 URL_REWRITE=>2, 'URL_MODEL'=>1等都沒有關(guān)系,.htacess是分布式重寫控制, 可以實(shí)現(xiàn)服務(wù)器級別和目錄級別的重寫. 只要放在某個目錄下,那么這個目錄就可以自動 實(shí)現(xiàn)地址重寫,如果放在app的父目錄下,則整個項(xiàng)目都可以實(shí)現(xiàn)重寫. (原生的.htaccess實(shí)際上只是實(shí)現(xiàn)了隱藏index.php的功能)
    要開啟Rewrite, 只要開啟apache的rewrite模塊功能就好了 在上面打勾就行.

    Rewrite目的是為了 url跳轉(zhuǎn)和地址隱藏,可以實(shí)現(xiàn) 偽靜態(tài), 域名跳轉(zhuǎn),防止盜鏈. <IfModule mod_rewrite.c> Options +FollowSymLinks //這個是必須的,否則報錯: 500 服務(wù)器內(nèi)部錯誤RewriteEngine On測試(Perl的 (類似linux的shell)正則表達(dá)式) 匹配條件, 依次有多條, 條件成立(測試匹配,如同if...)才執(zhí)行下面的Rewrite substition// %{REQUEST_FILENAME}: htaccess/mod_rewrite定義的內(nèi)部變量,表示請求的文件 // -d:表示前面的%{REQUEST_FILENAME}, 存在且是目錄 , -f表示 存在且為普通文件. // !-d, !-f 就表示 要么不存在, 或者不是目錄或文件. (通常的情況是 表示 "不存在", 如果要訪問的地址存在,一般都是目錄/文件,則直接訪問, // 因?yàn)椴黄ヅ錅y試條件,所以就不執(zhí)行 rewrite rule了 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] RewriteRule ^(.*)$ http://other.example.com/$1 [參數(shù)/標(biāo)記/附加說明]RewriteRule指令/語句的格式: RewriteRule Pattern Substitution [flags] 參考:http://blog.csdn.net/paulluo0739/article/details/17711851 QSA: qsappend, PT: passthrough(在應(yīng)用多個模塊如mod_rewrite, mod_alias對地址進(jìn)行重寫時使用),L: last.</IfModule>

    配置文件convention.php中的'VAR_CONTROLLER'=>'c' ,就是用來在 $_GET['c']中獲取控制器的.


    轉(zhuǎn)載于:https://www.cnblogs.com/bkylee/p/6072582.html

    總結(jié)

    以上是生活随笔為你收集整理的thinkphp一句话疑难解决笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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