阅读php程序设计笔记
今天知道了哪些注釋風(fēng)格是從哪些語言演變過來的了。
/**/是c語言的注釋風(fēng)格。
//是c++的語言注釋風(fēng)格
原來php還有種類似shell的注釋風(fēng)格:#
原來php是作為一shell程序進(jìn)行解析的。這種情況發(fā)生在:編譯php的時候,沒有指定任何服務(wù)器類型。那么就表示不作為服務(wù)器的一個模塊了。這個時候就是以命令行的方式調(diào)用了。
難怪:大公司為什么要求要熟悉shell編程。難道,他們是將php作為一個命令行程序執(zhí)行嗎?
現(xiàn)在發(fā)現(xiàn)連php圣經(jīng)中的作者估計也沒有完全理解 $a = $b;。在其書中,提到。許多程序員都在這里編寫了不高效的代碼。因為其實已經(jīng)拷貝了一份。
從《php程序設(shè)計》中提到的意思分析,$b賦值給$a應(yīng)該只是更新了符號表。并沒有得到更多的內(nèi)存。不過,我也迷糊了:$b假如看做是一個指針。那么,這里也就是復(fù)制了一份指針給了$a。也就是最終產(chǎn)生了兩份指針,指向了同一個內(nèi)存地址空間。
或許我的理解不準(zhǔn)確,那么 $a= $b 與$a =& $b;的不同是什么?
從本書中,學(xué)到了一個新的概念:符號表(symobl table)。書中沒有專門說明。按我理解:符號表就是記錄符號與內(nèi)存地址空間的對應(yīng)關(guān)系。換一種理解,里面保存了變量名(這可看成一個符號)指向哪個內(nèi)存地址。
查資料,得到網(wǎng)友解釋:符號表是編譯原理的概念、用于編譯器區(qū)分變量,常量,關(guān)鍵字(if,else等),數(shù)字,字符串等東西的一個鏈表
看了書籍解釋,才明白php資源自動回收系統(tǒng)是怎么做到自動回收不被引用的資源了:
每個資源都有一個資源引用數(shù)的統(tǒng)計情況(記住英文術(shù)語:refrence count)。假如引用數(shù)是0的時候。就會自動釋放內(nèi)存。
要學(xué)習(xí)到的本書提到的專業(yè)術(shù)語:
copy-on-write 寫時復(fù)制。就是對兩個拷貝中任意一個進(jìn)行修改值(寫操作)時,那么就會復(fù)制一塊內(nèi)存區(qū)域。
copy-on-write另外一種說法是swallow-copy:吞咽式復(fù)制。在值被淹沒(覆蓋、修改)時,就會產(chǎn)生復(fù)制機制
引用計算:對一個資源引用情況進(jìn)行統(tǒng)計。用一個數(shù)字表示,該資源有多少個引用。這樣確定是否要釋放內(nèi)存空間。
從書中第一次看到該函數(shù):get_included_files()。獲取當(dāng)前腳本文件有哪些用到include或require的地方。
本書中也提到了函數(shù)的復(fù)制方面知識:
默認(rèn)情況下代碼:
function get()
{
$m = 5
return $m;
}
$a = get();//這里就會將函數(shù)返回的值復(fù)制一份。結(jié)果產(chǎn)生兩份
引用代碼:
function & get()
{
$m = 5
return $m;
}
$a = & get();//由于使用了& ,那么不會復(fù)制一份。$a還是指向原來$m所在的內(nèi)存地址。
書中討論了函數(shù)引用的性能方面知識,值得記要:
$a = & get();類似的引用不是必要的。為什么,因為,php中有一個寫時復(fù)制機制。我的理解是,即使你這樣引用了。但是,假如更改了$a的值(進(jìn)行了寫入操作)后,php自動會創(chuàng)建一份新的拷貝。那么你使用&就沒有達(dá)到預(yù)期的效果了。
我在想,什么時候會有寫入$a的情況發(fā)生?假如$a得到的是一個對象的實例。在后面的代碼中使用$a->price =25;更改了對象的屬性值。那么也就會觸發(fā)寫時復(fù)制機制。
速度方面:返回引用比返回一個值的拷貝要慢。
本書中提到了可變函數(shù)。在thinkphp中就用到了:
傳入模塊和操作名。那么這個操作名就是要執(zhí)行的方法。所以,就會出現(xiàn)這樣的的代碼:$naem = $action();傳入的參數(shù)是哪個。就執(zhí)行對應(yīng)的函數(shù)。
本書中提到,大括號"()"的經(jīng)典作用:從周圍分離出變量名。
區(qū)分:
$a = "abc$defj";//如果沒有括號。可能會將$defj當(dāng)成變量處理。所以最好使用如下方式:
$a = "abc($d)efj";
實現(xiàn)的原來與性能方面:
原來,雙引號中的變量替換是使用查找的方式進(jìn)行的。這樣需要消耗cpu資源。難怪,php圣經(jīng)中提到。盡量少將變量名放到雙引號中。這樣增加了不必要的查找替換時間。
2011.1.18閱讀位置:第四章 引用字符串看完。here文檔是未接觸的知識。等待看
今天接著看。筆記如下:
一、學(xué)習(xí)了echo、print、prinf之間的區(qū)別。
主要掌握echo與print之間區(qū)別。printf用得比較少。跟c語言的同名函數(shù)類似的用法。
1.本質(zhì)不同。echo是一個語言結(jié)果。print是一個函數(shù)。有一點注意,echo()帶有括號也不會出現(xiàn)錯誤。這也并不能說明它是一個函數(shù)。
2.效果或者使用區(qū)別,echo能輸出多個值。print只能輸出一個值。echo '值一','值二';//多個值之間用逗號隔開。
3.printf也是輸出。只是他可以對輸出的值按一個模板進(jìn)行格式化。就是這點好。
二、符號比較的新理解
原來一直以為“===”是表示嚴(yán)格相等,就是類型和值同是相等。今天才理解其機制。理解上的差異,雖然沒有在實際編程中遇到障礙。但判斷會出現(xiàn)無法預(yù)料的偏差。按照過去的理解,那么 字符串"5"與整型5使用"==="比較的時候。因為會判斷兩者數(shù)據(jù)類型是否相等。"5"===5得到的結(jié)果是false。
看了本書,明白它的機制是:如果比較的類型是從int和string中選擇。將所有值統(tǒng)一轉(zhuǎn)化成整型進(jìn)行比較。那么,"5"===5得到的結(jié)果是false。這里"5"轉(zhuǎn)化成整型還是5
這里講到了我過去一直沒有注意到的一點:字符串"1kkm"轉(zhuǎn)化成整型結(jié)果是"1"。過去我以為:只要是字符串轉(zhuǎn)化成整型結(jié)果都會是0。除了該字符串全部是以數(shù)字形式比如"5623"轉(zhuǎn)化成整型的結(jié)果是5623。之前的以為是錯了。從本書中注釋中一句話:因為字符串不以為數(shù)字開頭(所以"php rocks"轉(zhuǎn)化的結(jié)果是0)。
為了加深理解,我編寫了如下代碼進(jìn)行測試:
$a = "5263";
$b =intval($a);
var_dump($b);得到結(jié)果是5263。
將$a = "5ggg263";結(jié)果是5。結(jié)論:string轉(zhuǎn)化成整型是根據(jù)首個字符中的內(nèi)容而定的。首個字符不是數(shù)字形式。那么就無法轉(zhuǎn)化。轉(zhuǎn)化成0。
注:這樣的轉(zhuǎn)化規(guī)則只是對表現(xiàn)出來的結(jié)果進(jìn)行總結(jié)。具體實現(xiàn)原理,就是手冊上提到的按十進(jìn)制進(jìn)行轉(zhuǎn)化。
2011.1.20 看到字符串比較部分
接著看:
從本書中,提到有個函數(shù)可以體現(xiàn)出php中堆棧的應(yīng)用效果。array_push()和array_pop()體現(xiàn)了堆棧的后進(jìn)先出的特性(array_pop推出的元素總會是最后進(jìn)的數(shù)組元素)
總結(jié)
以上是生活随笔為你收集整理的阅读php程序设计笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何自动保存邮件草稿
- 下一篇: 如何成为php高手