php學(xué)習(xí)筆記

常用函數(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)算符如下表:

對(duì)象比較,當(dāng)同一個(gè)類的兩個(gè)實(shí)例的所有屬性都相等時(shí),可以使用比較運(yùn)算符==進(jìn)行判斷,當(dāng)需要判斷兩個(gè)變量是否為同一個(gè)對(duì)象的引用時(shí),可以使用全等運(yùn)算符===進(jì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ò)誤消息

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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