常用函數
var_dump() 函數返回數組的數據類型和值
unset() 釋放
bool define(string $constant_name, mixed $value[, $case_sensitive = true]) 定義常量
mixed constant(string constant_name) 調用常數--第一個參數constant_name為要獲取常量的名稱,也可為存儲常量名的變量。如果成功則返回常量的值,失敗則提示錯誤信息常量沒有被定義。(注:mixed表示函數返回值類型為多種不同的類型,string表示參數類型為字符串類型)
bool defined(string constants_name)判斷一個常量是否已經定義,它只有參數constant_name,指的是要獲取常量的名稱,若存在則返回布爾類型true,否則返回布爾類型false; (注:bool表示函數返回值類型為布爾類型)
魔術方法
__set,__get,__isset,__unset,__call,__clone
字符串
trim去除一個字符串兩端空格。trim($str);
rtrim是去除一個字符串右部空格,其中的r是right的縮寫。
ltrim是去除一個字符串左部空格,其中的l是left的縮寫。
strlen()函數獲取字符串長度。strlen($str);
mb_strlen()函數獲取字符串中中文長度。mb_strlen($str,"UTF8")
substr(字符串變量,開始截取的位置,截取個數)substr($str, 2, 4);
mb_substr(字符串變量,開始截取的位置,截取個數, 網頁編碼)中文 ? mb_substr($str, 4, 2, 'utf8');
strpos(要處理的字符串, 要定位的字符串, 定位的起始位置[可選]) strpos($str, 'imooc');
str_replace(要查找的字符串, 要替換的字符串, 被搜索的字符串, 替換進行計數[可選])str_replace('js', 'php', $str);
sprintf(格式, 要轉化的字符串)返回:格式化好的字符串 sprintf('%01.2f', $str)
1、這個 % 符號是開始的意思,寫在最前面表示指定格式開始了。 也就是 "起始字符", 直到出現 "轉換字符" 為止,就算格式終止。
2、跟在 % 符號后面的是 0, 是 "填空字元" ,表示如果位置空著就用0來填滿。
3、在 0 后面的是1,這個 1 是規定整個所有的字符串占位要有1位以上(小數點也算一個占位)。
如果把 1 改成 6,則 $result的值將為 099.90
因為,在小數點后面必須是兩位,99.90一共5個占位,現在需要6個占位,所以用0來填滿。
4、在 %01 后面的 .2 (點2) 就很好理解了,它的意思是,小數點后的數字必須占2位。 如果這時候,$str 的值為9.234,則 $result的值將為9.23.
為什么4 不見了呢? 因為在小數點后面,按照上面的規定,必須且僅能占2位。 可是 $str 的值中,小數點后面占了3位,所以,尾數4被去掉了,只剩下 23。
5、最后,以 f "轉換字符" 結尾。
implode(分隔符[可選], 數組)返回值:把數組元素組合為一個字符串 explode(',', $str);
explode(分隔符[可選], 字符串)返回值:函數返回由字符串組成的數組 explode('-',$str);
addslashes()函數說明:用于對特殊字符加上轉義字符,返回一個字符串。返回值:一個經過轉義后的字符串
// 1. addslashes此函數在DBMS沒有自己的轉義函數時候使用
// 2. htmlspecialchars把HTML中的幾個特殊字符轉義成HTML Entity形式
// 3. htmlentities把HTML中可以轉義的內容轉義成HTML Entity
// 4. mysql_real_escape_string調用MySQL的庫函數對特殊字符進行轉義
// 5. strip_tags濾掉NUL,HTML和PHP的標簽
preg_match用于執行一個正則匹配,常用來判斷一類字符模式是否存在。preg_match($r, $str);return bool? preg_match($p, $str, $match);
file_get_contents,可以將整個文件全部讀取到一個字符串中。file_get_contents('./test.txt');
fopen,fgets,fread等方法,fgets可以從文件指針中讀取一行,freads可以讀取指定長度的字符串。
一般情況下在對文件進行操作的時候需要先判斷文件是否存在,PHP中常用來判斷文件存在的函數有兩個is_file與file_exists.
如果只是判斷文件存在,使用file_exists就行,file_exists不僅可以判斷文件是否存在,同時也可以判斷目錄是否存在,從函數名可以看出,is_file是確切的判斷給定的路徑是否是一個文件。
is_readable與is_writeable在文件是否存在的基礎上,判斷文件是否可讀與可寫。
系統常量
(1)__FILE__ :php程序文件名。它可以幫助我們獲取當前文件在服務器的物理位置。
(2)__LINE__ :PHP程序文件行數。它可以告訴我們,當前代碼在第幾行。
(3)PHP_VERSION:當前解析器的版本號。它可以告訴我們當前PHP解析器的版本號,我們可以提前知道我們的PHP代碼是否可被該PHP解析器解析。
(4)PHP_OS:執行當前PHP版本的操作系統名稱。它可以告訴我們服務器所用的操作系統名稱,我們可以根據該操作系統優化我們的代碼。
巴拉
Heredoc結構形式
首先使用定界符表示字符串(<<<),接著在“<<<“之后提供一個標識符GOD,然后是字符串,最后以提供的這個標識符結束字符串。如圖:
在賦值符號后,輸入定界符“<<<”,接著是標識符,你可以用你的女神作為標識符“GOD”,如第2行,也可以使用你喜歡的狗狗,“DOG”作為標識符,但是,結尾處的標識符也必須是一樣的。此外,在結尾的一行,如第7行,一定要另起一行,并且此行除了“GOD”,并以“;”號結束之外,不能有任何其他字符,前后都不能有,包括空格,否則會出現錯誤的哦。切記切記哦。
PHP賦值運算符
PHP的賦值運算符有兩種,分別是:
(1)“=”:把右邊表達式的值賦給左邊的運算數。它將右邊表達式值復制一份,交給左邊的運算數。換而言之,首先給左邊的運算數申請了一塊內存,然后把復制的值放到這個內存中。
(2)“&”:引用賦值,意味著兩個變量都指向同一個數據。它將使兩個變量共享一塊內存,如果這個內存存儲的數據變了,那么兩個變量的值都會發生變化。
比較運算符
比較運算符主要是用于進行比較運算的,例如:等于、全等、不等、大于、小于。在PHP中常用的比較運算符如下表:
三元運算符
(“?:”)三元運算符也是一個比較運算符,對于表達式(expr1)?(expr2):(expr3),如果expr1的值為true,則此表達式的值為expr2,否則為expr3。
邏輯運算符
邏輯運算符主用是進行邏輯運算的,例如:邏輯與、邏輯或、邏輯異或、邏輯非等,在PHP中常用的邏輯運算符如下表:
PHP中的字符串連接運算符
字符串連接運算符是為了將兩個字符串進行連接,PHP中提供的字符串連接運算符有:
(1)連接運算符(“.”):它返回將右參數附加到左參數后面所得的字符串。
(2)連接賦值運算符(“.=”):它將右邊參數附加到左邊的參數后。
PHP中的錯誤控制運算符
PHP中提供了一個錯誤控制運算符“@”,對于一些可能會在運行過程中出錯的表達式時,我們不希望出錯的時候給客戶顯示錯誤信息,這樣對用戶不友好。于是,可以將@放置在一個PHP表達式之前,該表達式可能產生的任何錯誤信息都被忽略掉;
如果激活了track_error(這個玩意在php.ini中設置)特性,表達式所產生的任何錯誤信息都被存放在變量$php_errormsg中,此變量在每次出錯時都會被覆蓋,所以如果想用它的話必須盡早檢查。
需要注意的是:錯誤控制前綴“@”不會屏蔽解析錯誤的信息,不能把它放在函數或類的定義之前,也不能用于條件結構例如if和foreach等。
foreach
在PHP中foreach循環語句,常用于遍歷數組,一般有兩種使用方式:不取下標、取下標。
(1)只取值,不取下標
foreach (數組 as 值){
//執行的任務
}
(2)同時取下標和值
foreach (數組 as 下標 => 值){
//執行的任務
}
數組
$arr[0]="";
$arr= array();
$arr=array("key"=>"value");
PHP函數之可變函數
所謂可變函數,即通過變量的值來調用函數,因為變量的值是可變的,所以可以通過改變一個變量的值來實現調用不同的函數。經常會用在回調函數、函數列表,或者根據動態參數來調用不同的函數。可變函數的調用方法為變量名加括號。
function name() {
echo 'jobs';
}
$func = 'name';
$func(); //調用可變函數
可變函數也可以用在對象的方法調用上。
class book {
function getName() {
return 'bookname';
}
}
$func = 'getName';
$book = new book();
$book->$func();
類屬性
一般通過->對象操作符來訪問對象的屬性或者方法,對于靜態屬性則使用::雙冒號進行訪問。當在類成員方法內部調用的時候,可以使用$this偽變量調用當前對象的屬性。
靜態
靜態方法中,$this偽變量不允許使用。可以使用self,parent,static在內部調用靜態方法與屬性。
對象序列化
可以通過serialize方法將對象序列化為字符串,用于存儲或者傳遞數據,然后在需要的時候通過unserialize將字符串反序列化成對象進行使用。
class Car {
public $name = 'car';
}
$a = new Car();
$str = serialize($a); //對象序列化成字符串
echo $str.'
';
$b = unserialize($str); //反序列化為對象
var_dump($b);
正則表達式
PCRE庫函數中,正則匹配模式使用分隔符與元字符組成,分隔符可以是非數字、非反斜線、非空格的任意字符。經常使用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~),例如:
/foo bar/
#^[^0-9]$#
~php~
如果模式中包含分隔符,則分隔符需要使用反斜杠(\)進行轉義。
/http:\/\//
如果模式中包含較多的分割字符,建議更換其他的字符作為分隔符,也可以采用preg_quote進行轉義。
$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 '匹配成功';
}
元字符與轉義
正則表達式中具有特殊含義的字符稱之為元字符,常用的元字符有:
\ 一般用于轉義字符
^ 斷言目標的開始位置(或在多行模式下是行首)
$ 斷言目標的結束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認)
[ 開始字符類定義
] 結束字符類定義
| 開始一個可選分支
( 子組的開始標記
) 子組的結束標記
? 作為量詞,表示 0 次或 1 次匹配。位于量詞后面用于改變量詞的貪婪特性。 (查閱量詞)
* 量詞,0 次或多次匹配
+ 量詞,1 次或多次匹配
{ 自定義量詞開始標記
} 自定義量詞結束標記
//下面的\s匹配任意的空白符,包括空格,制表符,換行符。[^\s]代表非空白符。[^\s]+表示一次或多次匹配非空白符。
$p = '/^我[^\s]+(蘋果|香蕉)$/';
$str = "我喜歡吃蘋果";
if (preg_match($p, $str)) {
echo '匹配成功';
}
元字符具有兩種使用場景,一種是可以在任何地方都能使用,另一種是只能在方括號內使用,在方括號內使用的有:
\ 轉義字符
^ 僅在作為第一個字符(方括號內)時,表明字符類取反
- 標記字符范圍
其中^在反括號外面,表示斷言目標的開始位置,但在方括號內部則代表字符類取反,方括號內的減號-可以標記字符范圍,例如0-9表示0到9之間的所有數字。
//下面的\w匹配字母或數字或下劃線。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的郵箱是Spark.eric@imooc.com";
preg_match($p, $str, $match);
echo $match[0];
\d表示匹配數字
關于match數組的說明:
文檔上的解釋為:如果提供了參數 matches ,它將被填充為搜索結果。 $matches[0] 將包含完整模式匹配到的文本, $matches[1] 將包含第一個捕獲子組匹配到的文本,以此類推。
文檔上對于子組的說明為:子組通過圓括號分隔界定,并且它們可以嵌套。
正則表達式的搜索與替換在某些方面具有重要用途,比如調整目標字符串的格式,改變目標字符串中匹配字符串的順序等。
例如我們可以簡單的調整字符串的日期格式:
$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //結果為:2014, April 15
其中${1}與$1的寫法是等效的,表示第一個匹配的字串,$2代表第二個匹配的。
通過復雜的模式,我們可以更加精確的替換目標字符串的內容。
$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'); //結果為:$startDate = 5/27/1999
//詳細解釋下結果:(19|20)表示取19或者20中任意一個數字,(\d{2})表示兩個數字,(\d{1,2})表示1個或2個數字,(\d{1,2})表示1個或2個數字。^\s*{(\w+)\s*=}表示以任意空格開頭的,并且包含在{}中的字符,并且以任意空格結尾的,最后有個=號的。
用正則替換來去掉多余的空格與字符:
$str = 'one? ? two';
$str = preg_replace('/\s+/', ' ', $str);
echo $str; // 結果改變為'one two'
GD
要對圖形進行操作,首先要新建一個畫布,通過imagecreatetruecolor函數可以創建一個真彩色的空白圖片:
$img = imagecreatetruecolor(100, 100);
GD庫中對于畫筆所用的顏色,需要通過imagecolorallocate函數進行分配,通過參數設定RGB的顏色值來確定畫筆的顏色:
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
然后我們通過調用繪制線段函數imageline進行線條的繪制,通過指定起點跟終點來最終得到線條。
imageline($img, 0, 0, 100, 100, $red);
線條繪制好以后,通過header與imagepng進行圖像的輸出。
header("content-type: image/png");
imagepng($img);
最后可以調用imagedestroy釋放該圖片占用的內存。
imagedestroy($img);
通過上面的步驟,可以發現PHP繪制圖形非常的簡單,但很多時候我們不只是需要輸出圖片,可能我們還需要得到一個圖片文件,可以通過imagepng函數指定文件名將繪制后的圖像保存到文件中。
imagepng($img, 'img.png');
GD庫可以進行多種圖形的基本操作,常用的有繪制線條,背景填充,畫矩形,繪制文字等。
跟繪制線條類似,首先需要新建一個圖片與初始化顏色。
$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
然后使用imagestring函數來進行文字的繪制,這個函數的參數很多:imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col ),可以通過$font來設置字體的大小,x,y設置文字顯示的位置,$s是要繪制的文字,$col是文字的顏色。
imagestring($img, 5, 0, 0, "Hello world", $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);
前面我們已經了解到,通過imagepng可以直接輸出圖像到瀏覽器,但是很多時候,我們希望將處理好的圖像保存到文件,以便可以多次使用。通過指定路徑參數將圖像保存到文件中。
$filename = 'img.png';
imagepng($img, $filename);
使用imagepng可以將圖像保存成png格式,如果要保存成其他格式需要使用不同的函數,使用imagejpeg將圖片保存成jpeg格式,imagegif將圖片保存成gif格式,需要說明的是,imagejpeg會對圖片進行壓縮,因此還可以設置一個質量參數。
$filename = 'img.jpg';
?imagejpeg($img, $filename, 80);
imagecreatefromjpeg可以直接從圖片文件創建圖像。
異常
1、基本語法
try{
//可能出現錯誤或異常的代碼
//catch表示捕獲,Exception是php已定義好的異常類
} catch(Exception $e){
//對異常處理,方法:
//1、自己處理
//2、不處理,將其再次拋出
}
2、處理處理程序應當包括:
Try - 使用異常的函數應該位于 "try" ?代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。
Throw - 這里規定如何觸發異常。注意:每一個 "throw" 必須對應至少一個 "catch",當然可以對應多個"catch"
Catch - "catch" 代碼塊會捕獲異常,并創建一個包含異常信息的對象。
//創建可拋出一個異常的函數
function checkNum($number){
if($number>1){
throw new Exception("異常提示-數字必須小于等于1");
}
return true;
}
//在 "try" 代碼塊中觸發異常
try{
checkNum(2);
//如果異常被拋出,那么下面一行代碼將不會被輸出
echo '如果能看到這個提示,說明你的數字小于等于1';
}catch(Exception $e){
//捕獲異常
echo '捕獲異常: ' .$e->getMessage();
}
上面代碼將獲得類似這樣一個錯誤:
捕獲異常:: 異常提示-數字必須小于等于1
例子解釋:
上面的代碼拋出了一個異常,并捕獲了它:
創建 checkNum() 函數。它檢測數字是否大于 1。如果是,則拋出一個異常。
在 "try" 代碼塊中調用 checkNum() 函數。
checkNum() 函數中的異常被拋出
"catch" 代碼塊接收到該異常,并創建一個包含異常信息的對象 ($e)。
通過從這個 exception 對象調用 $e->getMessage(),輸出來自該異常的錯誤消息