php學習至今一年有餘,筆記累積挺多的,也挺雜的,寫篇文章整理一下吧。
php基礎部分
<span style="font-family:新宋体">PHP</span>
輸出文字的基礎指令:<span style="font-family:新宋体">echo</span>
與 <span style="font-family:新宋体">print</span>
。
echo和print的區別
<span style="font-family:新宋体">echo</span>
是php語句, <span style="font-family:新宋体">print</span>
和<span style="font-family:新宋体">print_r</span>
是函數,語句沒有回傳值,函數可以有回傳值(即便沒有用)
<span style="font-family:新宋体">echo</span>
輸出一個或多個字串。 <span style="font-family:新宋体">print</span>
只能列印出簡單型別變數的值(如int,string)<span style="font-family:新宋体">print_r</span>
可以列印出複雜型別變數的值(如陣列,物件)
var_dump和print_r的區別
<span style="font-family:新宋体">var_dump</span>
傳回表達式的類型和值,而<span style="font-family:新宋体">print_r</span>
只傳回結果,相較於調試程式碼使用<span style="font-family:新宋体">var_dump</span>
更便於閱讀。
變數
變數用於儲存值,例如數字、文字字串或陣列。 php 中的所有變數都是以 $ 符號開始的。
php 變數名稱對大小寫敏感!
php 有三種不同的變數作用域:
<code>local(局部)<br>global(全局)<br>static(静态)</code>
函數之外宣告的變數擁有 <span style="font-family:新宋体">Global</span>
作用域,只能在函數以外進行存取。
函數內部宣告的變數擁有 <span style="font-family:新宋体">LOCAL</span>
作用域,只能在函數內部存取。
<span style="font-family:新宋体">global</span>
關鍵字用於存取函數內的全域變數。
php static 關鍵字
通常,當函數完成/執行後,會刪除所有變數。不過,有時我需要不刪除某個局部變數。實現這一點需要更進一步的工作。
要完成這一點,請在您首次宣告變數時使用static 關鍵字:
<code><?php <br>function mytest() {<br> static $x=-1;<br> echo $x;<br> $x--;<br>}<br>mytest();//-1<br>echo "<br>";<br>mytest();//-2<br>echo "<br>";<br>mytest();//-3<br>?></code>
php類型
php类型:**php 支持八种原始类型。**
布林型
要指定一個布林值,使用關鍵字true 或false。兩個都是大小寫不敏感的。
整數
我們可以使用(int)來將小數強制型別轉換成整數。
<code><?php <br> var_dump((int)(26/3));//int(8)<br>?></code>
陣列
php中有三種陣列:
<code>索引数组:就是下标是顺序整数作为作为索引(比如第几排第几列)$class[5]<br>关联数组:就是下标是字符串作为索引(比如名字)$class2["zhangsan"]<br>多维数组 - 包含一个或多个数组的数组</code>
下標要嘛是整數,要嘛是字串。
<code><?php <br>$array = array(<br> "foo" => "bar",<br> "bar" => "foo",<br>);<br>// 自 php 5.4 起<br>$array = [<br> "foo" => "bar",<br> "bar" => "foo",<br>];<br>?></code>
陣列單元可以透過 <span style="font-family:新宋体">array[key]</span>
語法來存取。
note: 這並不表示總是給鍵名加上引號。用不著給鍵名為常數或變數的加上引號,否則會使 <span style="font-family:新宋体">PHP</span>
不能解析它們。
陣列運算子
範例名稱結果$a $b 聯合$a 和$b 的聯合$a == $b 相等如果$a 和$b 有相同的鍵/值對則為true$a === $b 全等如果$a 和$b 具有相同的鍵/值對且順序和類型都相同則為true$a != $b 不等如果$a 不等於$ b 則為true$a $b 不等若$a 不等於$b 則為true$a !== $b 不全等若$a 不全等於$b 則為true
<span style="font-family:新宋体">+</span>
運算子把右邊的陣列元素附加到左邊的陣列後面,兩個陣列中都有的鍵名,則只用左邊數組中的,右邊的被忽略。
物件
要初始化一個對象,用 new 語句將物件實例到一個變數中。
常用函數
strlen() 函數用來計算字串的長度。
strpos() 函數用於在字串內檢索一段字串或一個字元。
常數
可以用 define() 函數來定義常數。一個常數一旦被定義,就不能再改變或取消定義。
常用的魔術常數:
echo poems ;//outputs "homeric epic"
?>
php字串運算子 p>
在php 中,只有一個字串運算子。
並置運算子 <span style="font-family:新宋体">(.)</span>
用來把兩個字串值連接起來。如:echo "a= ".$a."<br>";
左邊將字串文字"a="與變數$a的值連接,第二處是與換行符<span style="font-family:新宋体">"<br>"</span>
連接
php函數
函數只有在被呼叫時才會被執行,這點和js是一樣的,同樣,函數定義也是以function關鍵字開頭的。
<code><?php <br> function sum($x,$y){<br> $z=$x + $y;<br> return $z;<br> }<br> echo "-2+10= ".sum(-2,10);//outputs "-2+10=8"<br>?></code>
當沒有<span style="font-family:新宋体">return</span>
語句時,以上將會變成"-2 10=";
流程控制
在這裡,只講<span style="font-family:新宋体">foreach</span>
語句。
<span style="font-family:新宋体">foreach</span>
語句遍歷輸出數組:
語法:
foreach (array_expression as $value){ statement}; foreach (array_expression as $key => $value){ statement};
參數<span style="font-family:新宋体">array_expression</span>
是指定要遍歷的數組,<span style="font-family:新宋体">$value</span>
是數組的值
<code><?php <br> $actors [0] ="marry";<br> $actors [1] ="lorry";<br> $actors [2] = "mike";<br> foreach ($actors as $values){<br> echo "name:$values<br>"; <br>}<br>?></code>
以上程式碼將輸出:
name:marry
name:lorry
name:mike
兩個重要的魔術方法
1. __set( )方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你 要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。 2. __get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用
php中方法不區分大小寫
require(dirname(__file__).'/global.php'); //引入全局文件 require(dirname(__file__).'/config.ini.php'); //引入基本配置文件
物件運算子與雙冒號運算子
在類別的成員方法裡面,可以用->(物件運算子):<span style="font-family:新宋体">$this->property</span>
(其中property 是該屬性名)這種方式來存取非靜態屬性。
靜態屬性則是用 <span style="font-family:新宋体">::</span>
(雙冒號):<span style="font-family:新宋体">self::$property</span>
來存取。
=>和->
<span style="font-family:新宋体">=></span>
陣列成員存取符號,<span style="font-family:新宋体">-></span>
物件成員存取符號;<span style="font-family:新宋体">$this</span>
-<span style="font-family:新宋体">>$name=$value</span>
:將目前類別的<span style="font-family:新宋体">name</span>
變數的值設為<span style="font-family:新宋体">$value</span>
;<span style="font-family:新宋体">$this</span>
代表了類別本身,<span style="font-family:新宋体">-></span>
是存取其類別成員的運算子
雙冒號運算子(<span style="font-family:新宋体">::</span>
)類別名稱<span style="font-family:新宋体">::</span>
靜態屬性/方法
「<span style="font-family:新宋体">::</span>
」用來呼叫類別中靜態的屬性和方法
<span style="font-family:新宋体">include()</span>
:包含外部文件,語法格式為include(string filename);<span style="font-family:新宋体">require()</span>
:會輸出錯誤訊息,終止腳本<span style="font-family:新宋体">include_once()</span>
:多次調用相同檔案時,程式只會呼叫一次<span style="font-family:新宋体">require_once()</span>
:先檢查檔案是否在其他地方被呼叫過<span style="font-family:新宋体">array_pop()</span>
:取得並傳回數組中的最後一個元素<span style="font-family:新宋体">count()</span>
:統計數組中的元素個數<span style="font-family:新宋体">array_search()</span>
:取得數組中元素的鍵名<span style="font-family:新宋体">$array_keys()</span>
:取得數組中重複元素的所有鍵名
單引號和雙引號
php把單引號中的資料視為普通字串,不再處理。而雙引號還要對其中的字串進行處理
get和post
$_get[ ]和$_post[ ]全域數組:分別用來接收get和post方法傳遞到目前頁面的資料。 「[ ]」裡面是name.
php參數傳遞常用的方法有3種:$_post[ ]、$_get[ ]、$_session[ ],分別用來取得表單、url與session變量的值。
表單提交中get和post方式的區別歸納如下幾點:
<code>GET是从服务器上获取数据,POST是向服务器传送数据。<br>GET 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。<br>对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器端用Request.Form获取提交的数据。<br>GET传送的数据量较小,不能大于2KB(这主要是因为受URL长度限制)。POST传送的数据量较大,一般被默认为不受限制。但理论上,限制取决于服务器的处理能力。<br>GET 安全性较低,POST安全性较高。因为GET在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记 录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一 同显示在用户面前。POST的所有操作对用户来说都是不可见的。</code>
在form提交的時候,如果不指定method,則預設為get請求(.net預設是post),form中提交的資料將會附加在url之後,以?分開與url分開。字母數字字元原樣發送,但空格轉換為“ ” 號,其它符號轉換為%xx,其中xx為該符號以16進位表示的ascii(或iso latin-1)值。 get請求請提交的資料放置在http請求協定頭中,而post提交的資料則放在實體資料中;get方式提交的資料最多只能有2048字節,而post則沒有此限制。 post傳遞的參數在doc裡,也就http協定所傳遞的文本,接受時再解析參數部分。獲得參數。一般用post比較好。 post提交資料是隱式的,get是透過在url裡面傳遞的,用來傳遞一些不需要保密的數據,get是透過在url裡傳遞參數,post不是。
1.get請求的資料會附在url之後(就是把資料放置在http協定頭中),以?分割url和傳輸數據,參數之間以&連接
2.get方式提交的數據最多只能是1024字節,理論上post沒有限制,可傳較大量的數據,iis4中最大為80kb,iis5中為100kb
http狀態碼
cookie和session區別
cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用範圍。若不設定過期時間,表示這
個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就會消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。
會話cookie一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。若設定了過期時間,瀏覽器就會把cookie
儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效直到超過設定的過期時間。
當程式需要為某個客戶端的請求建立一個session時,伺服器先檢查這個客戶端的請求裡是否已包含了一個session標識
(稱為session id),如果已包含則表示以前已經為此客戶端創建過session,伺服器就按照session id把這個session檢索出來
使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且產生一個與此session相
關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次回應中返回給客戶端保存。儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識傳送給
伺服器。
1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙
考慮到安全應當使用session。
3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
考慮到減輕伺服器效能方面,應使用cookie。
4、單一cookie儲存的資料不能超過4k,很多瀏覽器都限制一個網站最多儲存20個cookie。
5、所以個人建議:
將登陸資訊等重要資訊存放為session
其他資訊如果需要保留,可以放在cookie中
php程式碼規格
1.變數賦值必須保持相等間距和排列
2.每行結尾不允許有多餘的空格
3.確保檔案的命名和呼叫大小寫一致,是由於類unix系統上面,對大小寫是敏感的
4.方法名只允許由字母組成,下劃線是不允許的,首字母要小寫,其後每個單字首字母要大寫
5.屬性的命名只允許由字母組成,下劃線是不允許的⋯⋯
6.對於物件成員的訪問,我們必須始終使用“get"和"set"方法
7.當類別成員方法被宣告為private時,必須以雙底線"__"開頭;被宣告為protected時,必須以單底線" _"開頭;宣告為public的成員屬性則在任何時間都不允許含有底線。
8.如果我們需要把一些常用的方法定義為全域函數,那麼就應該把它們以靜態(static)的形式定義在類別中
9.函數的命名使用小寫和底線,應該能夠描述清楚該函數的功能。
10.boolean值和null值都採用小寫。
11.當一個字串是純文字組成的時候(即不含有變數),則必須總是以單引號(')作為定界符
12.使用array類型宣告關聯數組的時候,應將它分成多行,確保每行的鍵與值的對齊
13.類別中所有程式碼都必須用四個空格進行縮排
14.不允許用var來宣告變量,類別成員變數必須以private,protected和public來宣告。通常用get和set方法來存取類別成員。
15.方法必須總是用private,protected或public來宣告其作用域
16.在函式或方法名稱與參數括號之間不允許出現多餘的空格