thinkphp一句話疑難解決筆記

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

URL_PATHINFO: 意思是路徑信息,意思是 網頁的url地址就代表了 網頁的模塊/控制器/操做等信息, 即path indicates info of the page.html

'TAGLIB_BEGIN' => '<' 若是修改成[, 則擴展標籤(也叫xml標籤)的調用就是 [volist....]... [/volist], xml標籤訂界符 不能跟基本標籤符號如{,相沖突...不然會引發解析錯誤.java

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

  1. 能夠用手動建立相似Home模塊的Admin模塊目錄
  2. define('BIND_MODULE' => 'Admin'); 將index.php入口文件綁定到Admin模塊,因爲Admin模塊不存在,因此第一次訪問localhost時會自動建立 Admin模塊的目錄.
  3. 之後要註釋掉 BIND_MODULE 模塊, 恢復默認的入口爲Home模塊..., 之後使用Admin模塊就如同Home模塊同樣的方法使用了...

標籤庫的配置,TAGLIB_PRE_LOAD => "cx,custom"TAGLIB_BUILT_IN=>"cx,custom"是兩個不一樣的配置,前者主要是 用於外在的 自定義的 本身建立的標籤庫在tp啓動時就載入,適用於外在標籤在多個模板大量使用的場合,沒必要在 模板頁面再用<taglib name="custom"> 注意,全部的標籤都是小寫的 載入;後者是指在使用標籤時沒必要在前面加上標籤庫名稱,如<custom:great name="uid" value="1">...</custom:great>, 若是定義了custom爲內置標籤,則直接寫<great name="uid" value="1">....</great>linux

在tp中,在模板html文件中,凡是可使用普通變量如 {$name} 的地方,均可以使用系統變量,{$_Get["name"]},{$Think.config.name},並且可使用函數...c++

在xml標籤中,注意區分 "變量" 和 "變量名稱"的區別, 變量是要加$,而變量名稱 則不加$. 一般像 <volist name="user" id="vo">....</volist>中的name屬性使用的是變量名稱, 在value屬性中要使用變量,則要加上$. 同時在標籤外面的,純粹的普通變量的輸出要加$: {$name}正則表達式

volist和foreach?
volist 中的vo能夠認爲是, vector output,(數組/矢量輸出) 也能夠認爲是數組/矢量 對象vector object. volist就是矢量對象列表. volist主要是用於數據表查詢結果或二維數組的輸出, foreach主要用於對象或數組的輸出. volist的屬性主要有name, id, offset-length(用於部分輸出),mod. 而foreach的屬性有name,item ,key算法

volist的mod?
它是一個屬性,也能夠認爲是一個賦值, <volist ... mod="2,5,x"> 等價於 <volist name="result" id="vo" key="i"> ...<assign name="mod" value="$i mod x"> mod="2" 其實是 mod="key % 2" 可是你不能單獨的去賦值mod, 要在volist循環中賦值,因此就直接 寫在volist的屬性中了, 一般要把olist mod="x" 和 eq name="mod" value="1""2""..." 結合起來使用.sql

一般寫volist的 id就直接寫成 vo, 這是約定 習慣:<volist name="result" id="vo">thinkphp

對tp標籤庫的理解,無論有多複雜, 就是把它理解爲 解釋擴展的 <?php .... ?>代碼. 解析後的代碼其實是一個 php和html混合的頁面. 擴展的xml標籤是爲了在 html中不僅是 "確定的,不變的"輸出 模板變量, 並且還要實現如同 php/js等代碼程序中的 條件語句if, switch, 和循環語句for foreach volist等, 用"純粹的html標籤式的頁面" 來代替html和php的混合頁面.

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

tp中的模板標籤和 html標籤 的用法不一樣!! html標籤是不容許 在標籤名 中 嵌套的, 如:<p <span> span text</span>> para text </p>的寫法是錯誤的, 可是tp中的 模板標籤, 因爲要解析成php代碼, 因此 在 一個標籤的名稱中, 在標籤的屬性中, 是能夠"嵌套" 其餘tp標籤的, 如: <tr <eq id="uid" value="1">style="background-color:#eee"</eq>> ....<td>....</td> </tr>

php中的empty和isset的區別?
empty是判斷是否爲空,而isset是判斷該變量或數組的元素是否設置,
一般, 若是 $var=0,false,null,'', 則empty($var)====true
對於isseet來講, 跟上面的同樣,當 $var=0,false,''時, 則isset($var)=true,只有一個, 當$var=null的時候, isset($var)===false.

數組和對象的寫法區別?
數組的寫法是 $arr['key'], 對象的寫法則是用冒號表示: $obj:member, 而要自動識別時,則用點號 $some.member, 可是,在可以肯定時,最好是寫明確些

import和vendor函數的區別?
它們其實都是在內部調用的 require, 只是開始的部分作了些調整, 若是是ThinkPHP下的 Library/Think(或者core)下的類都是能夠直接使用 , 若是是 Library下的Org,則用import來引入類, 若是是Vendor下的類,要引入, 則用vendor函數, 他們的區別, 只是針對的路徑不一樣.
一般本身寫的類/類庫,或引入的 按tp的規則 寫的其餘人,開發團隊寫的 類庫, 都放在 Org目錄下, 使用import來引入; 如同在C++中同樣,若是是沒有按tp默認約定規則來寫的\放在vendor目錄下的類庫, 就用vendor方法來引用, 只是import和vendor的參數的默認值不一樣.

tp的show,display,直接echo的區別?
echo就是直接輸出內容,跟tp函數沒有毛關係; display和show都是View類的成員函數, 都有三個參數('tmpl對應文件','charset,doc-type),可是display要求要有對應的tmpl文件, 而show則不必定要有對應的tmpl文件, 能夠直接輸出html內容...

php是解釋型語言, 解釋一句,再執行一句,因此前面有輸出,當後面有錯誤時,會終止運行,只是並非直接翻譯成機器碼: 先將php源代碼轉換爲opcode(如同在彙編語言中,nop是助記符, 0x90是opcode...,即計算機的中間代碼),而後由php的解釋引擎(php虛擬機,pvm): zend 來運行,也能夠用jit技術在虛擬機上運行時編譯成機器碼來提升運行速度. 如今的語言,編譯和解釋的分別都不是那麼嚴密了.

使用高版本的php, 功能更強大,

像__ROOT__, PUBLIC,...等都是在模板文件中,使用的, 不是在 控制器/方法|操做,中使用的, 並且是在 配置文件中的 TMPL_PARSE_STR' => array( '__PUBLIC' => ...,.....)中定義的, 由於在默認狀況下, ROOT, __PUBLIC__這些都是要被解析\替換的,因此若是確實要輸出 像ROOT, __PUBLIC__這樣的字符串, 則可使用 另外的模板字符串定義 TMPL_PARSE_STR' => array( '--PUBLIC--' => '__PUBLIC__' ...,.....)

ThinkPHP的內置標籤庫在哪裏?
內置標籤庫的基類是: \ThinkPHP\Library\Think\Template\TagLib.class.php, 內置的標籤庫cx(標籤庫的名稱都用小寫)在\ThinkPHP\Library\Think\Template\TagLib\Cx.class.php文件中.

C/C++爲何要使用指針分配對象?
Object myobj這種方式是自動分配,做用域在函數範圍內,當1. (使用指針會帶來兩個做用,也能夠說是 兩個問題,看你是須要仍是避免) 要延長對象的做用域和生命期, 而且要使用的是對象指向內存的自己, 而不是對象的拷貝; 2.要指向的對象自己分配的內存比較大,若是用對象的拷貝,耗費的內存比較大,可能溢出棧 時, 使用只能指針比較好, 具備RAII std::unique_ptr, std::shared_ptr, ...(這個比較少見) 所以, 若是隻是要在文件做用域內,進行 函數傳參時, 使用 對象的自己,可是不須要延長生命期的時候, 就不要使用 指針, 而是使用 引用 就能夠了, 這樣就避免了指針的 "延長生命期"的 "反作用" . 固然還有其餘須要使用指針的時候, 如多態的實現...

php中的對象, 由於都是用new來實例化的,因此都用 ->(叫對象運算符)來引用(對象的成員變量,也叫屬性,字段,features), 靜態用::(叫雙冒號)來引用. 可是在tp的模板中使用冒號:來引用對象的成員.

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

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

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


數據庫的鏈接查詢?
目的是爲了從多個表中獲取字段的信息,條件是兩個表 中要有相關聯的字段,字段的數據類型要相同,名稱不必定相同.

內鏈接的方式:
mysql默認的方式就是內鏈接,即join=inner join, 使用join要結合on使用, on是指明兩個表用 哪兩個字段 進行鏈接查詢; 不一樣於where,where是過濾 鏈接查詢結果 後的條件. 若是不使用join, 則使用 "隱含"內鏈接, 鏈接字段就放在where中(這時候的where就至關於on...).

mysql支持 中文下標key嗎? 是的:如{$vo["學號"]}

thinkphp中爲何要使用query函數?
若是是針對 單一的一個表, 的insert delete update select等操做, 就使用tp的 連接操做函數,
可是若是要操做的狀況比這個複雜, 如查詢的表不是一個表,操做的是多個表, 或者是否是普通的Crud,而是聯合查詢,那麼這個時候,就不能使用鏈式函數, 而要使用原生的sql語句,調用query函數了.以下:

$Sql= M();
    $query = "select foo.uid as '學號',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支持標準的orm和AR及原生的sql操做,爲何要寫這麼多"眼花繚亂"的方法呢? 是由於在實際中的需求就有這麼多,有的是功能的需求,有的是效率性能上的需求.

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


$User=M('user')就是數據表對應的類的實例化對象,從oop的觀點來看,它自己就應該,也能夠用來操做數據表的curd操做.

一般只有在add和save方法中,才須要建立數據對象DO, 調用`$User->create(); create($data);create($another_do); 也可使用

data($data)方法`, 只有建立了do(在內存中),才能用add/save方法寫入數據庫

create和data建立do的區別?
create作的工做不少,包括了獲取ds,ds合法性檢驗,檢查字段映射, 字段驗證,自動完成,令牌檢查等. 而data則沒有那麼多的附加工做和
功能,要本身去完成.

select子查詢的做用主要有四點?
1.用做生成子表(返回多條數據), 如 join (select....)as another_table...
2.用做生成一個靜態數值, 在算術表達式中使用
3.用做生成 "一個" "相關子查詢""動態子查詢" 數值, 用在 條件等 算數表達式中
4.用做生成數值範圍,用在exist,not exist語句中.

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

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

count(*)和count(column)的區別?
http://www.cnblogs.com/wzmenjoy/p/4244590.html count(column)不計 column爲null的條數?
sum(參數), 若是參數是列名, 則表示整個列的數值的和, 若是是條件表達式,則是表示 列值知足條件表達式 的記錄 行數的 總和

不能用count(條件表達式) 如count(score<60) 來統計不及格的總數, 由於 count(參數)中,只要參數 !=NULL 則都表示計算總的記錄條數. 因此,count(0)=count(1)=count(2)...=count(*)... 的

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

having和where的區別?
where是對記錄進行原始條件過濾,在分組 group by語句前使用; where中不能使用聚合函數.
having是對分組後的結果,進行條件過濾, 在having中可使用 聚合函數,也可使用 通常過濾條件.

where score > max(score): error: invalid use of group function.?
這個問題就是,"爲何在 where 子句中 要使用where score > = (select avg(score) from table)' 而不是直接使用 where score> avg(score)', 上面已經作了回答: 由於在where字句中不能使用group function! 因此,要用子查詢...

mysql 爲何要使用group by 分組?
由於實際項目中, 有"須要分組, 按類別"進行數據查詢,統計的需求. 將"某列(某個字段)具備相同值的多條記錄合併爲一組,最後做爲一條記錄輸出", 注意這裏是說 做爲一條記錄輸出. 一般分組是和 聚合函數一塊兒進行輸出的, 一般輸出的字段是 '分組字段1', '分組字段2...', '字段的聚合函數' from table group by '分組字段1', '分組字段2...'. 分組字段的選擇是關鍵,要選擇"某一列的值都相同的" 那個字段做爲 "分組字段", 不然就失去了分組的意義,由於就沒有辦法分組.
(若是select語句中的 字段 沒有使用組函數,那麼它就必須出如今group by字句中, 即做爲分組字段,不然,就只會顯示第一條記錄 的那個 字段值). 也就是說, 若是group by 不跟聚合函數一塊兒使用, select中不是使用的分組字段/group function,則就是沒有意義的分組,就是根本不懂分組的人.

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

很簡單: 在mysql中無論,不要修改,保持爲默認的utf-8; php就是鏈接的橋樑,是保證無亂碼的核心; browser不用手動去設置, 它的內容的編碼, 能夠經過php的header函數來指定,來控制.
也就是說, 只要保證 *.php文件 要寫入到 mysql數據庫的文件編碼是 utf-8 就 一切ok
一是, 跟php文件的 編輯器/ide有關, 看editor能不能設置爲utf-8編碼;
二是, 若是編輯器不能設置爲utf-8編碼,就要用字符集轉換函數

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

php header的格式
header函數調用, 要放在方法函數中, 不能放在php標籤後,函數外部.header("字符串 Content-type: text/html; charset=utf-8 ");

mysql的查詢操做 "時間"概念?
一般,一個簡單的查詢操做, 費時: 0.000幾秒, 即萬分之幾秒, 多一點的操做 是 0.00幾秒, 即千分之幾秒.


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

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

控制器中的方法,老是 先輸出本方法中輸出的內容, 而後,(若是有this->display()的話), 再輸出對應的視圖頁的內容.

注意區別常量和"模板解析字符串"的區別?
由於這些常量和"convention"配置很容易混淆,因此要注意區別:
tp的常量包括: 預約義常量(如: THINK_VERSION,URL_COMMON...), 路徑常量(THINK_PATH,LIB_PATH,CORE_PATH)等,系統常量(APP,ROOT,MODULE,CONTROLLER,ACTION,SELF, IS_POST)等等(這些系統常量中, 分紅兩種,有的只能用在PHP文件中,如: IS_POST,有的既能夠用於php文件中,又能夠用於View視圖的html頁面中, 如: URL之類的系統常量,SELF,MODULE,CONTROLLER,__ACTION__等, 並且這些變量能夠用在html模板中的任意地方,既能夠是地址之類的,如href,form的action,也能夠直接在頁面內容中輸出...)

前面的常量, **只是限於系統已經定義了的(__PUBLIC__這個好像是已經定義了的, 好像不必定只是幫組手冊上所提到的那些), 若是沒有定義,你就不能在view視圖頁面內直接使用,要使用本身定義的模板變量進行地址替換, 就必須在配置文件的TMPL_PARSE_STRING中進行設置和規定.**

系統常量中的URL地址之類的東西,老是從根路徑 "/"開始輸出的(而且除了__ROOT__以外,其他都是帶index.php入口地址的), 如: ROOT:/, MODULE: /index.php/Home, CONTROLLER: /index.php/Home/Index, 並且一般URL地址類的系統常量,是不帶最後面的斜槓的,因此後面要接地址時,要本身加/

R函數是作什麼的?
在同一個控制器內,調用方法時,能夠直接使用 funcName(); 可是若是一個控制器的方法, 要調用另外一個控制器的方法, 那麼就要用R 函數了,支持從 R(module/controller/method)

A方法和R方法的區別?
都是跨"模塊/控制器"調用方法的, A方法是明確實例化一個控制器的對象,而後調用其中的方法$Con=A('Foo'); $Con->method1(); $Con->method2()..., 至關於$Con=new FooController()..., 而R方法是每次都要實例化一個類的對象,R('Foo')->method1(); R('Foo')->method2(); 這個會生成兩個實例. 所以,若是要使用其餘模塊的多個方法,建議使用A方法.若是隻使用其餘模塊內的一個方法, 用R方法最簡潔.

U方法和"地址類系統變量"的區別?
"地址類系統變量" 只能使用本模塊/本控制器/本操做的方法, 若是要使用其餘模塊或控制器的方法地址時,就 要使用U方法了. U方法能夠經過在php操做中賦值而後assign的方式使用,也能夠直接在模板中使用 {:U(oper)} 會一直生成完整 的路徑 /index.php/Home/Index/oper.html(很奇怪,這個也能夠訪問,其實應該是重定向了?)

如何根據md5值反向 找到是哪一個方法生成的cache?
這個是不能夠的! 由於md5: message-digest algorithm 5,將任意長度的字符串,通過算法處理,轉換成128bit的整數,共32爲16進制數字 md5是 哈希混淆,不可逆的, 也就是md5是不可解密的,將用戶的密碼通過md5加密後放入數據庫中, 即便是管理員也不能看到用戶的密碼,作到了地位平等 要暴力破解,也是用一些經常使用的字符串通過md5加密後,作成一個表,而後遍歷比較.密碼驗證的原理也是這樣的: 將輸入的密碼,md5轉換後,而後與數據庫中保存的相比較...

Application/Runtime/Cache/Home/緩存規則名稱??.php緩存文件名稱是怎麼來的,如何知道它是哪一個 html文件的緩存?
爲何thinkphp的 View/Controller_name/oper_name.html 的緩存居然成了????.php文件呢? 由於tp的view下的模板文件中使用了 模板標籤,如{$varname}, {:U(....)}等, 因此通過緩存後,就成了<?php echo $varname} , echo U(...)...?> 的 php文件 tp手冊上有說明, 靜態緩存文件的 名稱 有 多種 規則,(固然絕對不是模板文件的名稱, 因此就不要用模板文件名去試探了...) 最後可能使用了md5函數

確定的: convention.php中並無包含徹底/全部的配置項, 如關於靜態緩存的配置 TMPL_CACHE_ON => true, TMPL_CACHE_TIME => 60秒... **注意這裏應該是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爲何可以 全盤(在任何目錄或文件中均可以)應用那些 常量/變量/設置/類/函數?

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

  4. 而後調用了 require CORE_PATH.'Think'.EXT
  5. 在Think.class.php是tp 整個底層框架的 引導類, 由它加載全部的底層架構,包括模型/視圖/緩存/日誌/配置等等... 因此能夠實現上面的目的...
    6 最後引導應用程序啓動 Think\Think::start();

Thinkphp爲何可以攔截全部請求, 實現單一入口?
由index.php來響應全部的http請求,來統一調度 :如同一棟房子中的多個房間只有一扇門,進入門以後, 再到哪一個房間,則由 dispatch::dispatch() 來決定路由和哪一個控制器和action,在dispatch中有 $_SERVER['HTTP_URI'],解析它就知道是哪一個controller和action了. 這個 dispatch::dispatch() 裏面就對url進行了分析, 結合 getController /Action/ Module 肯定出了 ...

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

頁面佈局: 按鈕元素靠兩邊, 內容佔中間.

開發功能模塊的思路?
先要進行功能整理, 弄清該模塊(管理)包括哪些功能, 而後能夠用兩種方式來組合實現: 一是模塊爲目錄,每一個功能爲一個單獨的文件,這樣功能之間相互獨立,可是不利於代碼的共享; 二是,模塊定義爲一個類文件,其中的功能定義爲類中的方法...

有關/module/controller/action____的系統常量 是在: CORE_PATH/dispatch.class.php中定義的, dispatcher類就是完成 /module/controller/action對應的常量的定義, 以及解析pathinfo的路徑地址進行 路由和調度 ,將模塊/控制器/動做的形式 解釋調度到 對應的視圖html模板上去...

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

        ...

}

}

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

static 和publi private等的位置關係?
static和public等位置能夠顛倒. 說法是: 編譯的前後順序不一樣,但結果是同樣的; 靜態的公開成員和公開的靜態成員; 跟不一樣語言的編寫"約定"的風格有關,好比c++中就把public放在static的前面, php中就把static放在public的前面,遵循大多數人的/語言的默認風格就好. 在php中, 類都是public的 ,static是類層次的,public是成員層次的.php中大多數都是將static放在public的前面的,如: static public function dispatch(){...}

如何設置地址重寫?
地址重寫Rewrite跟 配置文件convention.php中的 URL_REWRITE=>2, 'URL_MODEL'=>1等都沒有關係,.htacess是分佈式重寫控制, 能夠實現服務器級別和目錄級別的重寫. 只要放在某個目錄下,那麼這個目錄就能夠自動 實現地址重寫,若是放在app的父目錄下,則整個項目均可以實現重寫. (原生的.htaccess實際上只是實現了隱藏index.php的功能)
要開啓Rewrite, 只要開啓apache的rewrite模塊功能就行了 在上面打勾就行.

Rewrite目的是爲了 url跳轉和地址隱藏,能夠實現 僞靜態, 域名跳轉,防止盜鏈.
<IfModule mod_rewrite.c>
Options +FollowSymLinks //這個是必須的,不然報錯: 500 服務器內部錯誤

RewriteEngine On

測試(Perl的 (相似linux的shell)正則表達式) 匹配條件, 依次有多條, 條件成立(測試匹配,如同if...)才執行下面的Rewrite substition

// %{REQUEST_FILENAME}: htaccess/mod_rewrite定義的內部變量,表示請求的文件
// -d:表示前面的%{REQUEST_FILENAME}, 存在且是目錄 , -f表示 存在且爲普通文件.
// !-d, !-f 就表示 要麼不存在, 或者不是目錄或文件.  (一般的狀況是 表示 "不存在", 若是要訪問的地址存在,通常都是目錄/文件,則直接訪問,
// 由於不匹配測試條件,因此就不執行 rewrite rule了
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 

RewriteRule ^(.*)$  http://other.example.com/$1 [參數/標記/附加說明]

RewriteRule指令/語句的格式:  RewriteRule Pattern Substitution [flags] 參考:http://blog.csdn.net/paulluo0739/article/details/17711851
QSA: qsappend, PT: passthrough(在應用多個模塊如mod_rewrite, mod_alias對地址進行重寫時使用),L: last.

</IfModule>

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

相關文章
相關標籤/搜索