常用函數(shù)
var_dump() 函數(shù)返回?cái)?shù)組的數(shù)據(jù)類型和值
unset() 釋放
bool define(string $constant_name, mixed $value[, $case_sensitive = true]) 定義常量
mixed constant(string constant_name) 調(diào)用常數(shù)--第一個(gè)參數(shù)constant_name為要獲取常量的名稱,也可為存儲(chǔ)常量名的變量。如果成功則返回常量的值,失敗則提示錯(cuò)誤信息常量沒有被定義。(注:mixed表示函數(shù)返回值類型為多種不同的類型,string表示參數(shù)類型為字符串類型)
bool defined(string constants_name)判斷一個(gè)常量是否已經(jīng)定義,它只有參數(shù)constant_name,指的是要獲取常量的名稱,若存在則返回布爾類型true,否則返回布爾類型false; (注:bool表示函數(shù)返回值類型為布爾類型)
魔術(shù)方法
__set,__get,__isset,__unset,__call,__clone
字符串
trim去除一個(gè)字符串兩端空格。trim($str);
rtrim是去除一個(gè)字符串右部空格,其中的r是right的縮寫。
ltrim是去除一個(gè)字符串左部空格,其中的l是left的縮寫。
strlen()函數(shù)獲取字符串長(zhǎng)度。strlen($str);
mb_strlen()函數(shù)獲取字符串中中文長(zhǎng)度。mb_strlen($str,"UTF8")
substr(字符串變量,開始截取的位置,截取個(gè)數(shù))substr($str, 2, 4);
mb_substr(字符串變量,開始截取的位置,截取個(gè)數(shù), 網(wǎng)頁(yè)編碼)中文 ? mb_substr($str, 4, 2, 'utf8');
strpos(要處理的字符串, 要定位的字符串, 定位的起始位置[可選]) strpos($str, 'imooc');
str_replace(要查找的字符串, 要替換的字符串, 被搜索的字符串, 替換進(jìn)行計(jì)數(shù)[可選])str_replace('js', 'php', $str);
sprintf(格式, 要轉(zhuǎn)化的字符串)返回:格式化好的字符串 sprintf('%01.2f', $str)
1、這個(gè) % 符號(hào)是開始的意思,寫在最前面表示指定格式開始了。 也就是 "起始字符", 直到出現(xiàn) "轉(zhuǎn)換字符" 為止,就算格式終止。
2、跟在 % 符號(hào)后面的是 0, 是 "填空字元" ,表示如果位置空著就用0來填滿。
3、在 0 后面的是1,這個(gè) 1 是規(guī)定整個(gè)所有的字符串占位要有1位以上(小數(shù)點(diǎn)也算一個(gè)占位)。
如果把 1 改成 6,則 $result的值將為 099.90
因?yàn)?,在小?shù)點(diǎn)后面必須是兩位,99.90一共5個(gè)占位,現(xiàn)在需要6個(gè)占位,所以用0來填滿。
4、在 %01 后面的 .2 (點(diǎn)2) 就很好理解了,它的意思是,小數(shù)點(diǎn)后的數(shù)字必須占2位。 如果這時(shí)候,$str 的值為9.234,則 $result的值將為9.23.
為什么4 不見了呢? 因?yàn)樵谛?shù)點(diǎn)后面,按照上面的規(guī)定,必須且僅能占2位。 可是 $str 的值中,小數(shù)點(diǎn)后面占了3位,所以,尾數(shù)4被去掉了,只剩下 23。
5、最后,以 f "轉(zhuǎn)換字符" 結(jié)尾。
implode(分隔符[可選], 數(shù)組)返回值:把數(shù)組元素組合為一個(gè)字符串 explode(',', $str);
explode(分隔符[可選], 字符串)返回值:函數(shù)返回由字符串組成的數(shù)組 explode('-',$str);
addslashes()函數(shù)說明:用于對(duì)特殊字符加上轉(zhuǎn)義字符,返回一個(gè)字符串。返回值:一個(gè)經(jīng)過轉(zhuǎn)義后的字符串
// 1. addslashes此函數(shù)在DBMS沒有自己的轉(zhuǎn)義函數(shù)時(shí)候使用
// 2. htmlspecialchars把HTML中的幾個(gè)特殊字符轉(zhuǎn)義成HTML Entity形式
// 3. htmlentities把HTML中可以轉(zhuǎn)義的內(nèi)容轉(zhuǎn)義成HTML Entity
// 4. mysql_real_escape_string調(diào)用MySQL的庫(kù)函數(shù)對(duì)特殊字符進(jìn)行轉(zhuǎn)義
// 5. strip_tags濾掉NUL,HTML和PHP的標(biāo)簽
preg_match用于執(zhí)行一個(gè)正則匹配,常用來判斷一類字符模式是否存在。preg_match($r, $str);return bool? preg_match($p, $str, $match);
file_get_contents,可以將整個(gè)文件全部讀取到一個(gè)字符串中。file_get_contents('./test.txt');
fopen,fgets,fread等方法,fgets可以從文件指針中讀取一行,freads可以讀取指定長(zhǎng)度的字符串。
一般情況下在對(duì)文件進(jìn)行操作的時(shí)候需要先判斷文件是否存在,PHP中常用來判斷文件存在的函數(shù)有兩個(gè)is_file與file_exists.
如果只是判斷文件存在,使用file_exists就行,file_exists不僅可以判斷文件是否存在,同時(shí)也可以判斷目錄是否存在,從函數(shù)名可以看出,is_file是確切的判斷給定的路徑是否是一個(gè)文件。
is_readable與is_writeable在文件是否存在的基礎(chǔ)上,判斷文件是否可讀與可寫。
系統(tǒng)常量
(1)__FILE__ :php程序文件名。它可以幫助我們獲取當(dāng)前文件在服務(wù)器的物理位置。
(2)__LINE__ :PHP程序文件行數(shù)。它可以告訴我們,當(dāng)前代碼在第幾行。
(3)PHP_VERSION:當(dāng)前解析器的版本號(hào)。它可以告訴我們當(dāng)前PHP解析器的版本號(hào),我們可以提前知道我們的PHP代碼是否可被該P(yáng)HP解析器解析。
(4)PHP_OS:執(zhí)行當(dāng)前PHP版本的操作系統(tǒng)名稱。它可以告訴我們服務(wù)器所用的操作系統(tǒng)名稱,我們可以根據(jù)該操作系統(tǒng)優(yōu)化我們的代碼。
巴拉
Heredoc結(jié)構(gòu)形式
首先使用定界符表示字符串(<<<),接著在“<<<“之后提供一個(gè)標(biāo)識(shí)符GOD,然后是字符串,最后以提供的這個(gè)標(biāo)識(shí)符結(jié)束字符串。如圖:

在賦值符號(hào)后,輸入定界符“<<<”,接著是標(biāo)識(shí)符,你可以用你的女神作為標(biāo)識(shí)符“GOD”,如第2行,也可以使用你喜歡的狗狗,“DOG”作為標(biāo)識(shí)符,但是,結(jié)尾處的標(biāo)識(shí)符也必須是一樣的。此外,在結(jié)尾的一行,如第7行,一定要另起一行,并且此行除了“GOD”,并以“;”號(hào)結(jié)束之外,不能有任何其他字符,前后都不能有,包括空格,否則會(huì)出現(xiàn)錯(cuò)誤的哦。切記切記哦。
PHP賦值運(yùn)算符
PHP的賦值運(yùn)算符有兩種,分別是:
(1)“=”:把右邊表達(dá)式的值賦給左邊的運(yùn)算數(shù)。它將右邊表達(dá)式值復(fù)制一份,交給左邊的運(yùn)算數(shù)。換而言之,首先給左邊的運(yùn)算數(shù)申請(qǐng)了一塊內(nèi)存,然后把復(fù)制的值放到這個(gè)內(nèi)存中。
(2)“&”:引用賦值,意味著兩個(gè)變量都指向同一個(gè)數(shù)據(jù)。它將使兩個(gè)變量共享一塊內(nèi)存,如果這個(gè)內(nèi)存存儲(chǔ)的數(shù)據(jù)變了,那么兩個(gè)變量的值都會(huì)發(fā)生變化。
比較運(yùn)算符
比較運(yùn)算符主要是用于進(jìn)行比較運(yùn)算的,例如:等于、全等、不等、大于、小于。在PHP中常用的比較運(yùn)算符如下表:

三元運(yùn)算符
(“?:”)三元運(yùn)算符也是一個(gè)比較運(yùn)算符,對(duì)于表達(dá)式(expr1)?(expr2):(expr3),如果expr1的值為true,則此表達(dá)式的值為expr2,否則為expr3。
邏輯運(yùn)算符
邏輯運(yùn)算符主用是進(jìn)行邏輯運(yùn)算的,例如:邏輯與、邏輯或、邏輯異或、邏輯非等,在PHP中常用的邏輯運(yùn)算符如下表:

PHP中的字符串連接運(yùn)算符
字符串連接運(yùn)算符是為了將兩個(gè)字符串進(jìn)行連接,PHP中提供的字符串連接運(yùn)算符有:
(1)連接運(yùn)算符(“.”):它返回將右參數(shù)附加到左參數(shù)后面所得的字符串。
(2)連接賦值運(yùn)算符(“.=”):它將右邊參數(shù)附加到左邊的參數(shù)后。
PHP中的錯(cuò)誤控制運(yùn)算符
PHP中提供了一個(gè)錯(cuò)誤控制運(yùn)算符“@”,對(duì)于一些可能會(huì)在運(yùn)行過程中出錯(cuò)的表達(dá)式時(shí),我們不希望出錯(cuò)的時(shí)候給客戶顯示錯(cuò)誤信息,這樣對(duì)用戶不友好。于是,可以將@放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉;
如果激活了track_error(這個(gè)玩意在php.ini中設(shè)置)特性,表達(dá)式所產(chǎn)生的任何錯(cuò)誤信息都被存放在變量$php_errormsg中,此變量在每次出錯(cuò)時(shí)都會(huì)被覆蓋,所以如果想用它的話必須盡早檢查。
需要注意的是:錯(cuò)誤控制前綴“@”不會(huì)屏蔽解析錯(cuò)誤的信息,不能把它放在函數(shù)或類的定義之前,也不能用于條件結(jié)構(gòu)例如if和foreach等。
foreach
在PHP中foreach循環(huán)語(yǔ)句,常用于遍歷數(shù)組,一般有兩種使用方式:不取下標(biāo)、取下標(biāo)。
(1)只取值,不取下標(biāo)
foreach (數(shù)組 as 值){
//執(zhí)行的任務(wù)
}
(2)同時(shí)取下標(biāo)和值
foreach (數(shù)組 as 下標(biāo) => 值){
//執(zhí)行的任務(wù)
}
數(shù)組
$arr[0]="";
$arr= array();
$arr=array("key"=>"value");
PHP函數(shù)之可變函數(shù)
所謂可變函數(shù),即通過變量的值來調(diào)用函數(shù),因?yàn)樽兞康闹凳强勺兊?,所以可以通過改變一個(gè)變量的值來實(shí)現(xiàn)調(diào)用不同的函數(shù)。經(jīng)常會(huì)用在回調(diào)函數(shù)、函數(shù)列表,或者根據(jù)動(dòng)態(tài)參數(shù)來調(diào)用不同的函數(shù)??勺兒瘮?shù)的調(diào)用方法為變量名加括號(hào)。
function name() {
echo 'jobs';
}
$func = 'name';
$func(); //調(diào)用可變函數(shù)
可變函數(shù)也可以用在對(duì)象的方法調(diào)用上。
class book {
function getName() {
return 'bookname';
}
}
$func = 'getName';
$book = new book();
$book->$func();
類屬性
一般通過->對(duì)象操作符來訪問對(duì)象的屬性或者方法,對(duì)于靜態(tài)屬性則使用::雙冒號(hào)進(jìn)行訪問。當(dāng)在類成員方法內(nèi)部調(diào)用的時(shí)候,可以使用$this偽變量調(diào)用當(dāng)前對(duì)象的屬性。
靜態(tài)
靜態(tài)方法中,$this偽變量不允許使用??梢允褂胹elf,parent,static在內(nèi)部調(diào)用靜態(tài)方法與屬性。
對(duì)象序列化
可以通過serialize方法將對(duì)象序列化為字符串,用于存儲(chǔ)或者傳遞數(shù)據(jù),然后在需要的時(shí)候通過unserialize將字符串反序列化成對(duì)象進(jìn)行使用。
class Car {
public $name = 'car';
}
$a = new Car();
$str = serialize($a); //對(duì)象序列化成字符串
echo $str.'
';
$b = unserialize($str); //反序列化為對(duì)象
var_dump($b);
正則表達(dá)式
PCRE庫(kù)函數(shù)中,正則匹配模式使用分隔符與元字符組成,分隔符可以是非數(shù)字、非反斜線、非空格的任意字符。經(jīng)常使用的分隔符是正斜線(/)、hash符號(hào)(#) 以及取反符號(hào)(~),例如:
/foo bar/
#^[^0-9]$#
~php~
如果模式中包含分隔符,則分隔符需要使用反斜杠(\)進(jìn)行轉(zhuǎn)義。
/http:\/\//
如果模式中包含較多的分割字符,建議更換其他的字符作為分隔符,也可以采用preg_quote進(jìn)行轉(zhuǎn)義。
$p = 'http://';
$p = '/'.preg_quote($p, '/').'/';
echo $p;
分隔符后面可以使用模式修飾符,模式修飾符包括:i, m, s, x等,例如使用i修飾符可以忽略大小寫匹配:
$str = "Http://www.imooc.com/";
if (preg_match('/http/i', $str)) {
echo '匹配成功';
}
元字符與轉(zhuǎn)義
正則表達(dá)式中具有特殊含義的字符稱之為元字符,常用的元字符有:
\ 一般用于轉(zhuǎn)義字符
^ 斷言目標(biāo)的開始位置(或在多行模式下是行首)
$ 斷言目標(biāo)的結(jié)束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認(rèn))
[ 開始字符類定義
] 結(jié)束字符類定義
| 開始一個(gè)可選分支
( 子組的開始標(biāo)記
) 子組的結(jié)束標(biāo)記
? 作為量詞,表示 0 次或 1 次匹配。位于量詞后面用于改變量詞的貪婪特性。 (查閱量詞)
* 量詞,0 次或多次匹配
+ 量詞,1 次或多次匹配
{ 自定義量詞開始標(biāo)記
} 自定義量詞結(jié)束標(biāo)記
//下面的\s匹配任意的空白符,包括空格,制表符,換行符。[^\s]代表非空白符。[^\s]+表示一次或多次匹配非空白符。
$p = '/^我[^\s]+(蘋果|香蕉)$/';
$str = "我喜歡吃蘋果";
if (preg_match($p, $str)) {
echo '匹配成功';
}
元字符具有兩種使用場(chǎng)景,一種是可以在任何地方都能使用,另一種是只能在方括號(hào)內(nèi)使用,在方括號(hào)內(nèi)使用的有:
\ 轉(zhuǎn)義字符
^ 僅在作為第一個(gè)字符(方括號(hào)內(nèi))時(shí),表明字符類取反
- 標(biāo)記字符范圍
其中^在反括號(hào)外面,表示斷言目標(biāo)的開始位置,但在方括號(hào)內(nèi)部則代表字符類取反,方括號(hào)內(nèi)的減號(hào)-可以標(biāo)記字符范圍,例如0-9表示0到9之間的所有數(shù)字。
//下面的\w匹配字母或數(shù)字或下劃線。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的郵箱是Spark.eric@imooc.com";
preg_match($p, $str, $match);
echo $match[0];
\d表示匹配數(shù)字
關(guān)于match數(shù)組的說明:
文檔上的解釋為:如果提供了參數(shù) matches ,它將被填充為搜索結(jié)果。 $matches[0] 將包含完整模式匹配到的文本, $matches[1] 將包含第一個(gè)捕獲子組匹配到的文本,以此類推。
文檔上對(duì)于子組的說明為:子組通過圓括號(hào)分隔界定,并且它們可以嵌套。
正則表達(dá)式的搜索與替換在某些方面具有重要用途,比如調(diào)整目標(biāo)字符串的格式,改變目標(biāo)字符串中匹配字符串的順序等。
例如我們可以簡(jiǎn)單的調(diào)整字符串的日期格式:
$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //結(jié)果為:2014, April 15
其中${1}與$1的寫法是等效的,表示第一個(gè)匹配的字串,$2代表第二個(gè)匹配的。
通過復(fù)雜的模式,我們可以更加精確的替換目標(biāo)字符串的內(nèi)容。
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');//\3等效于$3,\4等效于$4,依次類推
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27'); //結(jié)果為:$startDate = 5/27/1999
//詳細(xì)解釋下結(jié)果:(19|20)表示取19或者20中任意一個(gè)數(shù)字,(\d{2})表示兩個(gè)數(shù)字,(\d{1,2})表示1個(gè)或2個(gè)數(shù)字,(\d{1,2})表示1個(gè)或2個(gè)數(shù)字。^\s*{(\w+)\s*=}表示以任意空格開頭的,并且包含在{}中的字符,并且以任意空格結(jié)尾的,最后有個(gè)=號(hào)的。
用正則替換來去掉多余的空格與字符:
$str = 'one? ? two';
$str = preg_replace('/\s+/', ' ', $str);
echo $str; // 結(jié)果改變?yōu)?one two'
GD
要對(duì)圖形進(jìn)行操作,首先要新建一個(gè)畫布,通過imagecreatetruecolor函數(shù)可以創(chuàng)建一個(gè)真彩色的空白圖片:
$img = imagecreatetruecolor(100, 100);
GD庫(kù)中對(duì)于畫筆所用的顏色,需要通過imagecolorallocate函數(shù)進(jìn)行分配,通過參數(shù)設(shè)定RGB的顏色值來確定畫筆的顏色:
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
然后我們通過調(diào)用繪制線段函數(shù)imageline進(jìn)行線條的繪制,通過指定起點(diǎn)跟終點(diǎn)來最終得到線條。
imageline($img, 0, 0, 100, 100, $red);
線條繪制好以后,通過header與imagepng進(jìn)行圖像的輸出。
header("content-type: image/png");
imagepng($img);
最后可以調(diào)用imagedestroy釋放該圖片占用的內(nèi)存。
imagedestroy($img);
通過上面的步驟,可以發(fā)現(xiàn)PHP繪制圖形非常的簡(jiǎn)單,但很多時(shí)候我們不只是需要輸出圖片,可能我們還需要得到一個(gè)圖片文件,可以通過imagepng函數(shù)指定文件名將繪制后的圖像保存到文件中。
imagepng($img, 'img.png');
GD庫(kù)可以進(jìn)行多種圖形的基本操作,常用的有繪制線條,背景填充,畫矩形,繪制文字等。
跟繪制線條類似,首先需要新建一個(gè)圖片與初始化顏色。
$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
然后使用imagestring函數(shù)來進(jìn)行文字的繪制,這個(gè)函數(shù)的參數(shù)很多:imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col ),可以通過$font來設(shè)置字體的大小,x,y設(shè)置文字顯示的位置,$s是要繪制的文字,$col是文字的顏色。
imagestring($img, 5, 0, 0, "Hello world", $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);
前面我們已經(jīng)了解到,通過imagepng可以直接輸出圖像到瀏覽器,但是很多時(shí)候,我們希望將處理好的圖像保存到文件,以便可以多次使用。通過指定路徑參數(shù)將圖像保存到文件中。
$filename = 'img.png';
imagepng($img, $filename);
使用imagepng可以將圖像保存成png格式,如果要保存成其他格式需要使用不同的函數(shù),使用imagejpeg將圖片保存成jpeg格式,imagegif將圖片保存成gif格式,需要說明的是,imagejpeg會(huì)對(duì)圖片進(jìn)行壓縮,因此還可以設(shè)置一個(gè)質(zhì)量參數(shù)。
$filename = 'img.jpg';
?imagejpeg($img, $filename, 80);
imagecreatefromjpeg可以直接從圖片文件創(chuàng)建圖像。
異常
1、基本語(yǔ)法
try{
//可能出現(xiàn)錯(cuò)誤或異常的代碼
//catch表示捕獲,Exception是php已定義好的異常類
} catch(Exception $e){
//對(duì)異常處理,方法:
//1、自己處理
//2、不處理,將其再次拋出
}
2、處理處理程序應(yīng)當(dāng)包括:
Try - 使用異常的函數(shù)應(yīng)該位于 "try" ?代碼塊內(nèi)。如果沒有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行。但是如果異常被觸發(fā),會(huì)拋出一個(gè)異常。
Throw - 這里規(guī)定如何觸發(fā)異常。注意:每一個(gè) "throw" 必須對(duì)應(yīng)至少一個(gè) "catch",當(dāng)然可以對(duì)應(yīng)多個(gè)"catch"
Catch - "catch" 代碼塊會(huì)捕獲異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象。
//創(chuàng)建可拋出一個(gè)異常的函數(shù)
function checkNum($number){
if($number>1){
throw new Exception("異常提示-數(shù)字必須小于等于1");
}
return true;
}
//在 "try" 代碼塊中觸發(fā)異常
try{
checkNum(2);
//如果異常被拋出,那么下面一行代碼將不會(huì)被輸出
echo '如果能看到這個(gè)提示,說明你的數(shù)字小于等于1';
}catch(Exception $e){
//捕獲異常
echo '捕獲異常: ' .$e->getMessage();
}
上面代碼將獲得類似這樣一個(gè)錯(cuò)誤:
捕獲異常:: 異常提示-數(shù)字必須小于等于1
例子解釋:
上面的代碼拋出了一個(gè)異常,并捕獲了它:
創(chuàng)建 checkNum() 函數(shù)。它檢測(cè)數(shù)字是否大于 1。如果是,則拋出一個(gè)異常。
在 "try" 代碼塊中調(diào)用 checkNum() 函數(shù)。
checkNum() 函數(shù)中的異常被拋出
"catch" 代碼塊接收到該異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象 ($e)。
通過從這個(gè) exception 對(duì)象調(diào)用 $e->getMessage(),輸出來自該異常的錯(cuò)誤消息