PHP面試 必背知識(shí)點(diǎn)-1

1.PHP引用

什么是引用變量?在PHP當(dāng)中,用什么符號(hào)定義引用變量?

\color{red}{ 引用變量是用不同的名字訪問同一個(gè)變量內(nèi)容,使用\&符號(hào) }
\color{red}{ 一個(gè)變量賦值個(gè)另一個(gè)變量時(shí),不會(huì)先創(chuàng)建一個(gè)內(nèi)存空間,而是指向,當(dāng)給變量做修改時(shí)才會(huì)創(chuàng)建一個(gè)新的內(nèi)存空間 }
\color{red}{ unset一個(gè)引用 只會(huì)取消引用,不會(huì)銷毀空間 }
對(duì)象本身就是引用傳遞,實(shí)例化以后的類如 $a = new a(); $b = $a; $b和$a是引用的關(guān)系
變量自己只能主動(dòng)引用一個(gè)變量,但是變量自己可以被其他變量引用多次

<?php
$data = ['a', 'b', 'c'];
foreach ($data as $key=>$val){   //這里每次都會(huì)執(zhí)行一次賦值的操作
    $val = &$data[$key];  //  每次 $val 都會(huì)引用 一個(gè)$data[$key]  并且取消引用上一個(gè)變量
                          //變量自己不可以同時(shí)引用多個(gè)其他變量 但是變量可以被其他變量引用多次
}             
var_dump($data); //bcc

2.常量及數(shù)據(jù)類型

PHP中字符串可以使用哪三種定義方法以及各自區(qū)別是什么?

單引號(hào),雙引號(hào),heredoc和newdoc

單引號(hào)
  • 單引號(hào)不能解析變量
  • 單引號(hào)不能解析轉(zhuǎn)義字符,只能解析單引號(hào)和反斜線本身
  • 變量和變量、變量和字符串、字符串直接可以用.連接
雙引號(hào)
  • 雙引號(hào)可以解析變量,變量可以使用特殊字符和{}包含
  • 雙引號(hào)可以解析所有轉(zhuǎn)義字符
  • 也可以使用.來連接

\color{red}{ 單引號(hào)效率高于雙引號(hào) }

  • Heredoc 類似于雙引號(hào)
  • Newdoc 類似于單引號(hào)
  • 兩者都用來處理大文本的
<?php
$a = 123232321;
$Heredoc = <<<EoT
qweqweqweqwe{$a}qweqweqwe
EoT;

$Newdoc = <<<'Eot'
qweasd123$a123
Eot;

數(shù)據(jù)類型

PHP八種基本數(shù)據(jù)類型: 浮點(diǎn)型,整形,字符串,布爾值,數(shù)組,對(duì)象,null,資源類型

浮動(dòng)類型

浮點(diǎn)類型不能運(yùn)用到比較運(yùn)算中,需要比較可以 用bccomp($a,$b,2)函數(shù)

布爾類型

\color{red}{ FALSE 的七種情況}
\color{red}{ 整型0、浮點(diǎn)0.0、布爾false、空字符串、0字符串、空數(shù)組、NULL }

超全局?jǐn)?shù)組

<?php
$GLOBALS   //引用全局作用域中可用的全部變量
$_GET  // HTTP GET 變量
$_POST  //HTTP POST 變量
$_REQUEST  //HTTP Request 變量  默認(rèn)情況下包含了 $_GET,$_POST 和 $_COOKIE 的數(shù)組。 
$_SESSION  // Session 變量
$_COOKIE  //HTTP Cookies
$_SERVER //服務(wù)器和執(zhí)行環(huán)境信息
$_FILES  //HTTP 文件上傳變量
$_ENV  //環(huán)境變量
$_SERVER['SERVER_ADDR']   //服務(wù)器端IP地址
$_SERVER['REMOTE_ADDR'] //客戶端IP地址
$_SERVER['SERVER_NAME'] //服務(wù)器名稱
$_SERVER['REQUEST_TIME']  //請(qǐng)求時(shí)間
$_SERVER['QUERY_STRING']  //請(qǐng)求?后面參數(shù)
$_SERVER['HTTP_REFERER']  //上級(jí)請(qǐng)求頁面
$_SERVER['HTTP_USER_AGENT']  //頭信息里面的HTTP_USER_AGENT信息
$_SERVER['REQUSET_URI'] //比如請(qǐng)求的是index.php那么該值就是/index.php
$_SERVER['PATH_INFO']  //處理路由 /index.php/use/reg?state  use/reg就是PHTA_INFO的位置
NULL

\color{red}{ 三種情況 }
\color{red}{ 直接賦值為NULL、未定義的變量、unset銷毀的變量 }

常量
定義
\color{red}{ const、define }
\color{red}{ const更快,是語言結(jié)構(gòu),define是函數(shù) }
\color{red}{ define不能用于定義類常量,const可以 }
\color{red}{ 常量一經(jīng)定義,不能被修改,不能被刪除 }

預(yù)定義常量

<?php
__FILE__   //文件路徑名
__LINE__  //所在行號(hào)
__DIR__  //所在目錄
__FUNCTION__  //所在函數(shù)名
__CLASS__  //類名
__TRAIT__  //trait名稱
__METHOD__  //傳回類名稱與函數(shù)名稱
__NAMESPACE__  //當(dāng)前命名空間名稱

3.運(yùn)算符

PHP的錯(cuò)誤控制符

PHP支持一個(gè)錯(cuò)誤運(yùn)算符:@。當(dāng)將其放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉

運(yùn)算符優(yōu)先級(jí)
  • \color{red}{ 遞增++/遞減-- } > ! > \color{red}{ 算術(shù)運(yùn)算符 } > \color{red}{ 大小比較 } > (不)相等比較 > 引用 > 位運(yùn)算符(^) > 位運(yùn)算符(|) > \color{red}{ 邏輯與&& > 邏輯||或 > 三元?: > 賦值 } > and > xor > or
  • \color{red}{ 括號(hào) }的使用可以增加代碼\color{red}{ 可讀性,推薦}使用
遞增/遞減運(yùn)算符
  • 遞增/遞減運(yùn)算符不影響 \color{red}{ 布爾值}
  • 遞減\color{red}{ NULL}值沒有效果
  • 遞增\color{red}{ NULL}值為1
  • 遞增和遞減在前就\color{red}{ 先運(yùn)算}返回,反之就先返回,\color{red}{ 后運(yùn)算}
<?php
$name = null;
$a = ++$name; //++null 等于1 先執(zhí)行++ 在賦值
var_dump($a); //1

$name = null;
$a = $name++; //先賦值 后++
var_dump($a); //null
var_dump($name); //1
----------------------------------------
//前面為true 所以后面就不會(huì)執(zhí)行了
$a = true || $b = 3;  //$a true $b null
var_dump($a);  //true
var_dump($b);  //null

//先執(zhí)行 ||  然后$b=3  $b=3為true 所以$a = true
$a = false || $b = 3;  //$a true $b null
var_dump($a);  //true
var_dump($b);  //3

//前面為false 后面就不會(huì)執(zhí)行了
$b = false && $a == 1;  //$b false $a null

// || && and or
//先執(zhí)行 false || true   后執(zhí)行賦值操作
$a = false || true;  //$a true

//先執(zhí)行賦值  后執(zhí)行or
$b = false or true;  //$b false

---------------------------------
$a = 0;
$b = 0;
//按照優(yōu)先級(jí) > 大于 || 大于 =
//先執(zhí)行 3>0  然后執(zhí)行 ||
//因?yàn)?>0等于true 所以后面不執(zhí)行
//在執(zhí)行賦值操作 就是$a = true
if ($a = 3 > 0 || $b = 3 > 0)
{
    $a++;  //true
    $b++;  //1
    var_dump($a); //true
    var_dump($b);  //1
    echo $a. "\n";  //1
    echo $b. "\n";  //1
}

4.流程控制

PHP的遍歷數(shù)組的三種方式及各自區(qū)別

使用\color{red}{ for}循環(huán)

使用\color{red}{ foreach }循環(huán)

使用\color{red}{ while、list()、each() }組合循環(huán)

for循環(huán)\color{red}{ 只能遍歷索引數(shù)組,foreach }可以遍歷索引和關(guān)聯(lián)數(shù)組,聯(lián)合使用\color{red}{ list(),each()和while}循環(huán)同樣可以遍歷索引和關(guān)聯(lián)數(shù)組

\color{red}{ while、list()、each()組合不會(huì)reset()}

\color{red}{foreach遍歷會(huì)對(duì)數(shù)組進(jìn)行reset()}操作

PHP分支

if.....elseif

在elseif語句中只能有一個(gè)表達(dá)式為true,即在elseif語句中只能有一個(gè)語句塊被執(zhí)行,多個(gè)elseif從句是排斥關(guān)系.

使用elseif語句有一個(gè)基本原則,總把優(yōu)先范圍小的條件放在前面處理.

switch...case....

和if不同的是,switch后面的控制表達(dá)式的數(shù)據(jù)類型只能是整形、浮點(diǎn)類型或者字符串

continue語句作用到switch的作用類似于break

跳出switch外的循環(huán),可以使用continue2

switch...case會(huì)生成跳轉(zhuǎn)表,直接跳轉(zhuǎn)到對(duì)應(yīng)case,而不是一層層判斷
效率:
如果條件比一個(gè)簡單的比較要賦值得多或者在一個(gè)多次的循環(huán)中,那么用switch語句可能會(huì)快一些

5.自定義函數(shù)及內(nèi)部函數(shù)

變量的作用域

變量的作用域也稱\color{red}{ 變量的范圍 },變量的范圍即它定義的上下文背景(也是它的生效范圍).大部分的PHP變量只有一個(gè)單獨(dú)的范圍.這個(gè)單獨(dú)的范圍跨度同樣包含了include和require引入的文件.

global關(guān)鍵字

$GLOBALS\color{red}{其他超全局?jǐn)?shù)組}

靜態(tài)變量

靜態(tài)變量僅在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不會(huì)消失.

static關(guān)鍵字

  1. 僅初始化一次
  2. 初始化時(shí)需要賦值
  3. 每次執(zhí)行函數(shù)該值會(huì)保留
  4. static修飾的變量是局部的,僅在函數(shù)內(nèi)部有效
  5. 可以記錄函數(shù)的調(diào)用次數(shù),從而可以在某些條件下終止遞歸
函數(shù)的參數(shù)

默認(rèn)情況下,函數(shù)參數(shù)通過值傳遞
如果希望允許函數(shù)修改它的值,必須通過引用傳遞參數(shù)

函數(shù)的返回值

值通過使用可選的返回語句( return )返回
可以返回包括數(shù)組和對(duì)象的任意類型
返回語句會(huì)終止函數(shù)執(zhí)行,將控制權(quán)交回函數(shù)調(diào)用處
省略return , 返回值為NULL , 不可有多個(gè)返回值

函數(shù)的引用返回

從函數(shù)返回一個(gè)引用,必須在函數(shù)聲明和指派返回值給一個(gè)變量時(shí)都使用引用運(yùn)算符&

外部文件的導(dǎo)入

include/require語句包含并運(yùn)行指定文件
如果給出路徑名按照路徑來找,否則從include_path中查找
如果include_path中也沒有,則從調(diào)用腳本文件所在的目錄和當(dāng)前工作目錄下尋找
當(dāng)一個(gè)文件被包含時(shí),其中所包含的代碼繼承了include所在行的變量范圍

加載過程中未找到文件則include結(jié)構(gòu)會(huì)發(fā)出一條警告;這一點(diǎn)和require不同,后者會(huì)發(fā)出一個(gè)致命錯(cuò)誤
require在出錯(cuò)時(shí)產(chǎn)生 E_COMPILE_ERROR 級(jí)別的錯(cuò)誤
換句話說將導(dǎo)致腳本終止include只產(chǎn)生警告(E_WARNING),腳本會(huì)繼續(xù)運(yùn)行.

require(include)/require_one(include_once)唯一區(qū)別是PHP會(huì)檢查該文件是否已經(jīng)被包含過,如果是則不會(huì)再次包含.

系統(tǒng)內(nèi)置函數(shù)
<?php
//時(shí)間日期函數(shù)
date()  //格式化一個(gè)本地時(shí)間/日期
strtotime()  //將任何字符串的日期時(shí)間描述解析為 Unix 時(shí)間戳
mktime()  //取得一個(gè)日期的 Unix 時(shí)間戳
time()  //返回當(dāng)前的 Unix 時(shí)間戳
microtime()  //返回當(dāng)前 Unix 時(shí)間戳和微秒數(shù)
date_default_timezone_set()  //設(shè)定用于一個(gè)腳本中所有日期時(shí)間函數(shù)的默認(rèn)時(shí)區(qū)

//IP處理函數(shù)
ip2long() //將 IPV4 的字符串互聯(lián)網(wǎng)協(xié)議轉(zhuǎn)換成長整型數(shù)字
long2ip() //將長整型轉(zhuǎn)化為字符串形式帶點(diǎn)的互聯(lián)網(wǎng)標(biāo)準(zhǔn)格式地址(IPV4)
    
//打印處理
print()  //輸出字符串
printf() //輸出格式化字符串
print_r() //打印關(guān)于變量的易于理解的信息。
echo //輸出一個(gè)或多個(gè)字符串
sprintf() //函數(shù)把格式化的字符串寫入變量中。
var_dump() //打印變量的相關(guān)信息
var_export() //輸出或返回一個(gè)變量的字符串表示
//序列化及反序列化函數(shù)
serialize() //序列化
unserialize()  //反序列化函數(shù)
//字符串處理函數(shù)
implode() //將一個(gè)一維數(shù)組的值轉(zhuǎn)化為字符串
explode() //使用一個(gè)字符串分割另一個(gè)字符串
join() //別名 implode()
strrev() //反轉(zhuǎn)字符串
trim() //去除字符串首尾處的空白字符(或者其他字符)
ltrim() //刪除字符串開頭的空白字符(或其他字符)
rtrim() //刪除字符串末端的空白字符(或者其他字符)
strstr() //查找字符串的首次出現(xiàn)
number_format() //以千位分隔符方式格式化一個(gè)數(shù)字
//數(shù)組處理函數(shù)
array_keys() //返回?cái)?shù)組中部分的或所有的鍵名
array_values() //返回?cái)?shù)組中所有的值
array_diff() //計(jì)算數(shù)組的差集
array_intersect() //計(jì)算數(shù)組的交集
array_merge() //合并一個(gè)或多個(gè)數(shù)組
array_shift() //將數(shù)組開頭的單元移出數(shù)組
array_unshift() //在數(shù)組開頭插入一個(gè)或多個(gè)單元
array_pop() //彈出數(shù)組最后一個(gè)單元(出棧)
array_push() //將一個(gè)或多個(gè)單元壓入數(shù)組的末尾(入棧)
sort() //對(duì)數(shù)組排序
<?php
$var1 = 5;
$var2 = 10;
function foo(&$my_var){
    global $var1;
    $var1 += 2;
    $var2 = 4;
    $my_var += 3;
    return $var2;
}
$my_var = 5;
echo foo($my_var). "\n"; //4
echo $my_var. "\n"; //8
echo $var1; //7
echo $var2; //10
$bar = 'foo';
$my_var = 10;
echo $bar($my_var). "\n"; //4
正則表達(dá)式

正則表達(dá)式的作用:分割、查找、匹配、替換字符串
分隔符: 正斜線(/)、hash符號(hào)(#)以及取反符號(hào)(~)
通用原子 : \d、\D、\w、\W、\s、\S
元字符: . * ? ^ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符: i m e s U x A D u

<?php
//后向引用
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>';
preg_replace($pattern,'\\1',$str);
//貪婪模式
$str = '<b>abc</b><b>bcd</b>';
$pattern = '/<b>.*?<\/b>/';   //.* 是貪婪模式(默認(rèn)匹配的是<b>到最后的</b>   .*?   是匹配的 <b></b> 里面的值)
preg_replace($pattern,'\\1',$str);
//正則表達(dá)式PCRE函數(shù):
preg_match() //執(zhí)行匹配正則表達(dá)式
preg_match_all() //執(zhí)行一個(gè)全局正則表達(dá)式匹配
preg_replace() //執(zhí)行一個(gè)正則表達(dá)式的搜索和替換
preg_split() //通過一個(gè)正則表達(dá)式分隔字符串

中文匹配:UTF-8漢字編碼范圍是0x4e00-0x9fa5 , 在ANSI(gb2312)環(huán)境下, 0xb0-0xf7 , 0xa1-0xfe

UTF-8要使用u模式修正符使模式字符串被當(dāng)初UTF-8,在ANSI(gb2312)環(huán)境下,要使用chr將Ascii碼轉(zhuǎn)換為字符

正則表達(dá)式解題方法
先寫出一個(gè)要匹配的字符串
自左向右的順序使用正則表達(dá)式的原子和元字符進(jìn)行拼接
最終加入模式修正符
不可死記硬背模式

文件及目錄處理
fopen()函數(shù) 打開文件或者 URL
fopen() 中 mode 的可能值列表

mode 說明
'r' 只讀方式打開,將文件指針指向文件頭。
'r+' 讀寫方式打開,將文件指針指向文件頭。
'w' 寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
'w+' 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
'a' 寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
'a+' 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
'x' 創(chuàng)建并以寫入方式打開,將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級(jí)別的錯(cuò)誤信息。如果文件不存在則嘗試創(chuàng)建之。這和給 底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL O_CREAT 標(biāo)記是等價(jià)的。
'x+' 創(chuàng)建并以讀寫方式打開,其他的行為和 'x' 一樣。

b 打開一個(gè)二進(jìn)制文件
t windows 文本的轉(zhuǎn)換標(biāo)記

<?php
//寫入函數(shù)
fwrite()  //寫入文件(可安全用于二進(jìn)制文件)
fputs() // fwrite() 的別名
//讀取函數(shù)
fread() //讀取文件(可安全用于二進(jìn)制文件)
fgets() //從文件指針中讀取一行
fgetc() //從文件指針中讀取字符
//關(guān)閉文件函數(shù)
fclose()
//不需要fopen()打開的函數(shù)
file_get_contents() //將整個(gè)文件讀入一個(gè)字符串
file_put_contents() //將一個(gè)字符串寫入文件
//其他讀取函數(shù)
file() //把整個(gè)文件讀入一個(gè)數(shù)組中
readfile() //輸出文件
訪問遠(yuǎn)程文件

開啟allow_url_fopen , HTTP協(xié)議連接只能使用只讀,FTP協(xié)議可以使用只讀或者只寫

目錄操作函數(shù)

<?php
//名稱相關(guān):
basename() //返回路徑中的文件名部分
dirname() //返回路徑中的目錄部分
pathinfo() //返回文件路徑的信息
//目錄讀取:
opendir() //打開目錄句柄
readdir() //從目錄句柄中讀取條目
closedir() //關(guān)閉目錄句柄
rewinddir() //倒回目錄句柄
//目錄刪除:
rmdir() //刪除目錄  嘗試刪除 dirname 所指定的目錄。 該目錄必須是空的,而且要有相應(yīng)的權(quán)限。 失敗時(shí)會(huì)產(chǎn)生一個(gè) E_WARNING 級(jí)別的錯(cuò)誤。
//目錄創(chuàng)建:
mkdir()  //新建目錄
filesize() //文件大小

//目錄大小:
disk_free_space()  //返回目錄中的可用空間
disk_total_space() //返回一個(gè)目錄的磁盤總大小

copy() //文件拷貝
unlink() //刪除文件
filetype()  //文件類型
rename()  //重命名文件或者目錄
ftruncate()  //文件截取
//文件屬性 :   
file_exists() //檢查文件或目錄是否存在
is_readable() //判斷給定文件名是否可讀
is_writable() //判斷給定的文件名是否可寫
is_executable() //判斷給定文件名是否可執(zhí)行
filectime() //取得文件的 inode 修改時(shí)間
fileatime() //取得文件的上次訪問時(shí)間
filemtime() //取得文件修改時(shí)間    

flock() //文件鎖
//文件指針 :
ftell() //返回文件指針讀/寫的位置
fseek() //在文件指針中定位
rewind() //倒回文件指針的位置   
<?php
/**
 *  打開文件
 *  將文件的內(nèi)容讀取出來,在開頭加入Hello World
 *  將拼接好的字符串寫回到文件當(dāng)中
 */
$file = './hello.txt';
$handle = fopen($file,'r');
$content = fread($handle,filesize($file));
$content = 'Hello World'.$content;
fclose($handle);
$handle = fopen($file,'w');
fwrite($handle,$content);
fclose($handle);
<?php
/**
 * 打開目錄 讀取目錄當(dāng)中的文件
 * 如果文件類型是目錄,繼續(xù)打開目錄
 * 讀取子目錄的文件
 * 如果文件類型是文件,輸出文件名稱
 * 關(guān)閉目錄
 */

$dir = './test';
function loopDir($dir){
    $handle = opendir($dir);
    while (false!==($file = readdir($handle))) {
        if($file != '.' && $file != '..'){
            echo $file . "\n";
            if(filetype($dir.'/'.$file) == 'dir'){
                loopDir($dir.'/'.$file);
            }
        }
    }
}
loopDir($dir);
會(huì)話控制

cookie操作

<?php
//$name cookie名稱  value cookie值 expire cookie有效期 
//path cookie服務(wù)器路徑 domain cookie域名 secure 是否通過安全的https連接來傳輸cookie
setcookie($name,$value,$expire,$path,$domain,$secure)
//使用
$_COOKIE
//設(shè)置cookie
setcookie('name','val');
//刪除cookie
setcookie($name,'',time()-1000);

Session

<?php
session_start();
$_SESSION['name'] = 'value';
$_SESSION;
$_SESSION = [];
session_destroy(); //摧毀一個(gè)會(huì)話中所有session
session.auto_start; //是否自動(dòng)開啟session
session.cookie_domain  //存儲(chǔ)sessionid的有效域名
    
session.gc_probability = 1;  //就會(huì)有一次清除的機(jī)會(huì)
session.gc_divisor = 100;    //每訪問100次
session.gc_maxlifetime  = 1440; //超1440秒清除

session.save_handler
傳遞SessionID的問題
session_name()和session_id();

<a href="1.php?<?php echo session_name().'='.session_id();?>">下個(gè)頁面值</a>

<a href="1.php?<?php echo SID;?>">下個(gè)頁面值</a>

使用SID必須開啟session_start();

Session存儲(chǔ)

session_set_save_handler()

MySQL,Memcache,Redis等

面向?qū)ο?/h1>

PHP類權(quán)限控制修飾符

public、protected、private

面向?qū)ο蟮睦^承

單一繼承

方法重寫

面向?qū)ο蟮亩鄳B(tài)

抽象類的定義

接口的定義

魔術(shù)方法

<?php
__construct()//,類的構(gòu)造函數(shù)
__destruct()//,類的析構(gòu)函數(shù)
__call()//,在對(duì)象中調(diào)用一個(gè)不可訪問方法時(shí)調(diào)用
__callStatic()//,用靜態(tài)方式中調(diào)用一個(gè)不可訪問方法時(shí)調(diào)用
__get()//,獲得一個(gè)類的成員變量時(shí)調(diào)用
__set()//,設(shè)置一個(gè)類的成員變量時(shí)調(diào)用
__isset()//,當(dāng)對(duì)不可訪問屬性調(diào)用isset()或empty()時(shí)調(diào)用
__unset()//,當(dāng)對(duì)不可訪問屬性調(diào)用unset()時(shí)被調(diào)用。
__sleep()//,執(zhí)行serialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
__wakeup()//,執(zhí)行unserialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
__toString()//,類被當(dāng)成字符串時(shí)的回應(yīng)方法
__invoke()//,調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)的回應(yīng)方法
__set_state()//,調(diào)用var_export()導(dǎo)出類時(shí),此靜態(tài)方法會(huì)被調(diào)用。
__clone()//,當(dāng)對(duì)象復(fù)制完成時(shí)調(diào)用
__autoload()//,嘗試加載未定義的類
__debugInfo()//,打印所需調(diào)試信息

設(shè)計(jì)模式

常見設(shè)計(jì)模式 : 工廠模式、單例模式、注冊(cè)樹模式、適配器模式、觀察者模式和策略模式

網(wǎng)絡(luò)協(xié)議

HTTP協(xié)議狀態(tài)碼

五類響應(yīng) : 1XX(信息類,接收請(qǐng)求正在處理)、2XX(成功狀態(tài)碼,請(qǐng)求正常處理完畢)、3XX(重定向,需要進(jìn)行附加操作已完成請(qǐng)求)、4XX(客戶端錯(cuò)誤,服務(wù)器無法處理請(qǐng)求)、5XX(服務(wù)器錯(cuò)誤,服務(wù)器處理請(qǐng)求出錯(cuò)了)

常見狀態(tài)碼:

2開頭 (請(qǐng)求成功)表示成功處理了請(qǐng)求的狀態(tài)代碼。
200 (成功) 服務(wù)器已成功處理了請(qǐng)求。 通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁。
201 (已創(chuàng)建) 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。
202 (已接受) 服務(wù)器已接受請(qǐng)求,但尚未處理。
203 (非授權(quán)信息) 服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來自另一來源。
204 (無內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容。
205 (重置內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容。
206 (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請(qǐng)求。
3開頭 (請(qǐng)求被重定向)表示要完成請(qǐng)求,需要進(jìn)一步操作。 通常,這些狀態(tài)代碼用來重定向。
300 (多種選擇) 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作。 服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作,或提供操作列表供請(qǐng)求者選擇。
301 (永久移動(dòng)) 請(qǐng)求的網(wǎng)頁已永久移動(dòng)到新位置。 服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
302 (臨時(shí)移動(dòng)) 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
303 (查看其他位置) 請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來檢索響應(yīng)時(shí),服務(wù)器返回此代碼。
304 (未修改) 自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁未修改過。 服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁內(nèi)容。
305 (使用代理) 請(qǐng)求者只能使用代理訪問請(qǐng)求的網(wǎng)頁。 如果服務(wù)器返回此響應(yīng),還表示請(qǐng)求者應(yīng)使用代理。
307 (臨時(shí)重定向) 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
4開頭 (請(qǐng)求錯(cuò)誤)這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
400 (錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語法。
401 (未授權(quán)) 請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
403 (禁止) 服務(wù)器拒絕請(qǐng)求。
404 (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁。
405 (方法禁用) 禁用請(qǐng)求中指定的方法。
406 (不接受) 無法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁。
407 (需要代理授權(quán)) 此狀態(tài)代碼與 401(未授權(quán))類似,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理。
408 (請(qǐng)求超時(shí)) 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)。
409 (沖突) 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。 服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。
410 (已刪除) 如果請(qǐng)求的資源已永久刪除,服務(wù)器就會(huì)返回此響應(yīng)。
411 (需要有效長度) 服務(wù)器不接受不含有效內(nèi)容長度標(biāo)頭字段的請(qǐng)求。
412 (未滿足前提條件) 服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件。
413 (請(qǐng)求實(shí)體過大) 服務(wù)器無法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過大,超出服務(wù)器的處理能力。
414 (請(qǐng)求的 URI 過長) 請(qǐng)求的 URI(通常為網(wǎng)址)過長,服務(wù)器無法處理。
415 (不支持的媒體類型) 請(qǐng)求的格式不受請(qǐng)求頁面的支持。
416 (請(qǐng)求范圍不符合要求) 如果頁面無法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼。
417 (未滿足期望值) 服務(wù)器未滿足"期望"請(qǐng)求標(biāo)頭字段的要求。

5開頭(服務(wù)器錯(cuò)誤)這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。 這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無法完成請(qǐng)求。
501 (尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能。 例如,服務(wù)器無法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼。
502 (錯(cuò)誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)。
503 (服務(wù)不可用) 服務(wù)器目前無法使用(由于超載或停機(jī)維護(hù))。 通常,這只是暫時(shí)狀態(tài)。
504 (網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時(shí)從上游服務(wù)器收到請(qǐng)求。
505 (HTTP 版本不受支持) 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本。

OSI七層模型

物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層
第一層 : 物理層
建立、維護(hù)、斷開物理連接
第二層 : 數(shù)據(jù)鏈路層
建立邏輯連接、進(jìn)行硬件地址尋址、差錯(cuò)校驗(yàn)等功能
第三層:網(wǎng)絡(luò)層
進(jìn)行邏輯地址尋址,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇
第四層:傳輸層
定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn)
協(xié)議有 : TCP UDP , 數(shù)據(jù)包一旦離開網(wǎng)卡即進(jìn)入網(wǎng)絡(luò)傳輸層
第五層 : 會(huì)話層
建立、管理、終止會(huì)話
第六層 : 表示層
數(shù)據(jù)的表示、安全、壓縮
第七層 : 應(yīng)用層
網(wǎng)絡(luò)服務(wù)與最終用戶的一個(gè)接口
協(xié)議有 : HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

HTTP協(xié)議的工作特點(diǎn)和工作原理
工作特點(diǎn)
基于B/S模式
通信開銷小、簡單快速、傳輸成本低
使用靈活、可使用超文本傳輸協(xié)議
節(jié)省傳輸時(shí)間
無狀態(tài)

工作原理
客戶端發(fā)送請(qǐng)求給服務(wù)器,創(chuàng)建一個(gè)TCP連接,指定端口號(hào),默認(rèn)80,連接到服務(wù)器,服務(wù)器監(jiān)聽瀏覽器請(qǐng)求,一旦監(jiān)聽到客戶端請(qǐng)求,分析請(qǐng)求類型后,服務(wù)器會(huì)向客戶端返回狀態(tài)信息和數(shù)據(jù)內(nèi)容

HTTP協(xié)議常見請(qǐng)求/響應(yīng)頭
Content-Type、Accept、Origin、Cookie、Cache-Control、User-Agent、Referrer、X-Forwarded-For、Access-Control-Allow-Origin、Last-Modified
HTTP協(xié)議的請(qǐng)求方法
OPTIONS:返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法。也可以利用向Web服務(wù)器發(fā)送’*’的請(qǐng)求來測試服務(wù)器的功能性。
HEAD:向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。
GET:向特定的資源發(fā)出請(qǐng)求。
POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。
PUT:向指定資源位置上傳其最新內(nèi)容。
DELETE:請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源。
TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測試或診斷。
CONNECT:HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。

HTTPS的工作原理
HTTPS是一種基于SSL/TLS的HTTP協(xié)議,所有的HTTP數(shù)據(jù)都是在SSL/TLS協(xié)議封裝之上傳輸?shù)?br> HTTPS協(xié)議在HTTP協(xié)議的基礎(chǔ)上,添加了SSL/TLS握手以及數(shù)據(jù)加密傳輸,也屬于應(yīng)用層協(xié)議

常見網(wǎng)絡(luò)協(xié)議含義及端口
FTP、Telnet(遠(yuǎn)程登陸)、SMTP(定義了簡單文件傳輸協(xié)議)、POP3(接收郵件)、HTTP、DNS(域名解析服務(wù)端口53)

開發(fā)環(huán)境及配置

版本控制軟件
集中式和分布式
集中 CVS和SVN
分布 GIT

Nginx+PHP-FPM
CGI 為了聯(lián)系webserver和PHP解析器的一個(gè)協(xié)議 當(dāng)中就是一個(gè)橋梁
FastCGI CGI改良版本出現(xiàn)的 一次處理多個(gè)請(qǐng)求
PHP-FPM 是 FastCGI 進(jìn)程管理器

PHP常見配置項(xiàng)
<?php
register_globals  //注冊(cè)全局變量  建議關(guān)閉
allow_url_fopen //運(yùn)行遠(yuǎn)程文件打開
allow_url_include //允許遠(yuǎn)程文件包含
date.timezone //設(shè)置時(shí)區(qū)
display_errors //錯(cuò)誤日志
error_reporting //錯(cuò)誤級(jí)別
safe_mode //安全模式
upload_max_filesize //上傳文件大小限制
max_file_uploads //上傳文件個(gè)數(shù)
post_max_size //POST 數(shù)據(jù)所允許的最大大小
JavaScript和jQuery基礎(chǔ)考點(diǎn)

變量的定義
變量必須以字母開頭
變量能以$和_符號(hào)開頭
變量名稱對(duì)大小寫敏感
使用 var 關(guān)鍵詞來聲明變量
可以在一條語句中聲明很多變量
未使用值來聲明的變量,值是undefined
如果重新聲明 JavaScript 變量, 該變量的值不會(huì)丟失

var a = 1;
var a;    此時(shí)變量a還是1

數(shù)據(jù)類型
字符串、數(shù)字、布爾、數(shù)組、對(duì)象、Null、Undefined
JavaScript變量均為對(duì)象.當(dāng)您聲明一個(gè)變量時(shí),就創(chuàng)建了一個(gè)新的對(duì)象.

創(chuàng)建對(duì)象
new Object()
使用對(duì)象構(gòu)造器
使用JSON對(duì)象
函數(shù)
定義方法
無默認(rèn)值
函數(shù)內(nèi)部聲明的變量(使用var)是局部變量
在函數(shù)外聲明的變量是全局變量,所有腳本和函數(shù)都能訪問它
運(yùn)算符
+號(hào)可以用來字符串的拼接
流程控制
else if必須分開寫
JavaScript內(nèi)置對(duì)象
Number

var pi=3.14;
var myNum=new Number(value);
var myNum=Number(value);

String

var str=' This is String';
var str= new String(s);
var str=String(s);

方法和屬性

String 對(duì)象屬性

屬性 描述
constructor 對(duì)創(chuàng)建該對(duì)象的函數(shù)的引用
length 字符串的長度
prototype 允許您向?qū)ο筇砑訉傩院头椒?/td>

String 對(duì)象方法

方法 描述
anchor() 創(chuàng)建 HTML 錨。
big() 用大號(hào)字體顯示字符串。
blink() 顯示閃動(dòng)字符串。
bold() 使用粗體顯示字符串。
charAt() 返回在指定位置的字符。
charCodeAt() 返回在指定的位置的字符的 Unicode 編碼。
concat() 連接字符串。
fixed() 以打字機(jī)文本顯示字符串。
fontcolor() 使用指定的顏色來顯示字符串。
fontsize() 使用指定的尺寸來顯示字符串。
fromCharCode() 從字符編碼創(chuàng)建一個(gè)字符串。
indexOf() 檢索字符串。
italics() 使用斜體顯示字符串。
lastIndexOf() 從后向前搜索字符串。
link() 將字符串顯示為鏈接。
localeCompare() 用本地特定的順序來比較兩個(gè)字符串。
match() 找到一個(gè)或多個(gè)正則表達(dá)式的匹配。
replace() 替換與正則表達(dá)式匹配的子串。
search() 檢索與正則表達(dá)式相匹配的值。
slice() 提取字符串的片斷,并在新的字符串中返回被提取的部分。
small() 使用小字號(hào)來顯示字符串。
split() 把字符串分割為字符串?dāng)?shù)組。
strike() 使用刪除線來顯示字符串。
sub() 把字符串顯示為下標(biāo)。
substr() 從起始索引號(hào)提取字符串中指定數(shù)目的字符。
substring() 提取字符串中兩個(gè)指定的索引號(hào)之間的字符。
sup() 把字符串顯示為上標(biāo)。
toLocaleLowerCase() 把字符串轉(zhuǎn)換為小寫。
toLocaleUpperCase() 把字符串轉(zhuǎn)換為大寫。
toLowerCase() 把字符串轉(zhuǎn)換為小寫。
toUpperCase() 把字符串轉(zhuǎn)換為大寫。
toSource() 代表對(duì)象的源代碼。
toString() 返回字符串。
valueOf() 返回某個(gè)字符串對(duì)象的原始值。

Boolean 布爾類型

var bol=true
var bol=new Boolean(value);
var bol=Boolean(value);

方法和屬性

Boolean 對(duì)象屬性

屬性 描述
constructor 返回對(duì)創(chuàng)建此對(duì)象的 Boolean 函數(shù)的引用
prototype 使您有能力向?qū)ο筇砑訉傩院头椒ā?/td>

Boolean 對(duì)象方法

方法 描述
toSource() 返回該對(duì)象的源代碼。
toString() 把邏輯值轉(zhuǎn)換為字符串,并返回結(jié)果。
valueOf() 返回 Boolean 對(duì)象的原始值。

Array

var arr=new Array();
var arr=new Array(size);
var arr=new Array(e1,e2,e3,... en);

數(shù)組沒有關(guān)聯(lián)數(shù)組 下標(biāo)不可以為字符串 如果想用 用json對(duì)象
方法和屬性

Date
var date=new Date();
Math
var pi_value=Math.PI;
var sqrt_value=Math.sqrt(15);

RegExp 正則表達(dá)式
/pattern/attributes
new RegExp(pattern,attributes);
方法屬性
Window對(duì)象
Window、Navigator、Screen、History、Location
DOM對(duì)象
Document、Element、Attr、Event
jQuery
jQuery選擇器
基本選擇器、層次選擇器、過濾選擇器、可見性過濾選擇器、屬性過濾選擇器、子元素過濾選擇器、表單對(duì)象屬性過濾選擇器
jQuery事件
("button").click(function(){..some code...}) jQuery效果("p").show()
jQuery DOM操作
屬性、值、節(jié)點(diǎn)、CSS、尺寸
面試題
JavaScript中為id是test的元素設(shè)置樣式為good

document.getElementById('test').calssName = 'good';

要求使用jQuery事件寫在頁面元素加載完成之后,動(dòng)態(tài)綁定click事件到btnOK元素

$(function(){
    $(".btnOK").click(function(){

    })
})
AJAX基礎(chǔ)內(nèi)容

AJAX基礎(chǔ)概念

Asynchronous JavaScript and XML

通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX可以使網(wǎng)頁實(shí)現(xiàn)異步更新

AJAX工作原理

XMLHttpRequest是AJAX的基礎(chǔ)

XMLHttpRequest用于在后臺(tái)與服務(wù)器交換數(shù)據(jù)

XMLHttpRequest對(duì)象請(qǐng)求
open(method,url,async)
send(string)
XMLHttpRequest對(duì)象響應(yīng)
responseText
responseXML
onreadystatechange
readyState : 0(請(qǐng)求未初始化),1(服務(wù)器連接已建立),2(請(qǐng)求已接收),3(請(qǐng)求處理中),4(請(qǐng)求已完成,且響應(yīng)已就緒)
status : 200 , 400
常用方法
$(ele).load()
$.ajax()
$.get()
$.post()
$.getJSON()
$.getScript()

Linux基礎(chǔ)

系統(tǒng)安全
sudo 以系統(tǒng)管理組的身份執(zhí)行指令
su 用于變更為其他使用者的身份
chmod 用來變更文件或目錄的權(quán)限
setfacl 用來在命令行里設(shè)置ACL(訪問控制列表)
進(jìn)程管理
w
top
ps
kill
pkill
pstree
killall
用戶管理
id
usermod
useradd
groupadd
userdel
文件系統(tǒng)
mount
umount
fsck
df
du
系統(tǒng)關(guān)機(jī)和重啟
shutdown
reboot
網(wǎng)絡(luò)應(yīng)用
curl
telnet
mail
elinks
網(wǎng)絡(luò)測試
ping
netstat
host
網(wǎng)絡(luò)配置
hostname
ifconfig
常用工具
ssh
screen
clear
who
date
軟件包管理
yum
rpm
apt-get
文件查找和比較
locate
find
文件內(nèi)容查看
head
tail
less
more
文件處理
touch
unlink
rename
ln
cat
目錄操作
cd
mv
rm
pwd
tree
cp
ls
文件權(quán)限屬性
setfacl
chmod
chown
chgrp
壓縮/解壓
bzip2/bunzip2
gzip/gunzip
zip/unzip
tar
文件傳輸
ftp
scp

Linux系統(tǒng)定時(shí)任務(wù)
crontab命令
crontab -e

          • 命令 (分 時(shí) 日 月 周)

** at命令 一次性去執(zhí)行 **
#at 2:00 tomorrow //明天2點(diǎn)去執(zhí)行
at>home/Jason/do_job
at>Ctrl+D

shell基礎(chǔ)

腳本執(zhí)行方式
賦予權(quán)限,直接執(zhí)行,例 : chmod +x test.sh ; ./test.sh
調(diào)用解釋器使得腳本執(zhí)行,例 : bash、csh、ash、bsh、ksh等等
使用source命令,例: source test.sh
編寫基礎(chǔ)
開頭用#!指定腳本解釋器,例如:#!/bin/sh
編寫具體功能

MySQL數(shù)據(jù)庫基礎(chǔ)

mysql數(shù)據(jù)類型

整數(shù)類型

TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
屬性 : UNSIGNED
長度 : 可以為整數(shù)類型指定寬度,例如 : INT(11) 、 對(duì)大多數(shù)應(yīng)用是沒有意義的,它不會(huì)限制值得合法范圍,只會(huì)影響顯示字符的個(gè)數(shù). 寬度
zerofill 設(shè)置零填充 int(3) 012 int(5) 00012

小數(shù)類型

FLOAT、DOUBLE、DECIMAL
DECIMAL可存儲(chǔ)比BIGINT還大的整數(shù);可以用于存儲(chǔ)精確的小數(shù)
FLOAT和DOUBLE類型支持使用標(biāo)準(zhǔn)的浮點(diǎn)進(jìn)行近似計(jì)算

字符串類型

VARCHAR、CHAR、TEXT、BLOB
VARCHAR類型用于存儲(chǔ)可變長度字符串,它比定長類型更節(jié)省空間
VARCHAR使用1或2個(gè)額外字節(jié)記錄字符串的長度,列長度小于255字節(jié),使用1個(gè)字節(jié)表示,否則用2個(gè)
VARCHAR長度,如果存儲(chǔ)內(nèi)容超出指定長度,會(huì)被截?cái)?/p>

CHAR是定長的,根據(jù)定義的字符串長度分配足夠的空間
CHAR會(huì)根據(jù)需要采用空格進(jìn)行填充以方便比較
CHAR適合存儲(chǔ)很短的字符串,或者所有值都接近同一個(gè)長度
CHAR長度,超度設(shè)定的長度,會(huì)被截?cái)?/p>

對(duì)于經(jīng)常變更的數(shù)據(jù),char比varchar更好,char不容易產(chǎn)生碎片
對(duì)于非常短的列,char比varchar在存儲(chǔ)空間上更有效率
只分配真正需要的空間,更長的列會(huì)消耗更多的內(nèi)存

盡量避免使用BLOB/TEXT類型,查詢會(huì)使用臨時(shí)表,導(dǎo)致嚴(yán)重的性能開銷.

枚舉

有時(shí)可以使用枚舉代替常用的字符串類型
把不重復(fù)的集合存儲(chǔ)成一個(gè)預(yù)定義的集合
非常緊湊,把列表值壓縮到一個(gè)或兩個(gè)字節(jié)
內(nèi)部存儲(chǔ)的是整數(shù)
盡量避免使用數(shù)字作為ENUM枚舉的常量,易混亂
排序是按照內(nèi)部存儲(chǔ)的整數(shù)進(jìn)行排序
枚舉表會(huì)使表大小大大減小

日期和時(shí)間類型

盡量使用TIMESTAMP,比DATETIME空間效率高
用整數(shù)保存時(shí)間戳的格式通常不方便處理
如果需要存儲(chǔ)微妙,可以使用bigint存儲(chǔ)

列屬性

auto_increment 會(huì)在新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字
default 約束用于向列中插入默認(rèn)值
not null 不能為空
zerofill 零填充

mysql基礎(chǔ)操作

常見操作

MySQL的連接和關(guān)閉 : mysql -u -p -h -P
-u 用戶名 -p 密碼 -h 指定主機(jī) -P端口
其他 : \G 打印結(jié)果垂直顯示 、\c 取消當(dāng)前mysql命令、\q 退出mysql、\s 顯示mysql服務(wù)器狀態(tài)、\h 幫助信息、\d 改變執(zhí)行符

InnoDB表引擎

支持崩潰后的安全恢復(fù),支持行級(jí)鎖,支持外鍵

MyISAM表引擎

5.1版本前,MyISAM是默認(rèn)存儲(chǔ)引擎
擁有全文索引,壓縮,空間函數(shù)
不支持事務(wù)的行級(jí)鎖,不支持崩潰后的安全恢復(fù)
表存儲(chǔ)在兩個(gè)文件,MYD和MYI

MySQL鎖機(jī)制

基礎(chǔ)概念

表鎖是日常開發(fā)當(dāng)中常見的問題,因此也是面試當(dāng)中最常見的考察點(diǎn),當(dāng)多個(gè)查詢同一時(shí)刻進(jìn)行數(shù)據(jù)修改時(shí),就會(huì)產(chǎn)生并發(fā)控制的問題
共享鎖和排它鎖,其實(shí)就是讀鎖和寫鎖
讀鎖
共享的,不堵塞,多個(gè)用戶可以同時(shí)讀一個(gè)資源,互不干擾
寫鎖
排他的,一個(gè)寫鎖會(huì)阻塞其他的寫鎖和讀鎖,這樣可以只允許一個(gè)人進(jìn)行寫入,防止其他用戶讀取正在寫入的資源
鎖粒度
表鎖,系統(tǒng)性能開銷最小,會(huì)鎖定整張表,MyISAM使用表鎖
行鎖,最大程度地支持并發(fā)處理,但是也帶來了最大的鎖開銷,InnoDB實(shí)現(xiàn)行級(jí)鎖
MySQL事務(wù)處理
MySQL提供事務(wù)處理的表引擎,InnoDB
4種隔離級(jí)別

MySQL創(chuàng)建高性能索引

索引的基礎(chǔ)

索引類似于書籍的目錄,要想找到一本書的某個(gè)特定主題,需要先查找書的目錄,定位對(duì)應(yīng)的頁碼
存儲(chǔ)引擎使用類似的方式進(jìn)行數(shù)據(jù)查詢,先去索引當(dāng)中找到對(duì)應(yīng)的值,然后根據(jù)匹配的索引找到對(duì)應(yīng)的數(shù)據(jù)行
索引對(duì)性能的影響
大大減少服務(wù)器需要掃描的數(shù)據(jù)量
幫助服務(wù)器避免排序和臨時(shí)表
將隨機(jī)I/O變順序I/O
大大提高查詢速度,降低寫的速度,占用磁盤
索引的使用場景
對(duì)于非常小的表,大部分情況下全表掃描效率更高
中到大型表,索引非常有效
特大型的表,建立和使用索引的代價(jià)將隨之增大,可以使用分區(qū)技術(shù)來解決

索引的類型
  1. 索引有很多種類型,都是實(shí)現(xiàn)在存儲(chǔ)引擎層的
  2. 普通索引 : 最基本的索引,沒有任何約束限制
  3. 唯一索引 : 與普通索引類似,但是具有唯一性約束
  4. 主鍵索引 : 特殊的唯一索引,不允許有空值
    唯一索引和主鍵索引的區(qū)別
    1.一個(gè)表只能有一個(gè)主鍵索引,可以有多個(gè)唯一索引
    2.主鍵索引一定是唯一索引,唯一索引不是主鍵索引
    3.主鍵可以與外鍵構(gòu)成參照完整性約束,防止數(shù)據(jù)不一致
  5. 組合索引 : 將多個(gè)列組合在一起創(chuàng)建索引,可以覆蓋多個(gè)列
  6. 外鍵索引 : 只有InnoDB類型的表才可以使用外鍵索引,保證數(shù)據(jù)的一致性,完整性和實(shí)現(xiàn)級(jí)聯(lián)操作
  7. 全文索引 : MySQL自帶的全文索引只能用于MyISAM,并且只能對(duì)英文進(jìn)行全文檢索

原則

  1. 最適合索引的列是出現(xiàn)在where子局中的列,或連接子句的列而不是出現(xiàn)在select關(guān)鍵字后的列
  2. 索引列的基數(shù)越大,索引的效果越好
  3. 對(duì)字符串進(jìn)行索引,應(yīng)該制定一個(gè)前綴長度,可以節(jié)省大量的索引空間
  4. 根據(jù)情況創(chuàng)建復(fù)合索引,復(fù)合索引可以提高查詢效率
  5. 避免創(chuàng)建過多索引,索引會(huì)額外占用磁盤空間,降低寫操作效率
  6. 主鍵盡可能選擇較短的數(shù)據(jù)類型,可以有效減少索引的磁盤占用提高查詢效率
MySQL索引的注意事項(xiàng)

注意
1.復(fù)合索引遵循前綴原則
KEY(a,b,c)
索引可以生效
where a=1 and b=2 and c=3
where a=1 and b=2
where a=1

索引不生效
where b=2 and c=3
where a=1 and c=3

2.like查詢,%不能再前,可以使用全文索引
where name like "%wang%" 如果必須使用,則用全文索引引擎
3.column is null 可以使用索引 (判斷是否是null)
4.如果MySQL估計(jì)使用索引比全表掃描更慢,會(huì)放棄使用索引
5.如果or前面的條件中的列有索引,后面的沒有,索引都不會(huì)被用到
6.列類型是字符串,查詢時(shí)一定要給值加引號(hào),否則索引失效

MySQL的SQL語句編寫

面試題

有A(id,sex,par,c1,c2),B(id,age,c1,c2)兩張表,其中A.id與B.id關(guān)聯(lián),現(xiàn)在要求寫出一條SQL語句,將B中age>50的記錄的c1,c2更新到A表中統(tǒng)一記錄中的c1,c2字段中

update A,B set A.c1 = B.c1,A.c2 = B.c2 where A.id = B.id and B.age > 50;
update A inner join B on A.id = B.id set A.c1 = B.c1,A.c2 = B.c2 where B.age > 50

關(guān)聯(lián)更新

UPDATE A,B SET A.c1 = B.c1,A.c2=B.c2 WHERE A.id = B.id
UPDATE A INNER JOIN B ON A.id=B.id SET A.c1=B.c1,A.c2=B.c2 WHERE.....

MySQL的關(guān)聯(lián)查詢語句

六種關(guān)聯(lián)查詢

交叉連接(CROSS JOIN),內(nèi)連接(INNER JOIN),外連接(LEFT JOIN/RIGHT JOIN),聯(lián)合查詢(UNION與UNION ALL),全連接(FULL JOIN)

交叉連接

SELECT * FROM A,B(,C)
SELECT * FROM A CROSS JOIN B (CROSS JOIN C)
沒有任何關(guān)聯(lián)條件,結(jié)果是笛卡爾積,結(jié)果集會(huì)很大,沒有意義,很少使用

內(nèi)連接

SELECT * FROM A,B WHERE A.id=B.id
SELECT * FROM A INNER JOIN B ON A.id = B.id
多表中同時(shí)符合某種條件數(shù)據(jù)記錄的集合

內(nèi)連接分為三類

等值連接 : ON A.id = B.id
不等值連接 : ON A.id > B.id
自連接 : SELECT * FROM A T1 INNER JOIN A T2 ON T1.id = T2.pid
INNER JOIN 可以縮寫為JOIN

外鏈接

左外連接 : LEFT OUTER JOIN ,以左表為主,先查詢出左表,按照ON后的關(guān)聯(lián)條件匹配右表,沒有匹配到的用NULL填充,可以簡寫成LEFT JOIN

右外連接 : RIGHT OUTER JOIN,以右表為主,先查詢出右表,按照ON后的關(guān)聯(lián)條件匹配左表,沒有匹配到的用NULL填充,可以簡寫成RIGHT JOIN

聯(lián)合查詢

SELECT * FROM A UNION SELECT * FROM B UNION ....

就是把多個(gè)結(jié)果集集中在一起,UNION前的結(jié)果為基準(zhǔn),需要注意的是聯(lián)合查詢的列數(shù)要相等,相同的記錄行會(huì)合并

如果使用UNION ALL , 不會(huì)合并重復(fù)的記錄行

全連接

MySQL不支持全連接

可以使用LEFT JOIN 和 UNION 和 RIGHT JOIN 聯(lián)合使用

SELECT * FROM A LEFT JOIN B ON A.id = B.id UNION

SELECT * FROM A RIGHT JOIN B ON A.id = B.id

嵌套查詢

用一條SQL語句的結(jié)果作為另外一條SQL語句的條件

SELECT * FROM A WHERE id IN (SELECT id FROM B)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,974評(píng)論 0 9
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,427評(píng)論 6 13
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,819評(píng)論 1 45
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,665評(píng)論 1 32
  • 今天看到一位朋友寫的mysql筆記總結(jié),覺得寫的很詳細(xì)很用心,這里轉(zhuǎn)載一下,供大家參考下,也希望大家能關(guān)注他原文地...
    信仰與初衷閱讀 4,834評(píng)論 0 30

友情鏈接更多精彩內(nèi)容