閱讀 php程式設計》筆記

2022-03-02 07:43:20 字數 3070 閱讀 4855

今天知道了哪些注釋風格是從哪些語言演變過來的了。

/**/是c語言的注釋風格。

//是c++的語言注釋風格

原來php還有種類似shell的注釋風格:#

原來php是作為一shell程式進行解析的。這種情況發生在:編譯php的時候,沒有指定任何伺服器型別。那麼就表示不作為伺服器的乙個模組了。這個時候就是以命令列的方式呼叫了。

難怪:大公司為什麼要求要熟悉shell程式設計。難道,他們是將php作為乙個命令列程式執行嗎?

現在發現連php聖經中的作者估計也沒有完全理解 $a = $b;。在其書中,提到。許多程式設計師都在這裡編寫了不高效的**。因為其實已經拷貝了乙份。

從《php程式設計》中提到的意思分析,$b賦值給$a應該只是更新了符號表。並沒有得到更多的記憶體。不過,我也迷糊了:$b假如看做是乙個指標。那麼,這裡也就是複製了乙份指標給了$a。也就是最終產生了兩份指標,指向了同乙個記憶體位址空間。

或許我的理解不準確,那麼 $a= $b 與$a =& $b;的不同是什麼?

從本書中,學到了乙個新的概念:符號表(symobl table)。書中沒有專門說明。按我理解:符號表就是記錄符號與記憶體位址空間的對應關係。換一種理解,裡面儲存了變數名(這可看成乙個符號)指向哪個記憶體位址。

查資料,得到網友解釋:符號表是編譯原理的概念、用於編譯器區分變數,常量,關鍵字(if,else等),數字,字串等東西的乙個鍊錶

看了書籍解釋,才明白php資源自動**系統是怎麼做到自動**不被引用的資源了:

每個資源都有乙個資源引用數的統計情況(記住英文術語:refrence count)。假如引用數是0的時候。就會自動釋放記憶體。

要學習到的本書提到的專業術語:

copy-on-write 寫時複製。就是對兩個拷貝中任意乙個進行修改值(寫操作)時,那麼就會複製一塊記憶體區域。

copy-on-write另外一種說法是swallow-copy:吞嚥式複製。在值被淹沒(覆蓋、修改)時,就會產生複製機制

引用計算:對乙個資源引用情況進行統計。用乙個數字表示,該資源有多少個引用。這樣確定是否要釋放記憶體空間。

從書中第一次看到該函式:get_included_files()。獲取當前指令碼檔案有哪些用到include或require的地方。

本書中也提到了函式的複製方面知識:

預設情況下**:

function get()

$a = get();//這裡就會將函式返回的值複製乙份。結果產生兩份

引用**:

function & get()

$a = & get();//由於使用了& ,那麼不會複製乙份。$a還是指向原來$m所在的記憶體位址。

書中討論了函式引用的效能方面知識,值得記要:

$a = & get();類似的引用不是必要的。為什麼,因為,php中有乙個寫時複製機制。我的理解是,即使你這樣引用了。但是,假如更改了$a的值(進行了寫入操作)後,php自動會建立乙份新的拷貝。那麼你使用&就沒有達到預期的效果了。

我在想,什麼時候會有寫入$a的情況發生?假如$a得到的是乙個物件的例項。在後面的**中使用$a->price =25;更改了物件的屬性值。那麼也就會觸發寫時複製機制。

速度方面:返回引用比返回乙個值的拷貝要慢。

本書中提到了可變函式。在thinkphp中就用到了:

傳入模組和操作名。那麼這個操作名就是要執行的方法。所以,就會出現這樣的的**:$naem = $action();傳入的引數是哪個。就執行對應的函式。

本書中提到,大括號"()"的經典作用:從周圍分離出變數名。

區分:$a = "abc$defj";//如果沒有括號。可能會將$defj當成變數處理。所以最好使用如下方式:

$a = "abc($d)efj";

實現的原來與效能方面:

原來,雙引號中的變數替換是使用查詢的方式進行的。這樣需要消耗cpu資源。難怪,php聖經中提到。盡量少將變數名放到雙引號中。這樣增加了不必要的查詢替換時間。

2011.1.18閱讀位置:第四章 引用字串看完。here文件是未接觸的知識。等待看

今天接著看。筆記如下:

一、學習了echo、print、prinf之間的區別。

主要掌握echo與print之間區別。printf用得比較少。跟c語言的同名函式類似的用法。

1.本質不同。echo是乙個語言結果。print是乙個函式。有一點注意,echo()帶有括號也不會出現錯誤。這也並不能說明它是乙個函式。

2.效果或者使用區別,echo能輸出多個值。print只能輸出乙個值。echo '值一','值二';//多個值之間用逗號隔開。

3.printf也是輸出。只是他可以對輸出的值按乙個模板進行格式化。就是這點好。

二、符號比較的新理解

原來一直以為「===」是表示嚴格相等,就是型別和值同是相等。今天才理解其機制。理解上的差異,雖然沒有在實際程式設計中遇到障礙。但判斷會出現無法預料的偏差。按照過去的理解,那麼 字串"5"與整型5使用"==="比較的時候。因為會判斷兩者資料型別是否相等。"5"===5得到的結果是false。

看了本書,明白它的機制是:如果比較的型別是從int和string中選擇。將所有值統一轉化成整型進行比較。那麼,"5"===5得到的結果是false。這裡"5"轉化成整型還是5

這裡講到了我過去一直沒有注意到的一點:字串"1kkm"轉化成整型結果是"1"。過去我以為:只要是字串轉化成整型結果都會是0。除了該字串全部是以數字形式比如"5623"轉化成整型的結果是5623。之前的以為是錯了。從本書中注釋中一句話:因為字串不以為數字開頭(所以"php rocks"轉化的結果是0)。

為了加深理解,我編寫了如下**進行測試:

$a = "5263";

$b =intval($a);

var_dump($b);得到結果是5263。

將$a = "5ggg263";結果是5。結論:string轉化成整型是根據首個字元中的內容而定的。首個字元不是數字形式。那麼就無法轉化。轉化成0。

注:這樣的轉化規則只是對表現出來的結果進行總結。具體實現原理,就是手冊上提到的按十進位制進行轉化。

2011.1.20 看到字串比較部分

接著看:

從本書中,提到有個函式可以體現出php中堆疊的應用效果。array_push()和array_pop()體現了堆疊的後進先出的特性(array_pop推出的元素總會是最後進的陣列元素)

《C程式設計閱讀筆記》

1 機器語言 計算機工作基於二進位制,計算機只能識別和接收0和1組合而成的指令。在計算機發展的初期一般計算機的指令長度為16,即16個二進位制組合成一條指令111110000111。這種計算機能夠直接識別和接收的二進位制 成為機器指令。機器指令的集合就是機器語言。2 符號語言 計算機不能直接識別符號...

《iOS程式設計》閱讀筆記

2012.10.18 1.不能將nil加入陣列物件,如果需要將 空洞 加入陣列物件,必須使用nsnull。nsnull 物件代表nil,可以用來解決這類問題。p40 2.例項變數的訪問方法 1 取方法的方法名就是例項變數的變數名 約定!2 存方法set 變數名 p45 3.super init 呼叫...

php手冊閱讀筆記(1)

1.language reference basic syntax php檔案尾部的結束標記 最好省略,防止檔案尾部新增多餘的空格和回車 可以使用 方式的注釋 2.型別 支援四種標量 boolean integer float 與double相同 string 支援兩種結構 array object...