thinkphp一句话疑难解决笔记
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的多個模塊?
標(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ù)了.如下:
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的中文亂碼問題?
下面的說法是不正確的!!!
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ù)?
在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文件中定義的.
在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模塊功能就好了 在上面打勾就行.
配置文件convention.php中的'VAR_CONTROLLER'=>'c' ,就是用來在 $_GET['c']中獲取控制器的.
轉(zhuǎn)載于:https://www.cnblogs.com/bkylee/p/6072582.html
總結(jié)
以上是生活随笔為你收集整理的thinkphp一句话疑难解决笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php yield mysql_PHP
- 下一篇: 易创互联 php,易创网站管理系统(DI