程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 兩千行代碼的PHP學習筆記匯總

兩千行代碼的PHP學習筆記匯總

編輯:PHP綜合

本文匯總了PHP學習中常見的各類問題,約有兩千多行代碼,都是非常實用的技巧。分享給大家供大家參考。具體如下:

//語法錯誤(syntax error)在語法分析階段,源代碼並未被執行,故不會有任何輸出。

/* 【命名規則】 */
常量名 類常量建議全大寫,單詞間用下劃線分隔  // MIN_WIDTH
變量名建議用下劃線方式分隔      // $var_name
函數名建議用駝峰命名法        // varName
定界符建議全大寫         // <<<DING, <<<'DING'
文件名建議全小寫和下劃線、數字    // func_name.php
私有屬性名、方法名建議加下劃線    // private $_name _func
接口名建議加I_          // interface I_Name

/* 語言結構 */
array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset()
echo, print 可省略括號。

/* 預定義常量 */
PATH_SEPARATOR //路徑分隔符(Windows為分號,類Unix為冒號)
DIRECTORY_SEPARATOR //目錄分隔符
PHP_EOL //當前系統的換行符
PHP_VERSION //PHP版本號
PHP_OS //PHP服務操作系統
PHP_SAPI  //用來判斷是使用命令行還是浏覽器執行的,如果 PHP_SAPI=='cli' 表示是在命令行下執行
PHP_INT_MAX          INT最大值,32位平台時值為2147483647
PHP_INT_SIZE          INT字長,32位平台時值為4(4字節)
M_PI  //圓周率值
M_E   //自然數

//PHP運行環境檢測函數
php_sapi_name() //返回一個PHP與WEB服務器接口類型的小寫字符串
該函數返回值與常量PHP_SAPI一致!
接口類型:SAPI(the Server API, SAPI)
可能值:aolserver、apache、apache2filter、apache2handler、caudium、cgi、cgi-fcgi、cli、 continuity、embed、isapi、litespeed milter、nsapi、phttpd、pi3web、roxen、thttpd、tux、webjames


/* 大小寫問題 */
- 類名、方法名、屬性名、函數名:不區分大小寫
- 變量名、常量名、元素下標:區分大小寫

/* 可變標識符 */
可變變量 $i = 3; $k = 'i'; echo $$k; //輸出3
可變函數 function func() {echo 'hello!';} $i = 'func'; $i(); //輸出hello
可變下標 $i = '1234'; $k = 3; echo $i[$k];  //輸出4
可變類名 class CLS{public $k = 'hello';} $i = 'CLS'; $j = new $i; echo $j->k;
可變屬性 class CLS{public $k = 'hello';} $i = 'k'; $j = new CLS; echo $j->$i;
可變方法 class CLS{public function k(){echo 'hello';}} $i='k'; $j=new CLS; $j->$i();

/* 可變變量 */
* 用於業務邏輯判斷得到某些具體信息
  $var_name = "class_name";
  $$var_name = "PHP0913";    // $class_name = "PHP0913";$class_name已存入內存中
  var_dump($class_name);    // var_dump($$var_name);

/* 變量函數 */
get_defined_vars  //返回由所有已定義變量所組成的數組(包括環境變量、服務器變量和用戶定義的變量)


/* unset() */
* unset()僅刪除當前變量名和引用,其值並未被刪除
* 引用傳遞中,刪除一個變量及其引用,其他變量及引用均存在,且值依然存在

   echo "<br />";
  $v3 = '值';
  $v4 = &$v3;
  unset($v4);
  var_dump($v3, $v4);

/* 變量的最長有效期 */
* 當前腳本的執行周期,腳本執行結束,變量即消失


/* 預定義變量/超全局變量 */
$GLOBALS
$_COOKIE
$_ENV
$_FILES
$_GET
$_POST
$_REQUEST
$_SERVER
$_SESSION


/* 常量定義 */
define(常量名, 常量值, [區分大小寫參數])    //true表示不區分/false表示區分大小寫
const 常量名 = 常量值  // 新,建議
常量名可以使用特殊字符
constant($name)    // 獲取常量名
          // 例:echo constant('-_-');


/* 常量相關函數 */
defined
get_defined_constants


/* 預定義常量 */
__FILE__      所在文件的絕對路徑
__LINE__      文件中的當前行號
__DIR__      文件所在目錄
__FUNCTION__    函數名稱
__CLASS__      類的名稱
__METHOD__    類的方法名
__NAMESPACE__    當前命名空間的名稱


/* 整型 */
整型占用4字節,共4*8=32位,最大值為2147483647,最小值為-2147483648,最小值的絕對值比最大值的大1
最高為表示正負,1表示負,0表示正


/* 進制轉換函數 */
只能十進制與其他進制進行轉換,只有六種
轉換時,參數應是字符串(即不可含八進制的“0”或十六進制的“0x”)
  dec
   bin
   oct
  hex
hexdec()  十六進制轉十進制    也可寫hex2dec()
dechex()  十進制轉十六進制    也可寫dec2hex()
bindec()  二進制轉十進制    也可寫bin2dec()
decbin()  十進制轉二進制    也可寫dex2bin()
octdec()  八進制轉十進制    也可寫oct2dec()
decoct()  十進制轉八進制    也可寫dec2oct()


/* 浮點數 */
浮點數不能比較大小 !!!
幾乎所有小數,在保存時都是近似值而不是精確值!
最大值:+/- 1.8E308
PHP所能保存的最長小數位:14位

/* 單引號字符串 */
單引號字符串中,只能轉義反斜槓和單引號

/* 雙引號字符串 */
只解析字符串一次 !!!
eval   把字符串作為PHP代碼執行
大括號包裹變量,可確定變量名界限。如:"aaa{$bbb}ccc"
雙引號中可以將ASCII碼轉換為字符
"\x61" -> a  // 字符串中不需0,整型中才是0x前導
"\x49\x54\x43\x41\x53\x54" -> ITCAST
將ASCII轉成字符函數chr()
將字符轉成ASCII函數ord()
#雙引號轉義列表
\n 換行
\r 回車
\t 水平制表符
\\ 反斜線
\$ 美元標記
\v 垂直制表符
\e Escape
\f 換頁
\" 雙引號"
\[0-7]{1,3} 符合該正則表達式序列的是一個以八進制方式來表達的字符 
\x[0-9A-Fa-f]{1,2} 符合該正則表達式序列的是一個以十六進制方式來表達的字符 



/* 定界符 */
herodoc - 功能同雙引號,能解析
$str = <<<AAA
字符串內容
AAA;

nowdoc - 功能同單引號,不能解析
只在開始位置有單引號
$str = <<<'AAA'
字符串內容
AAA;


/* 字符串的使用 */
可將字符串當作一個字符的集合來使用,可獨立訪問每個字符。僅適用於單字節字符(字母、數字、半角標點符號),像中文等不可用
$str = "abcd";
echo $str[3];  // d
echo $str{0};  // a


/* 【類型操作函數】 */
//獲取/設置類型
gettype($var) //獲取變量的數據類型
settype($var, $type) //設置變量的數據類型

//類型判斷
is_int
is_float
is_null
is_string
is_resource
is_array
is_bool
is_object    
is_numeric   檢測變量是否為數字或數字字符串

//轉換成指定的數據類型
boolval
floatval
intval
strval

//強制轉換類型
(int)
(float)
(string)
(bool)
(array)
(object)
(unset) //轉換為NULL
(binary) 轉換和 b前綴轉換 //轉換成二進制

var_dump    打印變量的相關信息。
        顯示關於一個或多個表達式的結構信息,包括表達式的類型與值。
        數組將遞歸展開值,通過縮進顯示其結構。
var_export($var [,bool $return]) //輸出或返回一個變量的字符串表示
  $return:為true,則返回變量執行後的結果
print_r     打印關於變量的易於理解的信息
empty      檢查一個變量是否為空
isset      檢測變量是否存在

/* 【流程控制】 */
//if語句的替代語法
if (條件判斷) :
  語句塊;
elseif (條件判斷) :
  語句塊;
else :
  語句塊;
endif;

//流程控制的替代語法
在嵌入HTML時常用
將 { 換成 : , 將 } 換成 endif; 等
endif
endwhile
endfor
endforeach
endswitch


/* 【switch】 */
switch (條件) {
  case 狀態值1:
    語句塊;
    [break;]
  case 狀態值2:
    語句塊;
    [break;]
  case 狀態值3:
  case 狀態值4:
    語句塊;
    [break;]
  default:
    語句塊;
    [break;]
}
switch是狀態分支,特殊的循環
先計算出狀態值,再去與判斷數作比較
break退出流程


/* 【for循環】 */
for (條件初始化表達式; 條件判斷表達式; 條件變化表達式) {
循環體
}

假設循環體被執行了N次,則
條件初始化表達式被執行1次
條件判斷表達式被執行N+1次
條件變化表達式被執行N次

注意:
  1. 循環變量在for語句結束後還可以繼續使用,值為第一次失敗的值
  2. 循環變量在for循環體內可以使用
  3. 任何條件表達式均可省略,但分號不能省略
    a. 條件初始化表達式被省略時,循環變量被賦值為null,在與條件判斷時,
      進行類型轉換後再比較。也可以在for語句外進行初始化。
    b. 條件判斷表達式被省略時,表示循環為真,進入死循環
    c. 條件變化表達式被省略時,可以在循環體內完成
  4. 每個表達式均可由多條語句組成,每條語句之間使用逗號分割
    如果條件判斷表達式由多條語句組成,都會執行,但只有最後一條語句才作為判斷條件
  5. for只能遍歷數值型索引下標數組
    數組長度函數:count()
  6. 應該將可以初始化的語句均放在條件初始化表達式內,這樣可以省去很多執行次數


/* 【goto】5.3+ 版本 */
用來跳轉到程序中的某一指定位置
該目標位置可以用目標名稱 加上冒號來標記。
PHP中的goto有一定限制,只能在同一個文件和作用域中跳轉,
  也就是說你無法跳出一個函數或類方法,也無法跳入到另一個函數。
  你也無法跳入到任何循環或者switch結構中。
  常見的用法是用來跳出循環或者switch,可以代替多層的break。 
可以從循環(switch)中跳出來,但不能從外部跳轉進去。而函數或類方法,向外向內均不可。
goto a;
echo 'Foo';
a:
echo 'Bar';


/* 【文件加載】 */
require / include / require_once / include_once
文件載入只是載入目標文件內的代碼並執行,與載入的文件類型無關

文件載入屬於執行階段,當執行到require等語句時,才載入該文件的代碼,
  編譯並執行,然後回到require等語句位置繼續執行下面的語句
【注意】
  在載入開始時,先退出PHP模式;
  再載入目標文件代碼,執行該代碼;
  結束時,再進入PHP模式。
require:處理失敗,產生 E_COMPILE_ERROR 錯誤,腳本中止。
include:處理失敗,產生 E_WARNING 錯誤,腳本繼續執行。

#不建議使用require_once/include_once


/* 【相對路徑】 */
當前浏覽器請求的哪個腳本,當前位置就是屬於哪個腳本。
./file 和 file 都表示當前目錄下的file文件
file情況(嵌套載入文件時):
如果當前目錄沒找到該文件就在代碼文件所在目錄中繼續找。
如果當前目錄找到有該文件,則不會再在代碼文件所在目錄去找也不會再加載。
__DIR__   腳本文件所在目錄
__FILE__  腳本文件路徑

include_path  加載文件查找目錄
  set_include_path() 設置include_path,可多個,用字符串作參數
  該函數設置的path只針對該當前文件有效
  該設置只針對查找未直接寫文件路徑方式有效
  設置新的include_path會覆蓋原來的

  get_include_path() 獲取當前include_path設置項,無參數

  路徑分隔符,在Windows下是分號,在Linux下是冒號
  利用預定義常量 PATH_SEPARATOR 來獲得當前的分隔符

如果直接寫文件名:
  1. include_path所設置的
  2. 當前目錄
  3. 代碼所在文件的目錄
如果文件名前帶有路徑,則會直接根據路徑查找,include_path直接被忽略


/* 【return】 */
return與require結合,可返回文件的內容,return寫在被載入的文件內
return可以終止所在腳本的執行,作為普通腳本語句
return可以返回函數的相應值


/* 【終止和延遲腳本執行】 */
die / exit  終止
return是終止所在腳本的執行
die和exit會立即終止腳本執行
die("到此為止");   該函數內的字符串可被輸出
sleep() 延遲(單位:秒)
  默認最多可延遲30秒,PHP配置可以修改 max_execution_time
  例:sleep(12);
usleep()  以指定的微秒數延遲執行
time_sleep_until  使腳本睡眠到指定的時間為止


/* 【函數】 */
1. 函數的聲明是在編譯時,故先定義再調用,定義與調用無先後關系!
2. 文件只是代碼的載體,程序均在內存中執行!
3. 如果函數的定義在需要載入的文件內,則需要先載入該文件,否則調用出錯!
4. 函數的定義可以出現在其他的代碼段中,此時函數不會在編譯階段被執行
  只有被執行到時才會被定義!只有獨立定義時才會被編譯在內存中!
  如果出現在其他函數體內,也需要外層函數被調用時才被定義並生效!
5. 函數名不區分大小寫
6. 不允許重名,包括系統函數
7. 【可變函數】
  函數名可以用其他變量代替
  $func_name = "sayHello";
  $func_name();    //此時調用sayHello()函數
  注意:只有在調用時才能使用變量,定義時不允許!
8. 變量可作為函數名調用函數,數組元素值也可以!
9. 形式參數parameter,實際參數argument
  可以對參數傳遞 null,表示該形參不想傳遞值
  形參與實參之間既可值傳遞,也可引用傳遞。
  引用傳遞參數,應該在定義函數時就在形式參數前加上 & 符號,而此時調用函數實參必須為變量
  如何選擇使用哪種傳遞方式?
    a. 是否需要保證原始數據的完整性
    b. 是否需要增加效率
    c. 對大數據引用傳遞可節省內存
10. 參數默認值
    a. 函數的參數默認值必須是已經確定的值,不能是變量!
      只要在調用之前定義該常量,則可以使用常量作為參數默認值
    b. 函數默認值可以有多個,建議將有默認值的參數放在參數列表的最後面
      這樣可以在調用函數時,不賦予後面有默認值的參數值,否則會出錯
    c. 默認參數可以是非標量類型,比如數組、null
    d. 任何默認參數必須放在任何非默認參數的右側
11. 參數數量
  a. 形參數量多於實參數量
    報告警告級別錯誤,並以NULL代替
  b. 實參多於形參
    不報告錯誤,依次為形參賦值
  c. 不確定參數數量
    1) 一個形參都不定義,永遠都是實參多於形參
    2) 【可變數量參數】
      func_get_args() 獲取當前函數被調用時所有實參的值,返回一個所有實參值組成的數組
      func_get_arg() 獲取某個實參的值,通過索引值標識,e.g: func_get_arg(0)
      func_num_args() 獲取所有實參的數量
12. 【return】返回值
  a. 函數只有一個返回值,可以通過返回一個數組來得到類似的結果,但可以有多條return語句
  b. return語句會立即中止函數的運行,並將控制權交回調用該函數的代碼行
  c. 可以返回包括數組和對象的任意類型
  d. 函數的返回也分值傳遞和引用傳遞(返回的是一個變量才可)
    1) 默認是值傳遞方式
    2) 引用傳遞方式:
      - 定義函數時,函數名前加上& 表示該函數可以返回引用
      - 調用函數時,函數名前加上& 表示取得函數返回的引用
        此時,函數外修改返回值,會修改函數內的該返回變量的值
      - 如果函數需返回引用,則需要返回一個變量才可以
      - 從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用引用操作符&
        function &returns_reference(){return $someref;}
        $newref =& returns_reference();
    3) 返回引用的作用


/* 【變量作用域】 */
a. 全局變量和局部變量
  1) 作用域之間不重疊,即不同作用域的變量,之間不可訪問
  2) 全局作用域 - 函數之外的區域
  3) 局部作用域 - 函數內的區域,每個函數都是一個獨立的作用域

b. 超全局變量,既可以在全局也可在局部使用,僅能用系統自帶的,均是數組變量。
  $GLOBALS  $_COOKIE  $_ENV    $_FILES $_GET
  $_POST   $_REQUEST  $_SERVER  $_SESSION
c. $GLOBALS
  1) 不能存在超全局變量,但可以有超全局的數據!
  2) 將需要的數據放到超全局變量的數組內,但統一使用$GLOBALS
  3) $GLOBALS 特征
    - 每個全局變量就是對應$GLOBALS內的一個元素!
      每當增加一個全局,則自動在$GLOBALS內增加一個同名元素!
      同理,每當增加元素,也會增加一個全局變量,一般在函數內增加
    - 做的任何修改,也會映射到另一個,包括更新和刪除
      在函數內訪問全局變量,只需使用$GLOBALS
    - 出現過的全局變量,就可以通過$GLOBALS這個數組取得
  4) PHP生命周期中,定義在函數體外部的所謂全局變量,函數內部是不能直接獲得的
4) global關鍵字(不建議使用)
  將局部變量聲明為同名全局變量的一個'引用'!相當於常量的引用傳遞
    global $var;  // $var = &$GLOBALS['var'];
    不同於$GLOBALS!!!
  global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量。
  $GLOBALS確確實實調用是外部的變量,函數內外會始終保持一致。
  global的作用是定義全局變量,但是這個全局變量不是應用於整個網站,而是應用於當前頁面,包括include或require的所有文件。
d. 
  1) 作用域只針對變量,對常量無效
  2) 被載入文件中定義的變量作用域取決於被載入的位置。
    函數外被載入就是全局,函數內被載入就是局部!


/* 【變量生命周期】 */
1. 腳本結束時,全局變量消失
2. 函數執行完時,局部變量消失
3. 靜態變量
  static關鍵字
    靜態變量僅在局部函數域中存在,但當程序執行離開此作用域時,其值並不丟失。
    靜態變量僅會被初始化一次,其他局部變量每次被調用時都會被重新賦值。
    static聲明的靜態變量的生命周期會被一直延續。


/* 【迭代和遞歸】 */
迭代比遞歸效率高!
迭代是一種思想(算法),結構和使用上如同循環!
遞歸是一種思想(算法),將大問題拆分成小問題,逐一解決小問題以解決大問題
  要求大問題和小問題的解決方案是一致的!
  遞歸的結構和語法體現如圖函數。函數體內調用函數本身!
  遞歸出口:當該問題可以解決時,則不用再遞歸


/* 【匿名函數/閉包函數】 */
匿名函數,也叫閉包函數(closures),允許臨時創建一個沒有指定名稱的函數。

1. 定義匿名函數時,不需增加函數名。
2. PHP對匿名函數的管理,以一個對象的方式進行處理。
3. 匿名函數應該存放到變量內。
4. 匿名函數通過Closure類來實現
5. 可以使用函數作為函數的參數和返回值
6. 聲明函數時可以使用 use($param) 來向函數中傳入函數外的變量,結合變量引用來實現閉包
7. 可以用變量引用函數
$func = function ($e) {
  echo $e;
};  //結束時,需分號結束,如同變量賦值
var_dump($func);   //使用匿名函數
$func('ITCAST');   //函數的調用
  這不是可變函數,而是對象。Closure閉包類
//use語法
匿名函數傾向於值的概念,可能出現在任何地方。
use可以使得匿名函數使用其外部作用域的變量。非全局!
use與全局的區別:
  use使用其外部作用域的變量
function out() {
  $v = "in out";
  $func = function () use (& $v) {
    var_dump($v);
  }
}
  use類似參數的自動傳遞,也支持值與引用的傳遞方式。
//作用
  常作為'臨時函數'被調用(只在某個地方被調用的函數)
  例如:
    PHP存在一個array_map()函數,功能是針對一個函數內每個元素,去調用某個函數
    操作結果(array) = array_map(操作函數, 操作數組);
    $result_arr = array_map(function ($v) {return $v3}, $arr);

//閉包用法實例
function closureCreater() {
  $x = 1;
  return function($fun = null) use(&$x) {//按引用傳值
    echo "<br />" . $x++;
    $fun and $fun();
  };
}

$x = "hello world";
$test = closureCreater();
$test();
$test(function(){ echo "closure test one"; });
$test(function(){ echo "closure test two"; });
$test(function() use($x){ echo "<br />".$x;});

//將函數保存為數組元素
$x = 'outer param.';
$arr = array();
$arr[] = function($str)use($x){ return $str.$x; };
echo $arr[0]('test fun in arr,');


/* 【數組】 */
關聯數組:鍵和值有關聯,鍵表示值的邏輯含義。
索引數組:鍵和值無關聯,鍵表示值的位置。通常下標從0開始,遞增元素
count($var [,$mode]) //統計數組元素個數
  $mode可選,設為1或true時則遞歸統計
  $var非數組,返回1;$var未初始化或等於null或空數組,返回0

//鍵名的使用
整型數字鍵不需加引號($arr[1])
字符串數字鍵也不需加引號($arr = array('1'=>'abc'); $arr[1])
關聯數組,字符串鍵需加引號($arr = array('a'=>'aaa'); $arr['a'])
關聯數組,雙引號中解析變量,可不加引號($arr = array('a'=>'aaa'); "$arr[a]")

/* 【指針】 */
current/pos  返回當前被內部指針指向的數組單元的值,並不移動指針。
key      返回數組中當前單元的鍵名,並不移動指針
next    將數組中的內部指針向前移動一位,並返回移動後當前單元的值。先移動,再取值。
prev    將數組的內部指針倒回一位,並返回移動後當前單元的值先移動,再取值。
end      將數組的內部指針指向最後一個單元,並返回最後一個單元的值
reset    將數組的內部指針指向第一個單元,並返回第一個數組單元的值

each  返回數組中當前的鍵/值對並將數組指針向前移動一步。
      返回的是一個由鍵和值組成的長度為4的數組,下標0和key表示鍵,下標1和value表示值
        在執行each()之後,數組指針將停留在數組中的下一個單元
          或者當碰到數組結尾時停留在最後一個單元。
          如果要再用 each 遍歷數組,必須使用 reset()。

  1. 以上指針操作函數,除了key(),若指針移出數組,則返回false。而key()移出則返回null。
  2. 若指針非法,不能進行next/prev操作,能進行reset/end操作
  3. current/next/prev   若遇到包含空單元(0或"")也會返回false。而each不會!

list  把數組中的值賦給一些變量。list()是語言結構,不是函數
      僅能用於數字索引的數組並假定數字索引從0開始
      /* 可用於交換多個變量的值 */ list($a, $b) = array($b, $a);
  例:list($drink, , $power) = array('coffee', 'brown', 'caffeine');

1. 復制數組,其指針位置也會被復制。
  特例:如果數組指針非法,則拷貝的數組指針會重置,而原數組的指針不變。
  【指針問題】
    誰第一個進行寫操作,就會開辟一個新的值空間。與變量(數組變量)值傳遞給誰無關。
    數組函數current()被定義為寫操作,故會出現問題。
    foreach遍歷的是數組的拷貝,當被寫時,才會開辟一個新的值空間。
      即,foreach循環體對原數組進行寫操作時,才會出現指針問題。
      如果開辟新空間時指針非法,則會初始化指針。
2. 如果指針位置出現問題,則reset()初始化一下就可解決。


/* 【遍歷數組】 */
* 先找到元素,再獲取鍵和值

foreach
  foreach (array_expression as [$key =>] & $value)
   當foreach開始執行時,數組內部的指針會自動指向第一個單元。
   獲取元素信息後,移動指針,再執行循環體
   1. foreach本身循環結構,break和continue適用於foreach
   2. foreach支持循環的替代語法。
   3. $value是保存元素值的變量,對其修改不會改變數組的元素值
   4. $value支持元素值的引用拷貝,在$value前加上&即可
   5. $key不支持引用傳遞
   6. foreach遍歷的是原數組的拷貝,而在循環體對數組的操作是操作原數組
      即循環體對數組的操作,對原數組生效,對遍歷不生效。
      先拷貝一份數組用作遍歷

while...list...each
while (list($key, $val) = mysql_fetch_row($result)) = each($arr) {
 echo "$key => $val\n";
}



/* 【數組函數】 */
//統計計算
count    計算數組中的單元數目或對象中的屬性個數
array_count_values 統計數組中所有的值出現的次數
array_product    計算數組中所有值的乘積
array_sum      計算數組中所有值的和
range    建立一個包含指定范圍單元的數組

//獲取數組內容
array_chunk    將一個數組分割成多個
  array array_chunk(array $input, int $size[, bool $preserve_keys]) 
array_filter  用回調函數過濾數組中的單元
array_slice   從數組中取出一段
  array array_slice($arr, $offset [,$len [,$preserve_keys]])
array_keys    返回數組中所有的鍵名
  array array_keys(array $input[, mixed $search_value[, bool $strict]] )
  如果指定了可選參數 search_value,則只返回該值的鍵名。否則input數組中的所有鍵名都會被返回。
array_values  返回數組中所有的值,並建立數字索引

array_merge    合並一個或多個數組
  一個數組中的值附加在前一個數組的後面。
  如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。
  如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
  如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。 
array_merge_recursive  遞歸地合並一個或多個數組

//搜索
in_array      檢查數組中是否存在某個值
  bool in_array(mixed $needle, array $haystack[, bool $strict])
array_key_exists  檢查給定的鍵名或索引是否存在於數組中
  isset()對於數組中為NULL的值不會返回TRUE,而 array_key_exists()會
array_search    在數組中搜索給定的值,如果成功則返回相應的鍵名

array_combine  創建一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
  如果兩個數組的單元數不同或者數組為空時返回FALSE。
array_rand    從數組中隨機取出一個或多個單元,返回鍵名或鍵名組成的數組,下標是自然排序的
array_fill   用給定的值填充數組
  array_fill($start, $num, $value)
array_flip   交換數組中的鍵和值
array_pad    用值將數組填補到指定長度
array_reverse  返回一個單元順序相反的數組
array_unique  移除數組中重復的值
array_splice  把數組中的一部分去掉並用其它值取代

implode      將數組元素值用某個字符串連接成字符串
explode($delimiter, $str [,$limit])  //使用一個字符串分割另一個字符串
  $delimiter不能為空字符串""

array_map    將回調函數作用到給定數組的單元上,只能處理元素值,可以處理多個數組
  如果callback參數設為null,則合並多個數組為一個多維數組
array_walk    對數組中的每個成員應用用戶函數,只能處理一個數組,鍵和值均可處理,與foreach功能相同
  bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )

//棧:後進先出
入棧和出棧會重新分配索引下標
array_push    將一個或多個單元壓入數組的末尾(入棧)
array_pop    將數組最後一個單元彈出(出棧)    使用此函數後會重置(reset())array 指針。

//隊列:先進先出
隊列函數會重新分配索引下標
array_unshift  在數組開頭插入一個或多個單元
array_shift    將數組開頭的單元移出數組      使用此函數後會重置(reset())array 指針。

//排序函數
sort      對數組排序
rsort      對數組逆向排序
asort      對數組進行排序並保持索引關系
arsort      對數組進行逆向排序並保持索引關系
ksort      對數組按照鍵名排序
krsort      對數組按照鍵名逆向排序
usort      使用用戶自定義的比較函數對數組中的值進行排序
uksort      使用用戶自定義的比較函數對數組中的鍵名進行排序
uasort      使用用戶自定義的比較函數對數組中的值進行排序並保持索引關聯
natsort      用用“自然排序”算法對數組排序
natcasesort    用“自然排序”算法對數組進行不區分大小寫字母的排序
array_multisort 對多個數組或多維數組進行排序
shuffle      將數組打亂
  引用傳遞參數,返回bool值。
  重新賦予索引鍵名,刪除原有鍵名

//差集
array_udiff_assoc  帶索引檢查計算數組的差集,用回調函數比較數據
array_udiff_uassoc 帶索引檢查計算數組的差集,用回調函數比較數據和索引
array_udiff     用回調函數比較數據來計算數組的差集
array_diff_assoc  帶索引檢查計算數組的差集
array_diff_key   使用鍵名比較計算數組的差集
array_diff_uassoc  用用戶提供的回調函數做索引檢查來計算數組的差集
array_diff_ukey   用回調函數對鍵名比較計算數組的差集
array_diff     計算數組的差集
//交集
array_intersect_assoc 帶索引檢查計算數組的交集
array_intersect_key 使用鍵名比較計算數組的交集
array_intersect_uassoc 帶索引檢查計算數組的交集,用回調函數比較索引
array_intersect_ukey 用回調函數比較鍵名來計算數組的交集
array_intersect 計算數組的交集
array_key_exists 用回調函數比較鍵名來計算數組的交集
array_uintersect_assoc 帶索引檢查計算數組的交集,用回調函數比較數據
array_uintersect 計算數組的交集,用回調函數比較數據

extract($arr [,$type [,$prefix]])  從數組中將變量導入到當前的符號表(接受結合數組$arr作為參數並將鍵名當作變量名,值作為變量的值)
compact($var [,...])  建立一個數組,包括變量名和它們的值(變量名成為鍵名而變量的內容成為該鍵的值)




/* 【偽類型】 */
mixed    說明一個參數可以接受多種不同的(但並不必須是所有的)類型。
number    說明一個參數可以是 integer 或者 float。
callback  回調函數
void    void作為返回類型意味著函數的返回值是無用的。
      void作為參數列表意味著函數不接受任何參數。


/* 【數據庫操作】 */
#連接認證
mysql_connect    連接並認證數據庫
#發送SQL語句,接收執行結果
mysql_query      發送SQL語句
    僅對select, show, explain, describe語句執行成功返回一個資源標識符,其他語句成功返回true。執行失敗均返回false。
#處理結果
mysql_fetch_assoc  從結果集中取得一行作為關聯數組
    每次只取回一條,類似each
  結果集中記錄指針
mysql_fetch_row    從結果集中取得一行作為枚舉數組
mysql_fetch_array  從結果集中取得一行作為關聯數組,或數字數組,或二者兼有
  array mysql_fetch_array ( resource $result [, int $ result_type ] )
  可選參數result_type可選值為:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默認)
mysql_free_result  釋放結果內存
#關閉鏈接
mysql_close      關閉連接


/* 【類和對象】 */
# 成員:
  類成員:類常量、靜態屬性、靜態方法
  對象成員:非靜態屬性、非靜態方法
  # 除此外,類不能包含任何其他東西!!!

# 類名、方法名、屬性名均不區分大小寫
# $this代表本對象,self代表本類,parent代表父類
# 類和函數均可被事先編譯(僅作為最外層時)
# 類的定義必須在單一的PHP區塊內,不能被多個PHP標簽分割

// 構造方法
- 具有構造函數的類會在每次創建新對象時先調用此方法
void __construct([ mixed $args [, $... ]] )
- 構造方法所需參數由new實例化對象時,給類增加參數值。
- 構造方法也可以被手動調用。
- 5.3.3版本以前,支持於類名同名的方法作為構造方法。
- 兩種沖突時,__construct 優先

// 析構方法
- 析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。
void __destruct( void )
# 作用:釋放對象所占用的資源
# 調用的時機 
  - 腳本結束時所有資源均被釋放,包括對象
  - 手動刪除對象時
  - 保存對象的變量被賦予新值時(任何值,包括null)
  - 在使用exit()終止腳本運行時也會被調用

// 靜態成員(static關鍵字)
  - 聲明類成員或方法為static,就可以不實例化類而直接訪問。
  - 靜態成員(屬性或方法)均屬於類,故不能通過$this或->訪問。
  - 靜態成員是所有對象共享,屬於類。
  - 靜態成員用類調用,非靜態成員用對象調用。
# 靜態屬性
  - 靜態屬性不可以由對象通過->操作符來訪問。
  - 靜態屬性只能被初始化為一個字符值或一個常量,不能使用表達式。 所以你可以把靜態屬性初始化為整型或數組,但不能指向另一個變量或函數返回值,也不能指向一個對象。
# 靜態方法
  - 由於靜態方法不需要通過對象即可調用,所以偽變量$this在靜態方法中不可用。
  - 用::方式調用一個非靜態方法會導致一個E_STRICT級別的錯誤。

// 訪問解析操作符(::)
  - 可以用於訪問靜態成員、方法和常量,還可以用於覆蓋類中的成員和方法。 
  - 當在類的外部訪問這些靜態成員、方法和常量時,必須使用類的名字。 
  - self 和 parent 這兩個特殊的關鍵字是用於在類的內部對成員或方法進行訪問的。

// 訪問辨析
- 對象成員,內部通過$this指定,外部通過對象名指定,均用->訪問,訪問屬性時不需加$。
  對象名->屬性名  對象名->方法名()  $this->屬性名    $this->方法名()
- 類成員,內部通過self或parent指定,外部通過類名指定,均用::訪問,訪問屬性時需加$。
  類名::$屬性名  類名::方法名()    self::$屬性名    self::方法名()
- 特殊:也可以通過對象訪問類成員。(不建議)
  對象名::$類屬性名  $this::$類屬性名  對象名::$類方法名()  $this::類方法名()
# 對象成員訪問用->,類成員訪問用::

- 無論是靜態方法還是非靜態方法,均可通過類或對象進行訪問。
- 靜態屬性通過類訪問,靜態方法通過對象訪問。
- 只有使用對象調用非靜態方法時,$this才可以使用!
- 靜態方法不可使用$this。
- 類可以調用對象方法,但注意方法內不能有$this。
- 非靜態方法可以調用靜態屬性或靜態方法,反之不可以。

// 類常量
- 常量的值將始終保持不變。
- 在定義和使用常量的時候不需要使用$符號。
- 常量的值必須是一個定值,不能是變量,類屬性或其它操作(如函數調用)的結果。
# 定義:const 常量名 = 常量值;
- 不需要加public等訪問修飾限定符
- 類常量屬於類,使用類訪問,類名::類常量 或 self::類常量

// 自動加載對象
- 在試圖使用尚未被定義的類時自動調用 __autoload 函數
- 自動加載使用到的類名文件(根據類名找相應名稱的文件,故需類名與類文件名一致)
- 每個需要加載類的文件都需要存在__autoload函數
- 將__autoload函數寫入單獨的文件,每個需要用到類的文件再require該函數文件
- __autoload 參數是類名
function __autoload($class_name) {
  require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php";
}
  // $_SERVER["DOCUMENT_ROOT"] 當前運行腳本所在的文檔根目錄
- 可以通過類名,來推導出類所在的文件名!
- 如果一個項目存在多個自動加載函數時,定義一個可以完成加載的普通函數,並在函數之前使用spl_autoload_register注冊該函數。
# spl_autoload_register
- 注冊__autoload()函數
bool spl_autoload_register ([ callback $autoload_function ] )
- 可以注冊多個自動加載函數,先注冊的先執行
- 一旦注冊自動加載函數,__autoload就失效。
- 注冊函數時,參數為函數名(注意加引號);注冊方法時,參數為數組
# 注冊類或對象的方法為自動加載方法時,參數需為數組:
spl_autoload_register(array(__CLASS__, '__autoload'));
__CLASS__表示當前類名,若是對象可用$this,詳細見手冊

// 序列化(串行化)
# 數據傳輸均是字符串類型
# 除了資源類型,均可序列化
# 序列化在存放數據時,會存放數據本身,也會存放數據類型
作用:1.在網絡傳輸數據時;2.為了將數組或對象放在磁盤時
# 序列化
serialize    產生一個可存儲的值的表示
string serialize ( mixed $value )
- 返回字符串,此字符串包含了表示value的字節流,可以存儲於任何地方。
- 有利於存儲或傳遞 PHP 的值,同時不丟失其類型和結構。
# 反序列化
unserialize    從已存儲的表示中創建PHP的值
mixed unserialize ( string $str [, string $callback ] )
- 對單一的已序列化的變量進行操作,將其轉換回PHP的值。


# 文件的讀寫操作
- file_put_contents    將一個字符串寫入文件
int file_put_contents($file, $data [,$flags])
  $flags:FILE_USE_INCLUDE_PATH(覆蓋),FILE_APPEND(追加)
- file_get_contents    將整個文件讀入一個字符串
string file_get_contents($file [, bool $use_include_path [,int $offset [,int $maxlen]]])

# 對象序列化
- 只能序列化對象內部的數據,即非靜態屬性。
# 需在反序列化對象之前加載類,也可以觸發自動加載機制。

__sleep    序列化需序列化的屬性。
    - 提交未提交的數據,或類似的清理操作,部分串行化對象。
    - 返回一個包含對象中所有應被序列化的變量名稱的數組
__wakeup  反序列化時,預先准備對象需要的資源
    - 重新建立數據庫連接,或執行其它初始化操作
  public function __sleep() {
    return array('server', 'username', 'password', 'db');
  }
  public function __wakeup() {
    $this->connect();
  }

// 對象繼承
class 子類名 extends 父類 {}
如果一個對象是子類的對象,那麼同時也是父類的對象。
單繼承:一個類只能繼承一個父類,不能同時繼承多個類。但一個父類可以被多個子類繼承。

instanceof  判斷某對象是否為某類的對象
  對象名 instanceof 類名

// 訪問控制
public    公有的(繼承鏈、本類、外部均可訪問)
protected  保護的(僅繼承鏈、本類可訪問)
private    私有的(僅本類可訪問)
根據成員定義位置、訪問位置判斷。
# 兼容性問題
- 聲明屬性時,var關鍵字聲明的默認為public權限
- 聲明方法時,省略訪問修飾符,默認為public權限

// 重寫 override
$this代表本對象,被誰調用,就代表哪個對象。
- 繼承時,子類成員名於父類成員名發生沖突,則子類成員會重寫父類成員。
- 屬性和方法均可被子類重寫。
- 當父類的方法或屬性已經不滿足子類的需求,則需要重寫。
- 也可能因為命名不規范導致重寫。

私有屬性不能被重寫,每個私有屬性都會被記錄。在記錄屬性名的同時,還會記錄類。

如果有內置函數被重寫,則可調用父類方法。如調用父類構造方法parent::__construct()

# 重寫限制
訪問限制:
  子類的成員的訪問控制必須相等或弱於父類。
方法參數限制:
  參數數量必須相同,參數名可不同。

# $this確定原則
$this為調用該方法的對象,表示該方法的執行環境對象。
  - 對象調用
  - 環境的傳遞。如果當前調用時,不能確定$this的值(靜態調用),此時靜態調用所處對象環境會傳遞到被調用的方法內。
$this並非永遠代表本對象,而是由方法的執行環境決定。

# final
如果父類中的方法被聲明為final,則子類無法覆蓋(重寫)該方法。
如果一個類被聲明為final,則不能被繼承。
但加有final關鍵字的類依舊能被實例化!
# 抽象類
關鍵字:abstract
抽象類不能直接被實例化,必須先繼承該抽象類,然後再實例化子類。
抽象類中至少要包含一個抽象方法。非抽象類不能包含抽象方法。
如果類方法被聲明為抽象的,那麼其中就不能包括具體的功能實現。抽象方法不能包含大括號及方法體。
繼承一個抽象類的時候,子類必須實現抽象類中的所有抽象方法。
  即,子類必須重寫抽象父類中的所有抽象方法。
另外,這些方法的可見性必須和抽象類中一樣(或者更為寬松)。
  即,如果抽象類中某個抽象方法被聲明為protected,那麼子類中實現的方法就應該聲明為protected或者public,而不能定義為private。
- 抽象類的子類中的普通方法執行方式和其他類相同。
- 作用:
  1. 繼承,為擴展類,統一公共操作。
  2. 限制結構(規范)。規范子類的結構。

// 接口
關鍵字:interface
- 對象提供的與對象交互的方式就是接口。
- 使用接口可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。
- 通過interface來定義一個接口,就像定義一個標准的類一樣,但其中定義所有的方法都是空的。 
- 接口中定義的所有屬性和方法都必須是public,可省略public關鍵字。
- 接口中也可以定義常量(const)。接口常量和類常量的使用完全相同。
  可以用::訪問。接口名::常量名,實現類::常量名。
  它們都是定值,可以被子類或子接口使用,但不能修改。
- 接口不能定義屬性!
# 定義接口
interface 接口名 {
  接口內容(公共方法聲明的集合)
}
# 接口實現
- 要實現一個接口,可以使用implements操作符。
- 類中必須實現接口中定義的所有方法,否則會報一個fatal錯誤。
- 如果要實現多個接口,可以用逗號來分隔多個接口的名稱。
- 實現多個接口時,接口中的方法不能有重名。
- 接口也可以繼承,通過使用extends操作符。
class 類名 implements 接口名 {
  接口方法的實現
}
# 注意
  1. 類與抽象類之間是繼承關系,類與接口之間是實現關系。
  2. 類與抽象類是單繼承,類與接口是多實現。
  3. 接口不是類,限制類的結構。
  4. 接口與接口之間是多繼承。用extends關鍵字。
    interface I_C extends I_A, I_B {}

// 靜態延遲綁定
self::,代表本類(當前代碼所在類)
  永遠代表本類,因為在類編譯時已經被確定。
  即,子類調用父類方法,self卻不代表調用的子類。
static::,代表本類(調用該方法的類)
  用於在繼承范圍內引用靜態調用的類。
  運行時,才確定代表的類。
  static::不再被解析為定義當前方法所在的類,而是在實際運行時計算的。

// 對象的遍歷(迭代)
- 對象通過屬性保存數據,故遍歷對象的屬性。
- foreach語言結構,獲得屬性名和屬性值。
  foreach ($obj as $p_name => $p_value) {}
# 自定義遍歷(迭代器Iterator)
Iterator - 可在內部迭代自己的外部迭代器或類的接口
Iterator::current  — 返回當前元素
Iterator::key    — 返回當前元素的鍵
Iterator::next    — 向前移動到下一個元素
Iterator::rewind  — 返回到迭代器的第一個元素
Iterator::valid    — 檢查當前位置是否有效

# 對象的克隆
//對象之間的傳值是[引用]傳遞。
克隆:新對象 = clone 舊對象
  - 所有的引用屬性仍然會是一個指向原來的變量的引用。 
__clone()方法在對象被克隆時自動調用。
注意:構造方法對應實例化(new),克隆方法對應克隆(clone)。

// 單例模式
#三私一公
單例模式(Singleton)用於為一個類生成一個唯一的對象。最常用的地方是數據庫連接。使用單例模式生成一個對象後,該對象可以被其它眾多對象所使用。
# 防止一個類被實例化多次
class MySQLDB {
  private static $instance = null; // 存類實例在此屬性中
  // 構造方法聲明為private,防止直接創建對象
  private function __construct() {}
  public static function getInstance() {
    if(! self::$instance instanceof static) {
      self::$instance = new static;
    }
    return self::$instance;
  }
  private function __clone() {} // 阻止用戶復制對象實例
}

// 魔術方法
__construct    構造方法
__destruct    析構方法
__clone      克隆對象
__sleep      序列化對象
__wakeup    反序列化對象
__autoload    自動加載,使用類但未找到時

__toString    對象被當作字符串使用時
__invoke    當嘗試以調用函數的方式調用一個對象時

# 重載 overload
指動態地"創建"類屬性和方法
用戶可以自由的為對象添加額外的屬性,該特性就是重載。
所有的重載方法都必須被聲明為public。
當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用。
重載相關魔術方法的參數都不能通過引用傳遞。
# 屬性重載
- 處理不可訪問的屬性
屬性重載只能在對象中進行。
# 屬性重載對於靜態屬性無效
在靜態方法中,這些魔術方法將不會被調用。所以這些方法都不能被聲明為static。
__set    在給不可訪問的屬性賦值時
  public void __set(string $name, mixed $value)
  作用:批量管理私有屬性,間接保護對象結構
__get    讀取不可訪問的屬性的值時
  public mixed __get(string $name)
__isset    當對不可訪問的屬性調用isset()或empty()時
  public bool __isset(string $name)
__unset    當對不可訪問的屬性調用unset()時
  public void __unset(string $name)
# 方法重載
- 處理不可訪問的方法
__call      當調用一個不可訪問的非靜態方法(如未定義,或者不可見)時自動被調用
    public mixed __call(string $name, array $arguments)
__callStatic  當在調用一個不可訪問的靜態方法(如未定義,或者不可見)時自動被調用
    public static mixed __callStatic(string $name, array $arguments)
# $name參數是要調用的方法名稱。$arguments參數是一個數組,包含著要傳遞給方法的參數。

// 類型約束
函數的參數可以指定只能為對象或數組
限定為對象則在形參前加類名,限定為數組則在形參前加array
類型約束允許NULL值
類型約束不只是用在類的成員方法裡,也能使用在函數裡。 

// 三大特性
封裝:隱藏內部是吸納,僅開發接口。
繼承:一個對象的成員被另一個對象所使用。語法上體現為代碼的共用。
多態:多種形態。

// 類與對象·關鍵字
this    代表本對象
public    公有的(繼承鏈、本類、外部均可訪問)
protected  保護的(僅繼承鏈、本類可訪問)
private    私有的(僅本類可訪問)
parent::  代表父類
self::    代表本類(當前代碼所在類)
static::  代表本類(調用該方法的類)
static    靜態成員(屬性、方法),所有對象均可使用,外部也可直接使用或修改,靜態方法不可訪問非靜態成員
final    方法用final不可被子類重載,類用final不可被繼承(方法、類)
const    類常量(屬性)
abstract  抽象類
interface  接口
extends    類繼承(子接口繼承接口、其他普通類繼承)
implements  接口實現(類實現接口、抽象類實現借口)(對接口的實現和繼承均可有多個)
Iterator  內置接口(迭代)
clone    克隆
instance  實例
instanceof  某對象是否屬於某類

/* 【類與對象相關函數】 */
class_alias([$original [,$alias]]) 給類取別名
class_exists($class [,$autoload])  檢查類是否已定義
interface_exists($interface [,$autoload])  檢查接口是否已被定義
method_exists($obj, $method)檢查類的方法是否存在
property_exists($class, $property) 檢查對象或類是否具有該屬性
get_declared_classes(void) 返回由已定義類的名字所組成的數組
get_declared_interfaces(void)  返回一個數組包含所有已聲明的接口
get_class([$obj])    返回對象的類名
get_parent_class([$obj])  返回對象或類的父類名
get_class_methods($class)  返回由類的方法名組成的數組
get_object_vars($obj)  返回由對象屬性組成的關聯數組
get_class_vars($class) 返回由類的默認屬性組成的數組
is_a($obj, $class) 如果對象屬於該類或該類是此對象的父類則返回TRUE
is_subclass_of($obj, $class)  如果此對象是該類的子類,則返回TRUE
get_object_vars($obj)  返回由對象屬性組成的關聯數組


// 常用類
# PHP手冊 -> 預定義類
Closure    閉包類,匿名函數對象的final類
stdClass  標准類,通常用於對象類保存集合數據
__PHP_Incomplete_Class    不完整類,當只有對象而沒有找到類時,則該對象被認為是該類的對象
Exception  異常類
PDO      數據對象類

// 魔術常量
__DIR__      文件所在的目錄
__LINE__    文件中的當前行號 
__FILE__    文件的完整路徑(絕對路徑)和文件名

__CLASS__    類的名稱
__METHOD__    類的方法名,包含類名和方法名
__FUNCTION__  函數名稱,用在方法內只表示方法名

// 反射機制 Reflection
作用:1. 獲取結構信息    2. 代理執行
ReflectionClass 報告一個類的有關信息
ReflectionMethod 報告一個方法的有關信息
ReflectionClass::export  輸出類結構報告
# 代理執行
實例化 ReflectionFunction 類的對象
  $f = new ReflectionFunction('func');  // func為函數func($p)
  $f->invoke('param');


/* 頁面跳轉 */
// PHP
header('Loacation: url')
header()執行完畢後,後面的代碼也會繼續執行,故需在該語句後加die結束
無法給出提示,直接跳轉
// JS方法
location.href = url
// HTML
<meta http-equiv="Refresh" content="表示時間的數值; url=要跳轉的URI"> 

/* 【Cookie】 */
cookie是一種在遠程浏覽器端儲存數據並以此來跟蹤和識別用戶的機制。
cookie是HTTP標頭的一部分,因此setcookie()函數必須在其它信息被輸出到浏覽器前調用,這和對header()函數的限制類似。可以使用輸出緩沖函數來延遲腳本的輸出,直到按需要設置好了所有的cookie或者其它HTTP標頭。

// 新增
setcookie  新增一條cookie信息
setcookie($name [,$value [,$expire [,$path [,$domain [,$secure [,$httponly]]]]]])
#注意:setcookie()函數前不能有輸出!除非開啟ob緩存!
# 參數說明
$name  - cookie的識別名稱
  使用$_COOKIE['name']抵用名為name的cookie
$value  - cookie值,可以為數值或字符串,此值保存在客戶端,不要用來保存敏感數據
  假定$name參數的值為'name',則$_COOKIE['name']就可取得該$value值
$expire  - cookie的生存期限(Unix時間戳,秒數)
  如果$expire參數的值為time()+60*60*24*7則可設定cookie在一周後失效。如果未設定該參數,則會話後立即失效。
$path  - cookie在服務器端的指定路徑。當設定該值時,服務器中只有指定路徑下的網頁或程序可以存取該cookie。
  如果該參數值為'/',則cookie在整個domain內有效。
  如果設為'/foo/',則cookie就在domain下的/foo/目錄及其子目錄內有效。
  默認值為設定cookie的當前目錄及其子目錄。
$domain  - 指定此cookie所屬服務器的網址名稱,預設是建立此cookie服務器的網址。
  要是cookie能在如abc.com域名下的所有子域都有效,則該參賽應設為'.abc.com'。
$secure  - 指明cookie是否僅通過安全的HTTPS連接傳送中的cookie的安全識別常數,如果設定該值則代表只有在某種情況下才能在客戶端與服務端之間傳遞。
  當設成true時,cookie僅在安全的連接中被設置。默認值為false。

// 讀取
- 浏覽器請求時會攜帶當前域名下的所有cookie信息到服務器。
- 任何從客戶端發送的cookie都會被自動存入$_COOKIE全局數組。
- 如果希望對一個cookie變量設置多個值,則需在cookie的名稱後加[]符號。即以數組形態保存多條數據到同一變量。
  //設置為$_COOKIE['user']['name'],注意user[name]的name沒有引號
  setcookie('user[name]', 'shocker');
- $_COOKIE也可以為索引數組

// 刪除
方法1:將其值設置為空字符串
  setcookie('user[name]', '');
方法2:將目標cookie設為“已過期”狀態。
  //將cookie的生存時間設置為過期,則生存期限與浏覽器一樣,當浏覽器關閉時就會被刪除。
  setcookie('usr[name]', '', time()-1);

# 注意:
1. cookie只能保存字符串數據
2. $_COOKIE只用於接收cookie數據,不用於設置或管理cookie數據。
  對$_COOKIE進行操作不會影響cookie數據。
  $_COOKIE只會保存浏覽器在請求時所攜帶的cookie數據。
3. cookie生命周期:
  臨時cookie:浏覽器關閉時被刪除
  持久cookie:$expire參數為時間戳,表示失效時間。
4. 有效目錄
  cookie只在指定的目錄有效。默認是當前目錄及其子目錄。
  子目錄的cookie在其父目錄或同級目錄不可獲取。
5. cookie區分域名
  默認是當前域名及其子域名有效。
6. js中通過document.cookie獲得,類型為字符串
7. 浏覽器對COOKIE總數沒有限制,但對每個域名的COOKIE數量和每個COOKIE的大小有限,而且不同浏覽器的限制不同。

/* 【session】 */
1. 開啟session機制
  session_start()
  注意:session_start()函數前不能有輸出!除非開啟ob緩存。
2. 操作數據
  對$_SESSION數組進行操作
3. 浏覽器端保存SessionID,默認為當前域名下的所有目錄及其子目錄生效。即默認設置cookie的path值為'/'
4. 服務器保存session數據
  默認保存方式:每個會話都會生成一個session數據文件,文件名為:sess_加SessionID
5. session可以存儲除了資源以外的任何類型數據。
  數據被序列化後再保存到文件中。
6. $_SESSION的元素下標不能為整型!
  因為只對元素值進行序列化。
  元素內的數組下標無此要求。
7. 生存周期
  默認是浏覽器關閉
    因為浏覽器保存的cookie變量SessionID是臨時的
    但是服務器端的session數據文件不一定消失(需要等待session的垃圾回收機制來處理)
  可以延長cookie中PHPSESSID變量的生命周期。(不推薦)
  php.ini配置session.gc_maxlifetime
8. 刪除數據
  $_SESSION變量在腳本結束時依然會消失。開啟session機制時會造出$_SESSION變量。
  $_SESSION與保存session數據的文件是兩個空間。
  unset($_SESSION['key'])只是刪除數組內的該元素,不會立即相應到保存session數據的文件上。
    等到腳本結束,才會將$_SESSION的數據寫入到該文件中。
  session_destroy()  銷毀保存session數據的文件,也不會對該文件寫入內容。
    並不刪除$_SESSION變量,unset或腳本結束才會刪除該變量。
  如何完全刪除一個session?需刪除3部分
    unset($_SESSION);  
      刪除$_SESSION變量後,數據文件並未被改動。如果單獨使用unset,則需先置空$_SESSION = array()
    session_destroy();
    setcookie('PHPSESSID', '', time()-1); //保險做法是將其生命周期失效
  整個腳本周期內,只對數據文件讀一次、寫一次。

// 重寫session的存儲機制
# session存儲方式
session.save_handler = user|files|memcache
# 因數據文件過多導致的問題,可通過分子目錄保存進行解決
PHP配置文件下session.save_path選項,並需手動創建數據存放目錄。
在該配置選項前加層級。分布子目錄的原則,利用會話ID的相應字母來分配子目錄。仍需手動創建子目錄。
session.save_path = "2; F:/PHPJob/Temp"
# 多服務器數據共享問題
# 數據存儲操作:
  初始化$open、釋放資源$close、讀$read、寫$write、銷毀存儲介質$destroy(調用session_destroy時觸發該操作)、垃圾回收$gc
# 會話ID的長度可變。不同的設置方式導致不同長度的會話ID。
session.hash_function  允許用戶指定生成會話ID的散列算法。
  '0' 表示MD5(128 位),'1' 表示SHA-1(160 位)。
session.hash_bits_per_character  允許用戶定義將二進制散列數據轉換為可讀的格式時每個字符存放多少個比特。
  可能值為 '4'(0-9,a-f),'5'(0-9,a-v),以及 '6'(0-9,a-z,A-Z,"-",",")。
  總hash長度為128bit,會話ID長度為128/可能值,4->32, 5->26, 6->22
# 自定義數據存儲操作方法
# 注意:不用關心PHP如何序列化、反序列化、如何得到數據和寫入數據,只做與數據存儲相關的操作
session_set_save_handler  設置用戶自定義的會話數據存儲函數
  bool session_set_save_handler(callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc)
執行順序:open, close, read, write, destroy, gc
# 先設置處理器,再開啟會話

# 常用函數
session_start    開啟或恢復會話機制
session_id      獲取或設置當前會話ID
session_destroy    銷毀當前會話的所有數據(銷毀數據文件)
session_name    獲取或設置當前會話名稱(cookie變量名,默認為PHPSESSID)
session_save_path  獲取或設置當前會話數據文件保存路徑
session_set_save_handler  設置用戶自定義的會話數據存儲函數
session_unset    釋放所有會話變量(清空$_SESSION數組元素)
session_encode    將當前會話數據編碼為一個字符串
session_decode    將字符串解譯為會話數據
session_write_close  寫入會話數據並關閉會話
session_register_shutdown  關閉會話
session_set_cookie_params  設置會話cookie變量,必須在session_start()前使用。
  session_set_cookie_params(0,"/webapp/"); //設置session生存時間
session_get_cookie_params  獲取會話cookie變量。返回包含當前會話cookie信息的數組

# 配置php.ini
ini_set($varname, $newvalue);
  //該函數的配置只對當前腳本生效
  //並非所有php.ini設置均可用該函數設置
ini_get($varname)  //獲取某配置項信息
ini_get_all([str $extension])  //返回所有配置項信息的數組

# session擴展配置
session.name  指定會話名以用作cookie的名字。只能由字母數字組成,默認為PHPSESSID。
session.save_path  定義了傳遞給存儲處理器的參數。
  如果選擇了默認的files文件處理器,則此值是創建文件的路徑。默認為/tmp。
  可選的N參數來決定會話文件分布的目錄深度。
  要使用N參數,必須在使用前先創建好這些目錄。在ext/session目錄下有個小的shell腳本名叫mod_files.sh可以用來做這件事。
  如果使用了N參數並且N大於0,那麼將不會執行自動垃圾回收。
session.save_handler  定義了來存儲和獲取與會話關聯的數據的處理器的名字。默認為files。
  如果用戶自定義存儲器,則該值改為user。
  ini_set('session.save_handler', 'user');//此設置只針對當前腳本生效。
session.auto_start 指定會話模塊是否在請求開始時自動啟動一個會話。默認為 0(不啟動)。
session.gc_probability與session.gc_divisor合起來定義了在每個會話初始化時啟動gc(garbage collection 垃圾回收)進程的概率。此概率用 gc_probability/gc_divisor 計算得來。例如 1/100 意味著在每個請求中有 1% 的概率啟動gc進程。session.gc_divisor默認為100。session.gc_probability默認為1。


/* 【圖片生成與處理】 */GD庫
// 畫布生成
# 新建畫布
imagecreate       新建一個基於調色板的圖像
  resource imagecreate(int $x_size, int $y_size)
imagecreatetruecolor  新建一個真彩色圖像
# 基於已有文件或URL創建畫布
imagecreatefromgd2   從GD2文件或URL新建一圖像
imagecreatefromgd2part 從給定的GD2文件或URL中的部分新建一圖像
imagecreatefromgd    從GD文件或URL新建一圖像
imagecreatefromgif   由文件或URL創建一個新圖象
imagecreatefromjpeg   由文件或URL創建一個新圖象
imagecreatefrompng   由文件或URL創建一個新圖象
imagecreatefromstring  從字符串中的圖像流新建一圖像
imagecreatefromwbmp   由文件或URL創建一個新圖象
imagecreatefromxbm   由文件或URL創建一個新圖象
imagecreatefromxpm   由文件或URL創建一個新圖象
// 顏色分配
imagecolorallocate     為一幅圖像分配顏色
  int imagecolorallocate(resource $image, int $red, int $green, int $blue)
imagecolorallocatealpha   為一幅圖像分配顏色 + alpha
imagecolordeallocate    取消圖像顏色的分配
imagecolortransparent    將某個顏色定義為透明色
imagecolorat      取得某像素的顏色索引值
imagecolorclosest    取得與指定的顏色最接近的顏色的索引值
imagecolorclosestalpha 取得與指定的顏色加透明度最接近的顏色
imagecolorclosesthwb  取得與給定顏色最接近的色度的黑白色的索引
imagecolorexact     取得指定顏色的索引值
imagecolorexactalpha  取得指定的顏色加透明度的索引值
imagecolormatch     使一個圖像中調色板版本的顏色與真彩色版本更能匹配
imagecolorresolve    取得指定顏色的索引值或有可能得到的最接近的替代值
imagecolorresolvealpha 取得指定顏色 + alpha 的索引值或有可能得到的最接近的替代值
imagecolorset      給指定調色板索引設定顏色
imagecolorsforindex   取得某索引的顏色
imagecolorstotal    取得一幅圖像的調色板中顏色的數目
// 區域填充
imagefill  區域填充
  bool imagefill(resource $image, int $x, int $y, int $color)
imagefilledarc     畫一橢圓弧且填充
imagefilledellipse   畫一橢圓並填充
imagefilledpolygon   畫一多邊形並填充
imagefilledrectangle  畫一矩形並填充
imagefilltoborder    區域填充到指定顏色的邊界為止
imagesettile  設定用於填充的貼圖
// 圖形創建
imagearc    畫橢圓弧
imagechar    水平地畫一個字符
imagecharup   垂直地畫一個字符
imagedashedline 畫一虛線
imageellipse  畫一個橢圓
imageline    畫一條線段
imagepolygon  畫一個多邊形
imagerectangle 畫一個矩形
imagesetpixel  畫一個單一像素
imagesx     取得圖像寬度
imagesy     取得圖像高度
// 畫筆設置
imagesetbrush  設定畫線用的畫筆圖像
imagesetstyle  設定畫線的風格
imagesetthickness  設定畫線的寬度
// 圖形拷貝
imagecopy      拷貝圖像的一部分
imagecopymerge   拷貝並合並圖像的一部分
imagecopymergegray 用灰度拷貝並合並圖像的一部分
imagecopyresampled 重采樣拷貝部分圖像並調整大小
imagecopyresized  拷貝部分圖像並調整大小
// 字符創建
imagestring     水平地畫一行字符串
imagestringup    垂直地畫一行字符串
imagepsslantfont  傾斜某字體
imagefontheight   取得字體高度
imagefontwidth   取得字體寬度
imagettfbbox    取得使用 TrueType 字體的文本的范圍
imageloadfont    載入一新字體
imagepsencodefont  改變字體中的字符編碼矢量
imagepsextendfont  擴充或精簡字體
// 導出畫布為圖片
imagegif  以GIF格式將圖像輸出到浏覽器或文件
imagepng  以PNG格式將圖像輸出到浏覽器或文件
imagejpeg  以JPEG格式將圖像輸出到浏覽器或文件
imagewbmp  以WBMP格式將圖像輸出到浏覽器或文件
通過header()發送 "Content-type: image/圖片格式" 可以使PHP腳本直接輸出圖像。
  header("Content-type: image/gif"); imagegif($im);
imagegd   將 GD 圖像輸出到浏覽器或文件
imagegd2  將 GD2 圖像輸出到浏覽器或文件
// 釋放畫布資源
imagedestroy  銷毀圖像
// 圖像信息
image_type_to_extension   取得圖像類型的文件後綴
getimagesize        取得圖像大小
imagesx           取得圖像寬度
imagesy           取得圖像高度
imageistruecolor      檢查圖像是否為真彩色圖像
imagetypes         返回當前 PHP 版本所支持的圖像類型
// 圖像設置
imagerotate     用給定角度旋轉圖像
imagealphablending 設定圖像的混色模式
imageantialias   是否使用抗鋸齒(antialias)功能
imagefilter     對圖像使用過濾器
imagegammacorrect  對 GD 圖像應用 gamma 修正
imageinterlace   激活或禁止隔行掃描

/* 【縮略圖】【水印】 */
imagecopyresampled 重采樣拷貝部分圖像並調整大小
  bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
imagecopymerge   拷貝並合並圖像的一部分
  bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
getimagesize    取得圖像大小
  array getimagesize ( string $filename [, array &$imageinfo ] )

/* 【URL函數】 */
get_headers — 取得服務器響應一個 HTTP 請求所發送的所有標頭
get_meta_tags — 從一個文件中提取所有的 meta 標簽 content 屬性,返回一個數組
http_build_query — 生成 URL-encode 之後的請求字符串
urldecode — 解碼已編碼的URL字符串
urlencode — 編碼URL字符串
parse_url — 解析URL,返回其組成部分
  'http://username:password@hostname/path?arg=value#anchor'
  scheme(如http), host, port, user, pass, path, query(在問號?之後), fragment(在散列符號#之後)


//編碼可用於交換多個變量
$a = '中國';
$b = '四川';
$a = urlencode($a);
$b = urlencode($b);
$a = $a.'&'.$b;
$b = explode('&', $a);
$a = urldecode($b[1]);
$b = urldecode($b[0]);
echo $a, $b;
//list()函數用於交換變量
list($a, $b) = array($b, $a);


/* 【文件、目錄】 */
dirname($path) 返回路徑中的目錄部分
basename($path [,$suffix]) 返回路徑中的文件名部分
pathinfo($path [,$options]) 返回文件路徑的信息(數組元素:dirname,basename,extension)
realpath($path) 返回規范化的絕對路徑名

copy($source, $dest)  拷貝文件
unlink($file)  刪除文件
rename($old, $new) 重命名或移動一個文件或目錄
mkdir($path [,$mode [,$recursive]]) 新建目錄
  $mode表示權限,默認0777
  $recursive表示可創建多級目錄,默認false
rmdir($dir)   刪除目錄(目錄必須為空,且具有權限)

file_exists($file) 檢查文件或目錄是否存在
is_file($file)   判斷文件是否存在且為正常的文件
is_dir($file)    判斷文件名是否存在且為目錄
is_readable($file) 判斷文件或目錄是否可讀
is_writable($file) 判斷文件或目錄是否可寫
is_executable($file)  判斷給定文件名是否可執行
is_link($file)   判斷給定文件名是否為一個符號連接

tmpfile(void)  建立一個臨時文件
tempnam($dir, $prefix) 在指定目錄中建立一個具有唯一文件名的文件

file($file) 把整個文件讀入一個數組中
fopen($filename, $mode [,$use_include_path])
  $mode參數:(加入'b'標記解決移植性)
    'r'   只讀方式打開,將文件指針指向文件頭。
    'r+'  讀寫方式打開,將文件指針指向文件頭。
    'w'   寫入方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
    'w+'  讀寫方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
    'a'   寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
    'a+'  讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
    'x'   創建並以寫入方式打開,將文件指針指向文件頭。
    'x+'  創建並以讀寫方式打開,將文件指針指向文件頭。
fclose($handle) 關閉一個已打開的文件指針
fread($handle, $length) 讀取文件(可安全用於二進制文件)
fwrite($handle, $string [,$length]) 寫入文件(可安全用於二進制文件)
rewind($handle) 倒回文件指針的位置
ftell($handle) 返回文件指針讀/寫的位置
fseek($handle, $offset [,$whence]) 在文件指針中定位
feof($handle)  測試文件指針是否到了文件結束的位置
fgets  從文件指針中讀取一行
fgetss 從文件指針中讀取一行並過濾掉HTML標記
flock($handle, $opt) 輕便的咨詢文件鎖定
  $opt:LOCK_SH 取得共享鎖定(讀取的程序);LOCK_EX 取得獨占鎖定(寫入的程序);LOCK_UN 釋放鎖定(無論共享或獨占)


readfile($file) 讀入一個文件並寫入到輸出緩沖
fflush($handle) 將緩沖內容輸出到文件

touch($file [,$time [,$atime]])  設定文件的訪問和修改時間
fileatime  取得文件的上次訪問時間
filectime  取得文件的inode修改時間
filegroup  取得文件的組
fileinode  取得文件的inode
filemtime  取得文件修改時間
fileowner  取得文件的所有者
fileperms  取得文件的權限
filesize  取得文件大小
filetype  取得文件類型


/* fileinfo */ 獲取/設置文件信息
#擴展Fileinfo,配置php.ini
#extension=php_fileinfo.dll
finfo_open([$opt]) //創建一個文件信息資源
finfo_file($finfo, $file [,$opt]) //獲取文件信息
finfo_set_flags($finfo, $opt) //設置文件信息項
finfo_close($finfo) //關閉文件信息資源

mime_content_type($file) //獲取文件的MIME類型

$opt參數選項:
FILEINFO_MIME_ENCODING 文件編碼類型
FILEINFO_MIME_TYPE 文件MIME類型


//目錄
chdir($dir)     改變當前目錄
chroot($dir)    將當前目錄改變為當前進程的根目錄
closedir($handle)  關閉目錄句柄
dir($dir)      返回一個目錄的實例對象
getcwd()      取得當前工作目錄
opendir($path)   打開目錄句柄
readdir($handle)  從目錄句柄中讀取條目
rewinddir($handle) 倒回目錄句柄
scandir($dir [,$order])   列出指定路徑中的文件和目錄
glob($pattern [,$flags])  尋找與模式匹配的文件路徑
  $flags:
    GLOB_MARK - 在每個返回的項目中加一個斜線 
    GLOB_NOSORT - 按照文件在目錄中出現的原始順序返回(不排序) 
    GLOB_NOCHECK - 如果沒有文件匹配則返回用於搜索的模式 
    GLOB_NOESCAPE - 反斜線不轉義元字符 
    GLOB_BRACE - 擴充 {a,b,c} 來匹配 'a','b' 或 'c' 
    GLOB_ONLYDIR - 僅返回與模式匹配的目錄項 
  查找多種後綴名文件:glob('*.{php,txt}', GLOB_BRACE);


/* 解壓縮 */
//新建ZipArchive對象
$zip = new ZipArchive;
//打開ZIP文件
$zip->open($file [,$flags]);
  $flags:
    ZIPARCHIVE::OVERWRITE 覆蓋(不存在會自動創建)
    ZIPARCHIVE::CREATE 添加(不存在會自動創建)
    ZIPARCHIVE::EXCL
    ZIPARCHIVE::CHECKCONS
//關閉正在處理的ZIP文件
//解壓縮ZIP文件
$zip->extractTo($dest, [$entries]);
  $dest:解壓到的文件夾,$entries:解壓的條目
//添加文件到ZIP文件
$zip->addFile($file, [$newname]);  
  $newname可以為"dir/file",這樣可以將文件添加到壓縮文件中的某個目錄下。其他函數也如此。
//添加文件到ZIP文件,而內容來自字符串
$zip->addFromString($file, $str);
//添加空文件夾到ZIP文件
$zip->addEmptyDir($dir);
//通過索引刪除ZIP中的文件或文件夾
$zip->deleteIndex($index);
//通過名稱刪除ZIP中的文件或文件夾
$zip->deleteName($name);
//設置ZIP文件注釋
$zip->setArchiveComment($str);
//獲取ZIP文件注釋
$zip->getArchiveComment();
//通過索引獲取文件內容
$zip->getFromIndex($index);
//通過名稱獲取文件內容
$zip->getFromName($name);
//獲取索引文件的文件名稱
$zip->getNameIndex($index);
//通過索引重命名文件
$zip->renameIndex($index, $newname);
//通過名稱重命名文件
$zip->renameName($name, $newname);

//若將文件夾內容打包成ZIP文件,需循環文件夾的所有目錄及文件
function addFileToZip($path, $zip) {
  //打開當前文件夾$path
  $handle = opendir($path);
  //循環讀取子文件夾及文件
  //為防止文件名本身可被轉換為false的情況(比如為"0"),則需用不全等!==
  while ($file = readdir($handle) !== false) {
    //過濾假文件夾
    if ($file != '.' && $file != '..') {
      //對於子文件夾則遞歸調用本函數
      if (is_dir($path . '/' . $file)) {
        addFileToZip($path.'/'.$file, $zip);
      } else {
        //將文件添加到ZIP對象
        $zip->addFile($path . '/' . $file);
      }
    }
  }
  //關閉文件夾$path
  closedir($path);
}
// ----- END 解壓縮 ----- //


/* 【文件上傳】 */
enctype="multipart/form-data"  //FORM標簽必須的屬性
$_FILES 上傳文件信息數組變量
error  上傳錯誤信息
 無錯誤
 文件大小超過php.ini配置
    1) upload_max_filesize 允許上傳的最大文件大小
    2) post_max_size 最大的POST數據大小
    3) memory_limit 每個腳本能夠使用的最大內存數量(默認128MB)
 文件大小超過浏覽器表單配置
    MAX_FILE_SIZE  表示表單數據最大文件大小,該元素需在文件上傳域之前。(默認2M)
    <input type="hidden" name="MAX_FILE_SIZE" value="102400">
 文件只有部分被上傳
 文件沒有被上傳
  6,7 臨時文件寫入時失敗
 找不到臨時文件
 文件寫入失敗
name  文件名
type  文件類型
tmp_name  上傳文件臨時路徑
size  文件大小
move_uploaded_file($path, $newpath);  //將上傳的文件移動到新位置
is_uploaded_file($file) //判斷是否為POST上傳的文件
//多文件上傳
<input type="file" name="updfile[]" /> //HTML中以數組提交
$_FILES['updfile']['tmp_name'][0]  //服務器端可訪問第一個文件的臨時路徑,其他屬性類似


//php.ini配置
file_uploads = On 是否允許HTTP上傳文件
upload_max_filesize 上傳文件大小限制,默認為2M
post_max_size  post方式表單數據總大小限制,默認為8M
upload_tmp_dir 上傳文件臨時目錄,默認是系統臨時目錄
  需設置上傳文件臨時目錄,給其最小權限
GET方式的最大傳輸量為2K


/* 【批量提交】 */
FORM表單中的name值可用名稱加中括號的形式,在$_POST獲取表單數據時,可多項提交形成數組。
比如多文件上傳file,復選框提交checkbox等。
<input type="checkbox" name="id[]" value="值1" />
<input type="checkbox" name="id[]" value="值2" />
$id = $_POST['id']; //則可獲得全部被選中的復選框值,形成索引數組
如果name值為:
<input type="checkbox" name="id[one]" value="值1" />
<input type="checkbox" name="id[two]" value="值2" />
$id = $_POST['id']; //則可獲取所有name為id[...]的值,形成管理數組


/* iconv */
//php.ini配置iconv
[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
iconv_set_encoding($type, $charset);
  $type:input_encoding,output_encoding,internal_encoding
iconv_get_encoding([$type = "all"])
  $type:all,input_encoding,output_encoding,internal_encoding



iconv($in_charset, $out_charset, $str) //將字符串轉換為目標編碼

指定編碼,可解決中文字符的統計、查詢、截取等!
iconv_strlen($str [,$charset]) //統計字符串的字符數
iconv_strpos($str, $needle, $offset [,$charset]) //查找子串首次出現的位置
iconv_strrpos($str, $needle [,$charset]) //查找子串最後一次出現的位置
iconv_substr($str, $offset [,$len [,$charset]]) //截取子串


/* 【字符串函數】*/
addslashes($str)  //使用反斜線轉移字符串
stripcslashes($str) //反引用一個使用addcslashes轉義的字符串
stripslashes($str) //反引用一個引用字符串
chr($ascii) //返回ASCII碼的字符
ord($char) //返回字符的ASCII碼
substr_count($haystack, $needle)  //計算子串出現的次數
count_chars($str [,$mode]) 統計每個字節值出現的次數
  //0 - 以所有的每個字節值作為鍵名,出現次數作為值的數組。 
  //1 - 與0相同,但只列出出現次數大於零的字節值。 
  //2 - 與0相同,但只列出出現次數等於零的字節值。 
  //3 - 返回由所有使用了的字節值組成的字符串。 
  //4 - 返回由所有未使用的字節值組成的字符串。 
crypt($str, [$salt])  //單向字符串散列
str_split($str [,$len]) //將字符串按長度分割為數組
explode($separ, $str)  //使用一個字符串分割另一個字符串
implode([$glue,] $arr) //將數組元素的值根據$glue連接成字符串
chunk_split($str [,$len [,$end]])  //將字符串分割成小塊
  $len:每段字符串的長度,$end:每段字符串末尾加的字符串(如"\r\n")
html_entity_decode($str [,$flags [,$encoding]]) //將HTML實體轉成字符信息
htmlentities($str [,$flags [,$encoding]])  //將字符信息轉成HTML實體
htmlspecialchars_decode($str)  //將特殊HTML實體轉成字符信息
htmlspecialchars($str [,$flags [,$encoding]])  //將字符信息轉成特殊HTML實體
lcfirst($str)  //將字符串首字母轉成小寫
ucfirst($str)  //將字符串首字母轉成大寫
ucwords($str)  //將字符串中每個單詞的首字母轉換為大寫
strtolower($str)  //將字符串轉化為小寫
strtoupper($str)  //將字符串轉化為大寫
trim($str [,$charlist]) //去除字符串首尾處的空白字符(或者其他字符)
ltrim($str [,$charlist])  //去除字符串首段的空白字符(或者其他字符)
rtrim($str [,$charlist])  //去除字符串末端的空白字符(或者其他字符)
md5_file($file) //計算指定文件的MD5散列值
md5($str)  //計算字符串的MD5散列值
money_format($format, $num) //將數字格式化為貨幣形式
number_format($num) //格式化數字
nl2br($str) //在字符串所有新行之前插入HTML換行標記<br />
parse_str($str, [$arr]) //解析字符串
print($str) //輸出字符串
printf   //輸出格式化字符串
sprintf($format [,$args...])  //格式化字符串
sha1_file  //計算文件的sha1散列值
sha1    //計算字符串的sha1散列值
similar_text($first, $second [,$percent])  //計算兩個字符串的相似度
  返回在兩個字符串中匹配字符的數目,$percent存儲相似度百分比
str_replace($search, $replace, $str [,$count [,$type]]) //子字符串替換
str_ireplace  //字符串替換(忽略大小寫)
str_pad($str, $len [,$pad [,$type]]) //使用另一個字符串填充字符串為指定長度
  $type:在何處填充。STR_PAD_RIGHT,STR_PAD_LEFT 或 STR_PAD_BOTH
str_repeat($str, $num) //重復一個字符串
str_shuffle($str)  //隨機打亂一個字符串
str_word_count($str [,$format [,$charlist]])  //返回字符串中單詞的使用情況
strcasecmp($str1, $str2)  //二進制安全比較字符串(不區分大小寫)
  如果str1小於str2,返回負數;如果str1大於str2,返回正數;二者相等則返回0。
strcmp($str1, $str2)  //二進制安全字符串比較
strcoll($str1, $str1)  //基於區域設置的字符串比較(區分大小寫,非二進制安全)
strcspn($str1, $str1 [,$start [,$len]])  //獲取不匹配遮罩的起始子字符串的長度
strip_tags($str)  //從字符串中去除HTML和PHP標記
strpos($haystack, $needle [,$offset])  //查找字符串首次出現的位置
stripos($haystack, $needle [,$offset])  //查找字符串首次出現的位置(不區分大小寫)
strripos($haystack, $needle [,$offset])  //計算指定字符串在目標字符串中最後一次出現的位置(不區分大小寫)
strrpos($haystack, $needle [,$offset])  //計算指定字符串在目標字符串中最後一次出現的位置
strlen($str)  //獲取字符串長度
strpbrk($haystack, $str)  //在字符串中查找一組字符的任何一個字符
strrev($str)  //反轉字符串
  join('', array_reverse(preg_split("//u", $str))); //實現對UTF-8字符串的反轉
strspn$subject, $mask) //計算字符串中全部字符都存在於指定字符集合中的第一段子串的長度。
strstr($haystack, $needle)  //查找字符串的首次出現
stristr($haystack, $needle)  //查找字符串的首次出現(不區分大小寫)
strrchr($haystack, $needle) //查找指定字符在字符串中的最後一次出現
strtok($str, $token)  //標記分割字符串
substr_compare($main_str, $str, $offset [,$len) //二進制安全比較字符串(從偏移位置比較指定長度)
substr_replace$str, $replace, $start [,$len]  //替換字符串的子串
strtr($str, $from, $to) //轉換指定字符
substr($str, $start [,$len])  //返回字符串的子串
vfprintf$handle, $format, $args)  //將格式化字符串寫入流
vprintf($format, $args) //輸出格式化字符串
vsprintf($format, $args) //返回格式化字符串
wordwrap($str [,$width=75 [,$break='\n']]) //打斷字符串為指定數量的字串

crc32($str) //計算一個字符串的crc32多項式
  crc32算法[循環冗余校驗算法]
  生成str的32位循環冗余校驗碼多項式。將數據轉換成整數。

/* mbstring(多字節字符串) */
//需開啟mbstring擴展
mb_strimwidth($str, $start, $width [,$trim [,$encoding]])  //保留指定的子串(並補充)
mb_stripos($str, $needle [,$offset [,$encoding]])  //查找子串首次出現的位置(忽略大小寫)
mb_strpos($str, $needle [,$offset [,$encoding]])  //查找子串首次出現的位置
mb_strripos($str, $needle [,$offset [,$encoding]])  //查找子串最後一次出現的位置(忽略大小寫)
mb_strrpos($str, $needle [,$offset [,$encoding]])  //查找子串最後一次出現的位置
mb_strstr($str, $needle [,$before [,$encoding]])  //返回子串首次出現位置之後(前)的字符串
mb_stristr($str, $needle [,$before [,$encoding]])  //返回子串首次出現位置之後(前)的字符串(忽略大小寫)
mb_strrchr($str, $needle [,$before [,$encoding]])  //返回字符最後一次出現位置之後(前)的字符串
mb_strrichr($str, $needle [,$before [,$encoding]])  //返回字符最後一次出現位置之後(前)的字符串(忽略大小寫)

mb_strtoupper($str [,$encoding])  //轉換成大寫
mb_strtolower($str [,$encoding])  //轉換成小寫

mb_strlen($str [,$encoding])  //獲取字符串長度
mb_split($pattern, $str [,$limit]) //將字符串分割成數組
mb_substr($str, $start [,$len [,$encoding]])  //獲取字符串的子串
mb_strcut($str, $start [,$len [,$encoding]])  //獲取字符串的子串
mb_strwidth($str [,$encoding]) //獲取字符串的寬度
mb_substr_count($str, $needle [,$encoding]) //子串在字符串中出現的次數


/* PCRE函數 */
preg_filter($pattern, $replace, $subject [,$limit [,&$count]]) 執行一個正則表達式搜索和替換
preg_replace($pattern, $replace, $subject [,$limit [,&$count]]) 執行一個正則表達式搜索和替換
preg_replace_callback($pattern, $callback, $subject [,$limit [,&$count]])  執行一個正則表達式搜索並且使用一個回調進行替換
preg_grep($pattern, $input [,$flags])  返回匹配模式的數組條目
preg_match($pattern, $subject [,&$matches [,$flags [,$offset]]]) 執行一個正則表達式匹配
preg_match_all($pattern, $subject [,&$matches [,$flags [,$offset]]]) 執行一個全局正則表達式匹配
  $matches存放返回的結果
    $matches[0][n] (n>=0) 表示存放第n+1個匹配到的結果
    $matches[m][n] (m>=1, n>=0) 表示存放第n+1個匹配到結果的第m個表達式的內容
preg_split($pattern, $subject [,$limit [,$flags]]) 通過一個正則表達式分隔字符串
  $limit表示限制分隔得到的子串最多只有limit個,-1表示不限制
  $flags參數:
    PREG_SPLIT_NO_EMPTY:將返回分隔後的非空部分
    PREG_SPLIT_DELIM_CAPTURE:用於分隔的模式中的括號表達式將被捕獲並返回
    PREG_SPLIT_OFFSET_CAPTURE:對於每一個出現的匹配返回時將會附加字符串偏移量
preg_quote($str [,$delimiter]) 轉義正則表達式字符
preg_last_error()  返回最後一個PCRE正則執行產生的錯誤代碼


/* Math函數 */
base_convert($number, $frombase, $tobase)  //在任意進制之間轉換數字
ceil($float)  //向上取整
floor($float)  //向下取整
exp($float) //計算e的指數
hypot($x, $y)  //計算直角三角形的斜邊長
is_nan($val)  //判斷是否為合法數值
log($arg [,$base=e]) //自然對數
max($num1, $num2, ...) //找出最大值
  max($arr)  //找出數組中的最大值
min($num1, $num2, ...) //找出最小值
rand([$min], $max) //產生一個隨機整數
srand([$seed]) //播下隨機數發生器種子
mt_rand([$min], $max)  //生成更好的隨機數
mt_srand($seed)   //播下一個更好的隨機數發生器種子
pi()  //得到圓周率值
pow($base, $exp)  //指數表達式
sqrt($float)  //求平方根
deg2rad($float) //將角度轉換為弧度
rad2deg($float) //將弧度數轉換為相應的角度數
round($val [,$pre=0]) //對浮點數進行四捨五入
fmod($x, $y) //返回除法的浮點數余數



/* 【MySQL函數】 */
mysql_client_encoding([$link]) //返回字符集的名稱
mysql_set_charset($charset [,$link])  //設置客戶端字符集編碼
mysql_connect($host, $user, $pass) //打開一個到MySQL服務器的連接
mysql_create_db($db [,$link])  //新建一個MySQL數據庫
mysql_pconnect($host, $user, $pass) //打開一個到MySQL服務器的持久連接
mysql_ping([$link]) //Ping一個服務器連接,如果沒有連接則重新連接
mysql_close([$link])  //關閉MySQL連接

mysql_data_seek($result, $row) //移動內部結果的指針
mysql_errno([$link])  //返回上一個MySQL操作中的錯誤信息的數字編碼
mysql_error([$link])  //返回上一個MySQL操作產生的文本錯誤信息
mysql_affected_rows([$link]) //取得前一次MySQL操作所影響的記錄行數
mysql_info([$link]) //取得最近一條查詢的信息
mysql_insert_id([$link])  //取得上一步INSERT操作產生的ID

mysql_query($sql [,$link]) //發送一條MySQL查詢
mysql_unbuffered_query($sql [,$link])  //向MySQL發送一條SQL查詢,並不獲取和緩存結果的行
mysql_db_query($db, $sql [,$link]) //發送一條MySQL查詢

mysql_escape_string($str)  //轉義一個字符串用於mysql_query
mysql_real_escape_string($str) //轉義SQL語句中使用的字符串中的特殊字符,並考慮到連接的當前字符集

mysql_fetch_array($result [,$type]) //從結果集中取得一行作為關聯數組,或數字數組,或二者兼有
mysql_fetch_assoc($result) //從結果集中取得一行作為關聯數組
mysql_fetch_object($result) //從結果集中取得一行作為對象
mysql_fetch_row($result)  //從結果集中取得一行作為枚舉數組
mysql_fetch_field($result) //從結果集中取得列信息並作為對象返回
mysql_num_fields($result)  //取得結果集中字段的數目
mysql_num_rows($result) //取得結果集中行的數目

mysql_fetch_lengths($result)  //取得結果集中每個輸出的長度
mysql_field_flags($result, $field_offset)  //從結果中取得和指定字段關聯的標志
mysql_field_len($result, $field_offset)  //返回指定字段的長度
mysql_field_name($result, $field_offset)  //取得結果中指定字段的字段名
mysql_field_seek($result, $field_offset)  //將結果集中的指針設定為制定的字段偏移量
mysql_field_table($result, $field_offset)  //取得指定字段所在的表名
mysql_field_type($result, $field_offset)  //取得結果集中指定字段的類型
mysql_free_result($result) //釋放結果內存

mysql_list_dbs([$link]) //列出MySQL服務器中所有的數據庫
mysql_list_fields($db, $table [,$link]) //列出MySQL結果中的字段
mysql_list_processes([$link])  //列出MySQL進程
mysql_list_tables($db [,$link]) //列出MySQL數據庫中的表

mysql_result($result, $row [$field])  //取得結果數據
mysql_select_db($db [,$link])  //選擇MySQL數據庫
mysql_tablename($result, $i)  //取得表名
mysql_db_name($result, $row [,$field]) //取得mysql_list_dbs()調用所返回的數據庫名

mysql_stat([$link]) //取得當前系統狀態
mysql_thread_id([$link])  //返回當前線程的ID
mysql_get_client_info() //取得MySQL客戶端信息
mysql_get_host_info()  //取得MySQL主機信息
mysql_get_proto_info() //取得MySQL協議信息
mysql_get_server_info() //取得MySQL服務器信息


/* 【SQL注入】 */
特殊字符導致的問題:
  1. 轉義:mysql_real_escape_string()
    對外來數據(GPC: GET, POST, COOKIE)進行轉義
  2. 先查詢當前記錄行,再匹配用戶名

//魔術引號機制
自動為所有提交到服務器的數據增加特殊符號的轉義。
當打開時,所有的單引號,雙引號,反斜線和NULL字符都會被自動加上一個反斜線進行轉義。這和addslashes()作用完全相同。
php.ini配置:
  magic_quotes_gpc = Off
get_magic_quotes_gpc() 獲取當前魔術引號機制的配置信息

/* 【錯誤處理】 */
解析錯誤、運行錯誤
//標准錯誤:
  級別、信息、文件、行號
  trigger_error  觸發一個用戶自定義的error/warning/notice錯誤信息

//php.ini配置,ini_set()
error_reporting     設置報告哪些級別的錯誤
# 錯誤報告:顯示到頁面
  display_errors = On 是否顯示錯誤報告
# 錯誤日志:存放到文件
  log_errors = on   是否開啟錯誤日志
  error_log      發送錯誤信息到錯誤日志文件
- 錯誤報告和錯誤日志可同時啟用!

自定義錯誤處理器
set_error_handler — 注冊自定義錯誤處理器函數
- 自定義處理器函數包含4個參數,分別是級別、信息、文件、行號
- 開啟自定義錯誤處理器,則系統內置的錯誤報告和錯誤日志則不會執行。
- 自定義錯誤處理器函數返回false,則自定義函數結束後系統內置的會繼續執行。
- 用戶定義的錯誤級別(E_USER_ERROR),可以被自定義的錯誤處理器所捕獲並繼續執行。系統內置的錯誤,則腳本會立即停止。
restore_error_handler — 恢復預定義錯誤處理器函數
error_get_last — 獲取最近的錯誤信息

//錯誤處理函數
debug_backtrace 產生一條回溯跟蹤
  返回數組,包含的鍵值:function, line, file, class, object, type, args
debug_print_backtrace 打印一條回溯

//錯誤常量
手冊>錯誤處理

#生產模式
關閉錯誤報告,記錄錯誤日志。
#開發模式
關閉錯誤日志,開啟錯誤報告。

//異常
面向對象語法中的錯誤處理方式。
一個異常就是一個包含當前異常信息的對象。
預定義異常類Exception及其擴展類。
#拋出異常
觸發一個異常的錯誤
throw new UserException();
如果沒有被捕獲,則報告致命錯誤。
#監視異常
try {代碼段}
#捕獲異常
catch (UserException $obj) {代碼段}
需要通過當前異常的類型匹配才可悲捕獲。
#異常處理器
用以處理未被捕獲的異常。
異常處理器函數與catch類似,參數也是含類型的對象。
set_exception_handler — 注冊異常處理器函數
restore_exception_handler — 恢復預定義的異常處理器函數


#自定義異常
用戶定義的異常類須繼承自Exception類。

//異常相關屬性
protected string $message 異常消息內容
protected int $code 異常代碼
protected string $file 拋出異常的文件名
protected int $line 拋出異常在該文件中的行號
//異常相關方法
Exception::__construct — 異常構造函數
Exception::getMessage — 獲取異常消息內容
Exception::getPrevious — 返回異常鏈中的前一個異常
Exception::getCode — 獲取異常代碼
Exception::getFile — 獲取發生異常的程序文件名稱
Exception::getLine — 獲取發生異常的代碼在文件中的行號
Exception::getTrace — 獲取異常追蹤信息
Exception::getTraceAsString — 獲取字符串類型的異常追蹤信息
Exception::__toString — 將異常對象轉換為字符串
Exception::__clone — 異常克隆

/* 【數據庫抽象層】 */
PDO:PHP Data Objects
PHO抽象層默認被加載,但需加載相應數據庫的驅動。
PDO是OOP語法,提供三個類:
PDO:PDO自身
PDOStatement:PDO語句類,提供對語句的後續處理
PDOException:PDO異常類,提供對錯誤的異常處理

//連接數據庫
PDO::__construct(str $dsn [,str $username [,str $password [,arr $driver_options]]])
DSN:Data Source Name,數據源
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3306';
//執行沒有返回結果的SQL語句
int PDO::exec(str $statement)  //返回影響的記錄數
//執行有返回結果集的SQL語句
PDOStatement PDO::query (string $statement) //返回PDOStatement對象
//處理結果集(PDOStatement對象)
array PDOStatement::fetchAll([int $fetch_style [,mixed $fetch_argument [,array $ctor_args = array()]]])  //默認返回關聯+索引數組
mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] ) //返回一行
string PDOStatement::fetchColumn ([ int $column_number = 0 ] ) //返回一列
//釋放資源
unset($pdo) 或 $pdo = null

//錯誤報告
靜默模式:silent mode,出現錯誤,不主動報告錯誤(默認)
array PDO::errorInfo(void)
警告模式:warning mode,出現錯誤,觸發一個警告級別的錯誤
異常錯誤:exception mode,出現錯誤,拋出異常
bool PDO::setAttribute(int $attribute, mixed $value)  //設置PDO類屬性值
PDO::setAttribute('PDO::ATTR_ERRMODE', 'PDO::ERRMODE_SILENT | PDO::ERRMODE_WARNING | PDO::ERRMODE_EXCEPTION')

//預處理式執行SQL
可對數據自動轉義,可有效抵制SQL注入。
PDOStatement PDO::prepare(string $statement [,array $driver_options=array()])
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
bool PDOStatement::execute ([ array $input_parameters ] )


/* 【AR模式】 */
表 -> 類
字段 -> 類屬性
數據 -> 對象


/* Date/Time */
date($format [,$timestamp]) //格式化一個本地時間/日期,$timestamp默認為time()
  Y:4位數字完整表示的年份
  m:數字表示的月份,有前導零
  d:月份中的第幾天,有前導零的2位數字
  j:月份中的第幾天,沒有前導零
  H:小時,24小時格式,有前導零
  h:小時,12小時格式,有前導零
  i:有前導零的分鐘數
  s:秒數,有前導零
  L:是否為閏年,如果是閏年為1,否則為0
  M:三個字母縮寫表示的月份,Jan到Dec
  W:年份中的第幾周,每周從星期一開始
  z:年份中的第幾天
  N:數字表示的星期中的第幾天
  w:星期中的第幾天,數字表示
  e:時區標識
  T:本機所在的時區
  U:從Unix紀元開始至今的秒數(時間戳)
time() //返回當前的Unix時間戳(秒)
microtime([$get_as_float]) //返回當前Unix時間戳和微秒數
  $get_as_float參數存在並且其值等價於TRUE,將返回一個浮點數
strtotime($time [,$now]) //將任何英文文本的日期時間描述解析為Unix時間戳
  date("Y-m-d H:i:s", strtotime("-1 day")); //格式化前一天的時間戳
  "now"
  "10 September 2000"
  "+1 week"
  "+1 week -2 days 4 hours 2 seconds"
  "last Monday"
  "next Thursday"
gmdate($format [,$timestamp]) //格式化一個GMT/UTC 日期/時間
mktime([$hour = date("H") [,$minute = date("i") [,$second = date("s") [,$month = date("n") [,$day = date("j") [,$year = date("Y") [,$is_dst = -1]]]]]]]) //取得一個日期的Unix時間戳
strftime($format [,$timestamp]) //根據區域設置格式化本地時間/日期
date_default_timezone_get($timezone) //獲取默認時區
date_default_timezone_set($timezone) //設置默認時區


/* DateTime */
//date()函數能處理有效時間戳范圍是格林威治時間 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07(因為32位系統能最大正整數限制)
DateTime::__construct([$time="now"]) //構造方法
  $time若是時間戳,則在時間戳前加@符號,如'@2345678'
DateTime::setTimezone($timezone) //設置時區
  eg: $date->setTimezone(new DateTimeZone('PRC'));
DateTime::format($format) //格式化時間戳,格式化字符串形式同date()函數


/* $_SERVER */
//示例URL:http://desktop/dir/demo.php?a=aaa&b=bbb
PHP_SELF 當前執行腳本的文件名 // /dir/demo.php
GATEWAY_INTERFACE 服務器使用的CGI規范的版本 // CGI/1.1
SERVER_ADDR 當前運行腳本所在的服務器的IP地址 // 127.0.0.1
SERVER_NAME 當前運行腳本所在的服務器的主機名 // desktop
SERVER_SOFTWARE 服務器標識字符串 // Apache/2.2.22 (Win32) PHP/5.3.13
SERVER_PROTOCOL 請求頁面時通信協議的名稱和版本 // HTTP/1.1
REQUEST_METHOD 訪問頁面使用的請求方式 // GET
REQUEST_TIME 請求開始時的時間戳 // 1386032633
QUERY_STRING 查詢字符串(參數) // a=aaa&b=bbb
DOCUMENT_ROOT 當前運行腳本所在的文檔根目錄 // C:/Users/Administrator/Desktop
HTTP_ACCEPT 當前請求頭中Accept:項的內容 // text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_CHARSET 當前請求頭中Accept-Charset:項的內容 // UTF-8,*
HTTP_ACCEPT_ENCODING 當前請求頭中Accept-Encoding:項的內容 // gzip, deflate
HTTP_ACCEPT_LANGUAGE 當前請求頭中Accept-Language:項的內容 // zh-cn,zh;q=0.5
HTTP_CONNECTION 當前請求頭中Connection:項的內容 // keep-alive
HTTP_HOST 當前請求頭中Host:項的內容 // desktop
HTTP_REFERER 引導用戶代理到當前頁的前一頁的地址
HTTP_USER_AGENT 當前請求頭中User-Agent:項的內容 // Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
HTTPS 如果腳本是通過HTTPS協議被訪問,則被設為一個非空的值
REMOTE_ADDR 浏覽當前頁面的用戶的IP地址 // 127.0.0.1
REMOTE_HOST 浏覽當前頁面的用戶的主機名
REMOTE_PORT 用戶機器上連接到Web服務器所使用的端口號 // 49197
REMOTE_USER 經驗證的用戶
REDIRECT_REMOTE_USER 驗證的用戶,如果請求已在內部重定向
SCRIPT_FILENAME 當前執行腳本的絕對路徑 // C:/Users/Administrator/Desktop/dir/demo.php
SERVER_ADMIN 該值指明了Apache服務器配置文件中的SERVER_ADMIN參數 //[email protected]
SERVER_PORT Web服務器使用的端口 // 80
SERVER_SIGNATURE 包含了服務器版本和虛擬主機名的字符串
PATH_TRANSLATED 當前腳本所在文件系統(非文檔根目錄)的基本路徑
SCRIPT_NAME 當前腳本的路徑 // /dir/demo.php
REQUEST_URI URI用來指定要訪問的頁面 // /dir/demo.php?a=aaa&b=bbb
PHP_AUTH_DIGEST 客戶端發送的“Authorization” HTTP頭內容
PHP_AUTH_PW 用戶輸入的密碼
AUTH_TYPE 認證的類型
PATH_INFO 包含由客戶端提供的、跟在真實腳本名稱之後並且在查詢語句(query string)之前的路徑信息
ORIG_PATH_INFO 在被PHP處理之前,“PATH_INFO”的原始版本




/* 緩存 */
1. ob緩存(輸出緩存)(需開啟)
  php.ini設置中開啟並設置輸出緩存大小:output_buffering = 4096
  ob_start() 開啟當前腳本頁面的輸出緩存
  如果輸出緩存打開,則輸出的數據先放到輸出緩存(header函數前可以有輸出),否則直接放入程序緩存。
  header()函數發送的內容直接放入程序緩存。
  開啟輸出緩存後,輸出緩存數據會刷新到程序緩存,然後有Apache封裝成http響應包返回給浏覽器。
  輸出緩存:存放的數據是從開啟輸出緩存開始返回給浏覽器的所有靜態頁面數據!
2. 程序緩存(內部緩存,必須存在,不能關閉)
3. 浏覽器緩存

/* ob緩存(輸出控制) */ Output Buffering
ob_start() //打開一個輸出緩沖區,所有的輸出信息不再直接發送到浏覽器,而是保存在輸出緩沖區裡面。
  ob_start('ob_gzhandler'); //將gz編碼的數據發送到支持壓縮頁面的浏覽器

ob_clean();      //刪除內部緩沖區的內容,不關閉緩沖區(不輸出)。
ob_end_clean();    //刪除內部緩沖區的內容,關閉緩沖區(不輸出)。
ob_get_clean();    //返回內部緩沖區的內容,關閉緩沖區。相當於執行ob_get_contents()與ob_end_clean()
ob_flush();      //發送內部緩沖區的內容到浏覽器,刪除緩沖區的內容,不關閉緩沖區。
ob_end_flush();    //發送內部緩沖區的內容到浏覽器,刪除緩沖區的內容,關閉緩沖區。
ob_get_flush();    //返回內部緩沖區的內容,並關閉緩沖區,再釋放緩沖區的內容。相當於ob_end_flush()並返回緩沖區內容。
flush();        //將當前為止程序的所有輸出發送到用戶的浏覽器

ob_get_contents();   //返回緩沖區的內容,不輸出。
ob_get_length();    //返回內部緩沖區的長度,如果緩沖區未被激活,該函數返回FALSE。
ob_get_level();    //Return the nesting level of the output buffering mechanism.
ob_get_status();    //獲取ob狀態信息

ob_implicit_flush();  //打開或關閉絕對刷新,默認為關閉,打開後ob_implicit_flush(true),所謂絕對刷新,即當有輸出語句(e.g: echo)被執行時,便把輸出直接發送到浏覽器,而不再需要調用flush()或等到腳本結束時才輸出。

ob_gzhandler        //ob_start回調函數,用gzip壓縮緩沖區的內容。
ob_list_handlers      //List all output handlers in use
output_add_rewrite_var   //Add URL rewriter values
output_reset_rewrite_vars //Reset URL rewriter values

這些函數的行為受php_ini設置的影響:
output_buffering    //該值為ON時,將在所有腳本中使用輸出控制;若該值為一個數字,則代表緩沖區的最大字節限制,當緩存內容達到該上限時將會自動向浏覽器輸出當前的緩沖區裡的內容。
output_handler     //該選項可將腳本所有的輸出,重定向到一個函數。例如,將 output_handler 設置為 mb_output_handler() 時,字符的編碼將被修改為指定的編碼。設置的任何處理函數,將自動的處理輸出緩沖。
implicit_flush     //作用同ob_implicit_flush,默認為Off。

//ob緩存作用
1)防止在浏覽器有輸出之後再使用setcookie()、header()或session_start()等發送頭文件的函數造成的錯誤。其實這樣的用法少用為好,養成良好的代碼習慣。
2)捕捉對一些不可獲取的函數的輸出,比如phpinfo()會輸出一大堆的HTML,但是我們無法用一個變量例如$info=phpinfo();來捕捉,這時候ob就管用了。
3)對輸出的內容進行處理,例如進行gzip壓縮,例如進行簡繁轉換,例如進行一些字符串替換。
4)生成靜態文件,其實就是捕捉整頁的輸出,然後存成文件。經常在生成HTML,或者整頁緩存中使用。


/* 網站並發 */
測試工具:apache/bin/ab.exe
用法:cmd{%apache-bin%}>ab.exe -n 執行訪問次數 -c 用戶並發數量 URL地址
MPM(多路處理模塊):perfork(預處理模式), worker(工作者模式), winnt(Win系統)
MPM配置:httpd-mpm.conf
查看當前MPM模式:httpd –l  mpm_xxx.c中xxx表示當前模式類型
httpd.conf配置(開啟MPM):#Include conf/extra/httpd-mpm.conf
#參考配置
#配置文件:extra/httpd-mpm.conf
#mpm_winnt.c
<IfModule mpm_winnt_module>
  ThreadsPerChild   1000  #中型網站1500-5500合理
  MaxRequestsPerChild 0
</IfModule>
#mpm_prefork.c
<IfModule mpm_prefork_module>
  StartServers  5    #預先啟動
  MinSpareServers 5
  MaxSpareServers 10   #最大空閒進程
  ServerLimit   1500  #用於修改apache編程參數
  MaxClients   1000  #最大並發數
  MaxRequestsPerChild 0  #一個進程對應的線程數,對worker更用
</IfModule>
#如果你的網站pv值上百萬
ServerLimit   2500  #用於修改apache編程參數
MaxClients   2000  #最大並發數


/* 靜態化 */
1. 頁面URL長度不超過255字節
2. meta信息盡量完整,keywords5個左右
3. 前端不要使用框架
4. 圖片alt屬性添加信息
5. 靜態頁面不要帶動態值

<script type="text/javascript" language="javascript" src="url"></script>
url可以是js/php/圖片等,返回的數據替換<script>標簽所在位置的內容!相當於簡單的Ajax


/* Apache壓縮 */
gzip/deflate


/* XSS攻擊 */
#惡意JS代碼
#不規則HTML代碼

開源過濾器:htmlpurifier

//獲取COOKIE
<script>
var c = document.cookie; //獲取COOKIE
var script = document.createElement('script'); //創建script標簽
script.src = 'demo.php?c=' + c; //發送到指定的文件接收
document.body.appendChild(script); //添加到DOM對象中生效
</script>


/* 命令行CLI */
//顯示幫助信息
php -h
//解析並運行-f選項給定的文件名
php [-f] <file> [--] [args...]
//在命令行內運行單行PHP代碼
php [options] -r <code> [--] [args...]
無需加上PHP的起始和結束標識符,否則將會導致語法解析錯誤
//調用phpinfo()函數並顯示出結果
php -i/--info
//檢查PHP語法
php -l/--syntax-check
//打印出內置以及已加載的PHP及Zend模塊
php -m/--modules
//將PHP,PHP SAPI和Zend的版本信息寫入標准輸出
php -v/--version

//參數接收
$argv  傳遞給腳本的參數數組
  第一個參數總是當前腳本的文件名,因此$argv[0]就是腳本文件名
$argc  傳遞給腳本的參數數目
  腳本的文件名總是作為參數傳遞給當前腳本,因此$argc的最小值為1
包含當運行於命令行下時傳遞給當前腳本的參數的數組
此兩個變量僅在register_argc_argv打開時可用


/* 設計模式 */
單例模式:為一個類生成一個唯一的對象。使用單例模式生成一個對象後,該對象可以被其它眾多對象所使用。
工廠模式:封裝對象的建立過程。可以在對象本身創建對象工廠或者是一個額外的工廠類
MVC模式:用戶->控制器->模型->控制器->視圖->控制器->用戶


/* 配置選項 */
set_time_limit($seconds) //設置腳本最大執行時間(默認30秒),0表示不限制
ini_get($varname) //獲取一個配置選項的值
ini_set($varname, $newvalue) //為一個配置選項設置值
extension_loaded($ext_name) //檢測一個擴展是否已經加載
get_extension_funcs($ext_name) //返回模塊函數名的數組


/* 【其他】 */
version_compare(str $ver1, str $ver2 [,str $operator]) //比較版本號
  $operator表示操作符,可選:<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
  如果省略$operator,返回兩個版本號的差值。
符號@  用於抑制系統運行錯誤的報告顯示
memory_get_usage  //獲取當期內存使用情況
memory_get_peak_usage  //獲取內存使用的峰值
getrusage  //獲取CPU使用情況(Windows不可用)
uniqid([$prefix])  //獲取一個帶前綴、基於當前時間微秒數的唯一ID
highlight_string($str [,$return])  //字符串的語法高亮
  $return:設置為TRUE,高亮後的代碼不會被打印輸出,而是以字符串的形式返回。高亮成功返回TRUE,否則返回FALSE。
highlight_file($file [,$return])  //語法高亮一個文件
__halt_compiler   //中斷編譯器的執行
get_browser   //獲取浏覽器具有的功能
  get_browser ([ string $user_agent [, bool $return_array = false ]] )
  如果設置為 TRUE,該函數會返回一個 array,而不是 object
eval($code) //把字符串作為PHP代碼執行
gzcompress($str [,$level=-1])  //壓縮字符串
gzuncompress($str) //解壓縮字符串
gzencode($str [,$level=-1])  //壓縮字符串
gzdecode($str) //解壓縮字符串
ignore_user_abort($bool) //設置客戶端斷開連接時是否中斷腳本的執行

希望本文所述對大家的PHP程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved