PHP之 常見問題拾記

PHP常識問題拾記


1、PHP_EOL是幹什麼的?
-》 PHP_EOL是PHP定義的變量,代表PHP換行。特點是這個變量會因爲平臺而變,在windows下是\r\n,在Linux下是\n,在mac下是\r。

2、爲什麼echo一個對象會報語法錯誤,但如果這個對象實現了__toString方法後就可以直接輸出呢?
-》 echo本可以打印一個對象,而且也實現了這個接口,但是PHP對其進行了限制,只有實現__toString後才能使用。

3、PHP在echo一個對象的時候,爲什麼要判斷變量類型是否爲string?
-》 如果是string的話,直接輸出;如果不是,則會去尋找可以轉換爲string的方法,比如對象中的__toString。

4、__toString和serialize有什麼聯繫,區別又在哪裏?
-》兩者都可以實現序列化,但是,serialize會產生一些無用的信息,比如長度,會造成存儲空間的無謂浪費;而__toString可以實現自己的序列化。用json_encode也不錯。

5、我們平時的操作中echo一個對象,有時候,會報錯,這是爲什麼?如何解決報錯?
-》這是因爲echo一個對象,對象就會自動去調用它所屬類的__toString方法,格式化輸出這個對象所包含的數據。如果沒有這個方法,那麼就會報錯。

6、assert函數是做什麼用的?
-》檢查一個斷言是否爲false。第一個參數是assertion,如果是字符串,則將被該函數當做PHP代碼來執行。assertion是字符串的優勢是當禁用斷言時,它的開銷最小,並且,在斷言失敗時,消息會包含assertion表達式。斷言這個功能只是被用來調試。而作爲一個經驗法則,在斷言禁用時,你的代碼還應該正常運行纔對。

7、編程語言中的三大範式是什麼?
-》面向過程、面向對象、函數式編程。

8、面向對象的核心思想是什麼?
-》對象、封裝、可重用性和可擴展性。

9、說說對於序列化的理解。
-》序列化就是把保存在內存中的各種對象狀態(屬性)保存起來,並且在需要的時候,可以還原出來。在序列化和反序列化時都需包含類的對象的定義,不然,反序列化後,就找不到該對象的類的定義,返回不了正確的結果。

10、PHP的底層變量類型是什麼?
-》zvalue_value.

11、在PHP5中,對象在底層是採取什麼方式實現的?
-》屬性數組 + 方法數組。

12、類的標準方法在哪個文件定義,具體實現又在哪個文件?
-》zend/zend_object_handlers.h  zend/zend_object_handlers.c 

13、在PHP中有對象就一定有類嗎?
-》 不一定。由標量轉換的object,就沒有一個類與object對應。在PHP中這類對象會被stdClass收留。

14、簡單說說PHP的垃圾回收機制。
https://www.cnblogs.com/lovehappying/p/3679356.html

15、假設一個控制器調用了一個不存在的方法,報錯了,那麼要怎麼處理,纔會友好地處理這種情況呢?
-》使用__call魔術方法。

16、使用魔術方法的本意是什麼?
-》使用魔術方法的本意並不是“防止調用不存在的方法而報錯”,而是爲了使方法的動態創建成爲可能。

17、在PHP中,命名空間是用來解決什麼問題的?
-》a.解決用戶的代碼與PHP內置的類、函數、常量或第三方類、函數、常量的衝突問題。
-》b.爲很長的標識符名稱創建一個別名,提高代碼的可讀性。

18、命名空間提出於什麼時候?
-》PHP5.3

19、在PHP命名空間和目錄一定要一一對應嗎?
-》不是的。但是,常規操作中,儘量做到一一對應。

20、在PHP中,支持同一個文件中定義多個命名空間嗎?
-》同意。但非常不提倡。

21、繼承與多態的關係是什麼?
-》面向對象的優勢在於類的複用。繼承和多態都是類的複用,但是,繼承是類級別的複用,而多態是方法級別的複用。

22、舉例說明一下“組合”。
-》代碼定義兩個類,一個是person,一個是family。在family類中創建person類中的對象,把這個對象視爲family類的一個屬性,並調用它的方法處理問題,這類複用方式,叫“組合”。

23、簡述繼承。
-》類與類之間有一種父與子的關係,子類繼承父類的屬性和方法,稱爲繼承。在繼承裏,子類擁有父類的方法和屬性,同時子類也可以擁有自己的方法和屬性。

24、在繼承中,用什麼代表父類,用什麼代表自己?使用什麼運算符,該運算符還能做什麼用?
-》parent代表父類。Self代表子類。使用“::”,該操作符還能作爲常量和靜態方法的調用。

25、如果聲明類成員或方法爲static,訪問的時候,是否需要實例化,怎麼訪問?
-》不需要實例化,就可以直接訪問。同時,也就不能通過一個對象去訪問其中的靜態成員,但是,靜態方法除外。

26、使用“::”調用一個非靜態的方法會導致一個什麼級別的錯誤?在PHP中這個報錯提示默認是否開啓?怎麼開啓?
-》會導致一個E_STRICT級別的錯誤。默認不會開啓。在php.ini文件中,進行如下操作開啓:
error_reproting = E_ALL | E_STRICT
display_errors = On

27、組合與繼承都是提高代碼可重用性的手段。那麼它們是什麼關係?
-》繼承是一種“是、像”的關係,而組合是一種“需要”的關係。舉例,父子是繼承關係,而父親與家庭則是組合關係,組合偏重整體與局部的關係,而繼承偏重父與子的關係。從方法複用的角度考慮,兩個類,有很多相同的代碼和方法,可以從這兩個類中抽象出一個父類,提供公共方法,然後,兩個類作爲子類,提供個性方法。組合之間的類可以關係很小,甚至沒有關係。

28、在實際的編程中,關於繼承和組合,取捨就不是那麼明顯了,你很難說出兩者是“像”還是“需要”的關係,甚至現實世界的建模,都無法決定是繼承還是組合,那麼,該怎麼辦?有標準嗎?
-》有,低耦合。

29、耦合是什麼?
-》耦合是一個軟件結構內,不同模塊之間,互連程度的度量,也就是不統計模塊之間的依賴關係。
低耦合是什麼?
-》低耦合是模塊與模塊之間,儘可能地,使模塊獨立存在,之間的接口也儘量少、簡單。

30、解耦是什麼?
-》解耦是解除模塊之間的依賴。

31、按照低耦合的思想,繼承與組合,在二者均可使用的情況下,更傾向於使用組合,爲什麼?繼承存在什麼問題?
a、繼承破壞封裝性。比如定義鳥類爲父類,具有羽毛屬性和飛翔方法,鴿子、老鷹、麻雀對其繼承,沒有問題;但是,鴕鳥、雞繼承的話,顯然,飛翔的方法它們也可以使用,但是,他們壓根就不能飛,顯然破壞了類的封裝性。而組合,從語義上要優於繼承。
b、繼承是緊耦合的。繼承使得父子捆綁,組合僅僅通過唯一接口和外部進行通信,耦合低於繼承。
c、繼承擴展複雜。繼承一多,大量的方法要重寫,組合可以實現動態結合,減少代碼。
d、不恰當地使用繼承可能違反現實世界裏的邏輯。比如人作爲父類,僱員、經歷、學生作爲子類,經理一定是僱員,學生也可能是僱員,而使用繼承的話,一個人就無法擁有這麼多的角色。這種問題,歸結起來就是“角色”與“權限”的問題。在權限系統中,可能存在這樣的問題,經理的權限大於主管,但是,礙於分工和安全的考慮,經理是不能直接操作主管所負責的資源,技術經理也沒有權限直接命令市場主管。就是這麼個道理,不恰當地繼承,就可能出現邏輯混亂,但組合可以巧妙地解決。

32、組合有缺點嗎?
-》有,組合需要一一創建局部對象,增加了代碼量,但是,其優點卻是大過缺點的。

33、繼承最大的優點是擴展簡單,但是缺點大於優點,那麼應該如何使用繼承呢?
a、精心設計子類,父類得穩定,不要多於三層。
b、非被繼承的類,使用final修飾符,防止覆蓋和優化搜尋。
c、優先考慮組合。
d、子類不是父類的角色。
e、子類擴展,不能損害父類。
f、底層代碼,多用組合;頂層、業務層多用繼承。

34、繼承與組合各有長短,如果想要組合的靈活,繼承的簡潔,能做到嗎?
-》可以。多重繼承,就可以實現。多重繼承就是一個類可以同時繼承多個父類,組合兩個父類的功能。但多重繼承過於靈活,會帶來“菱形”問題,大多數語言已經放棄。PHP 5.4提供了Traits,可以方便實現對象的擴展,可以使單繼承獲得多重繼承的靈活,又可避免多重繼承的問題。

35、簡述多態
-》同一類的對象,在收到相同的消息時,會得到不同的結果。而這個消息是不可測的。多態,顧名思義,就是多種狀態,也就是多種結果。

36、多態性的意義在哪裏
-》多態性是一種通過多種狀態或階段,描述相同對象的編程方式。它的真正意義在於:實際開發當中,只要關心一個接口或基類的編程,而不必關心一個對象所屬的具體類。

37、很多人都說“PHP沒有多態”,對嗎?
-》不是沒有,事實上,它本來就是多態的。PHP作爲一門腳本語言,自身就是多態的,所以,在語言這個級別上,不談PHP的多態。官方手冊也找不到詳細描述。

38、通過判斷傳入對象所屬類不同來調用其同名方法,得出不同的結果,這是多態嗎?
-》如果站在C++角度,不是,這只是不同對象的不同表現。C++裏的多態,指的是運行時對象的具體化,同一類的對象調用相同的方法而返回不同的結果。

39、區別是否多態的關鍵
-》在於看對象是否屬於同一類。如果調用相同的方法,返回了不同的結果,那就是多態。PHP與強語言的多態,在概念和實現上,是有一些區別的,PHP的實現更簡單、更靈活。

40、多態的本質總結
A、多態是同一類對象在運行時的具體化。
B、PHP實現多態,更簡單、更靈活。
C、類型轉換不是多態。
D、PHP中的父類和子類,存在繼承關係,但不存在“血緣”關係,子類無法向上轉爲父類。
E、多態的本質即if、else,實現的層級不同罷了。

41、面向接口編程是不是一種新的編程範式?
-》不是。

42、Interface定義的接口是狹義的還是廣義的?
-》狹義的。

43、廣義的接口是什麼?
-》廣義的接口可以是任何一個對外提供服務的出口。比如數據傳輸的USB接口、阿里的支付寶接口等。

44、在程序裏,接口的方法必須被全部實現嗎?
-》對,若不全部實現,就會報fetal錯誤。

45、在PHP中,如果代碼不符合接口語義,可以運行嗎?
-》可以,PHP中,只關心是否實現了這個方法,而不關心語義是否正確。

46、爲什麼要用接口,接口到底有什麼好處?
-》接口並不提供實現,只是提供一個規範。如果我們知道一個類實現了某個接口,那麼就知道了可以調用該接口的哪些方法,我們只需要知道這些就夠了。

47、爲什麼一個類只要實現了Iterator迭代器,其對象就可以被用作foreach的對象呢?
-》在對PHP實例對象使用foreach語法時,會檢查這個實例有沒有實現Iterator接口,如果實現了,就會通過內置方法,或使用實現類中的方法,模擬foreach語句。

48、PHP的錯誤處理機制有哪兩種?
A、使用set_error_handler接管PHP錯誤處理。
B、使用trigger_error主動拋出一個錯誤。

49、使用set_error_handler函數需注意什麼?
A、自定義錯誤處理函數,必須先創建一個錯誤處理函數,然後設置錯誤級別。
B、此函數並不能託管所有種類的函數,比如E_ERROR、E_PARSE、E_CORE_ERROR等。

50、使用set_error_handler函數,會完全繞過標準的PHP錯誤處理函數,必要時需怎麼做?
-》終止程序,die()腳本。

51、如果腳本執行前發生錯誤,這時自定義程序還未註冊,因此,就不會用到自定義錯誤處理程序,怎麼辦?如何實現?
-》需要先實現一個自定義的異常處理函數。具體如下:
<?php
function customError($errno, $errstr, $errfile, $errline){
echo “<b>錯誤代碼:</b>[${errno}]${errstr}\r\n”;
echo “錯誤代碼所在行:{$errline}文件{$errfile}\r\n”;
echo “PHP版本”,PHP_VERSION,”(”,php_OS,”)\r\n”;
//die();
}
Set_error_handler(“customError”,E_ALL|E_STRICT);
$a = array(‘o’=>2,4,6,8);
echo $a[o];
?>

52、自定義錯誤處理函數一定要有哪四個輸入變量?
-》$errno, $errstr, $errfile, $errliine

53、set_error_handler會接管PHP內置的錯誤處理,那如何取消接管?
-》使用restore_error_handler()函數。

54、使用自定義的set_error_handler接管PHP的錯誤,那先前代碼裏的錯誤抑制@是否會失效?
-》會。抑制的錯誤也會顯示。

55、PHP中,異常是否必須手動拋出?
-》是。絕大部分得手動拋出。

56、在PHP中如何才能捕獲到異常和非知名的錯誤?
-》使用set_error_handler接管,進而主動拋出。具體操作如下:
<?php
fucntion customError($errno,$errstr,$errfile,$errline){
// 自定義錯誤處理時,手動拋出異常
throw new Exception($level.’|’.${errstr});
}
set_error_handler(“customError”, E_ALL|E_STRICT);
try{
$a = 5/0;
}catch(Exception $e){
echo ‘錯誤信息:’.$e->getMessage();
}
?>

57、以上這種方式存在的問題是什麼?
-》問題是這些必須靠程序員自己來掌控,處理不當,就會導致與前面的業務數據不一致。優點是,可獲取程序上下文信息,及時針對性補救。

58、Fetal error這種錯誤,完全不能捕獲嗎?如果不是,怎麼處理?
-》不是。使用register_shutdown_function這個函數可以在程序終止,或者die的時候觸發一個函數,給PHP一個短暫的信息展示。

59、對於parse error這種錯誤,常見的處理方式是?
-》對於這種錯誤,你只能記錄日誌,後邊進行查詢。

60、錯誤處理,有對應的拋出函數嗎?
-有,trigger_error()。

61、在PHP中,異常和錯誤是兩種概念。異常絕大部分得通過手動拋出,纔可捕獲。無論錯誤還是異常,都可以使用handler,接管系統已有的處理機制。

62、在PHP中連接MySQL數據庫,通常有哪三種選擇?
A、MySQL系列函數,最常用,過程式風格的一組應用。
B、MySQLi函數,前者的增強版,提供面向過程和對象的兩種API,增加預編譯和參數綁定。
C、PDO,從語法上講,PDO更接近MySQLi(PHP5.1及以上版本支持)

63、PDO擴展只是一個抽象的接口層,利用它本身不能實現庫操作,那麼它究竟怎麼實現的?
-》它會使用一個特定的數據庫PDO驅動訪問數據庫。

64、PDO中包含三個預定義類,是哪三個?
-》PDO、PDOStatement、PDOException。

65、如何使用PDO?
<?php
try{
$dsn = “mysql:host=127.0.0.1;dbname=test”; // 配置PDO的數據源
$db = new PDO($dsn, ‘root’, ‘123456’); // 構造方法
// 設置異常可捕獲
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$db->exec(“SET NAMES UTF8”);
$sql = “insert into t1 (a,b,c,d) values (‘a1’,’b2’,’c1’,’d1’)”;
$db->exec($sql);
// 使用預處理語句
$insert = $db->prepare(“insert into t1 (a,b,c,d) values (?,?,?,?)”);
$insert->execute(array(‘a2’,‘b2’,‘c2’,‘d2’));

$sql = “select a,b,c from test”;
$query = $db->prepare($sql);
$query->execute();
}catch (PDOException $err){
echo $err->getMessage();
}
?>

66、PDO最大的特性是什麼?
-》引入參數綁定和預處理。兩者是同一事件的不同階段。

67、PHP的PDO提供了哪兩種參數綁定?
A、問號+序號
B、冒號+參數名

68、PHP顯式地用了prepare的API,但實際上PDO並沒有做真正的預處理,而是?
-》對參數轉義,拼接到原來的sql語句上,發送給MySQL服務器。

69、爲什麼PHP裏,使用PDO的prepare API,默認不是使用參數綁定和預編譯呢?
-》這主要是處於兼容性的考慮,一個是PDO是個抽象數據訪問層,支持多種數據庫,可能有的數據庫並不支持預編譯功能,所以,爲了做到最大兼容,PHP就默認使用了SQL拼接來模擬預編譯。

70、從抓包可以看到,如果使用了預編譯,客戶端和服務端就多了一次網絡開銷,客戶端需分兩次發送SQL模板和SQL查詢參數,那是不是說預編譯會帶來性能損失呢?
-》不會,因爲預編譯的過程只發生在第一次請求,它只需一次編譯的過程。一旦編譯成功,就不會再進行第二次了。

71、PHP的PDO思想來自於什麼?
-》ODBC(open database connectivity,開放數據庫連接),JDBC(Java database connectivity,Java數據庫連接)。ODBC,微軟的,開放服務結構中,數據庫的一個組成部分,提供了對於數據庫訪問的標準的API。JDBC可對多種關係的數據庫提供統一訪問,它是對ODBC的一種繼承。

72、爲什麼說使用了連接池的技術,就能達到提高預編譯性能的目的?
-》MySQL支持預編譯,但是比較弱,僅僅是session級別。PHP每次請求都是一次全新的會話,每次請求都需重新做一次預編譯。但如果使用了連接池,就能讓多次PHP請求使用同一個數據連接session,從而達到高性能的預編譯。

73、預編譯負責哪兩件事?
-》 轉義和軟解析提速。程序是否支持預編譯,除了數據庫之外,還需驅動支持。PDO和MySQLi都支持預編譯。

74、PDO中如何實現事務?
-》PDO中使用beginTransaction()方法創建事務。使用commit()提交事務,rollback()回滾事務。在腳本結束或者連接要關閉時,如果還有一個操作未處理完,PDO將自動回滾。自動回滾,僅限於通過beginTransaction()建立的事務。手動創建的事務,是不能自動回滾的。

75、怎麼知道SQL執行的效率呢?
A、記錄慢日誌
B、使用show profile,查看所有語句的消耗時間
C、使用show status,返回一些計數器,通過數值判斷哪些語句慢
D、使用show processlist,觀察一些不正常的線程(消耗時間多的)
E、使用explain進行分析

76、MySQL索引建立和使用的基本原則?
A、合理設計和使用
B、關鍵字段,索引的創建與否,會使查詢速度相差100倍
C、差的索引與沒建索引一樣
D、索引並非越多越好
E、每個表的索引應該少於5個
F、不在結果集單一的列(如enum枚舉類型)上創建索引,幫助不大
G、創建索引的字段結果集最好分佈均勻,或符合正態分佈

77、PHP類型轉換
第一種轉換方式: (int)  (bool)  (float)  (string)  (array) (object)
<?php   
$num1=3.14;   
$num2=(int)$num1;   
var_dump($num1); //輸出float(3.14)   
var_dump($num2); //輸出int(3)   
?>  
第二種轉換方式:  intval()  floatval()  strval()
<?php   
$str="123.9abc";   
$int=intval($str);     //轉換後數值:123   
$float=floatval($str); //轉換後數值:123.9   
$str=strval($float);   //轉換後字符串:"123.9"    
?>  
第三種轉換方式:  settype();
<?php   
$num4=12.8;   
$flg=settype($num4,"int");   
var_dump($flg);  //輸出bool(true)   
var_dump($num4); //輸出int(12)   
?> 

78、HTTP協議的請求方法
A、GET:會顯示請求指定的資源,主要用於數據的讀取,而不應當用於會產生副作用的非逆的操作
B、POST:向指定資源提交數據,請求服務器進行處理,它是非逆的方法
C、HEAD:向服務器發送指定資源的請求,但是服務器在響應head請求時,不會回傳資源的內容部分,只會回傳head的頭信息
D、OPTIONS:用戶客戶端查看服務器的性能的,會請求服務器,返回該資源所支持的所有HTTP請求的方法,該方法會用*來代替資源名稱。向服務器發送options請求,可以測試服務器功能是否正常。
E、PUT:會向指定資源的位置上上傳最新的資源內容,put方法是逆等的方法,通過該方法,客戶端可以將指定資源的最新數據傳送給服務器,取代指定的資源的內容。通常情況,修改用put,創建用post。
F、DELETE:請求服務器用於刪除過的請求的URI所標識的資源,delete請求後,指定的資源會被刪除,該方法也是逆等     
G、TRACE:請求服務器回顯其收到的信息,該方法主要用於HTTP請求的測試和診斷。

79、HTTP協議常見的請求/響應頭
A、content-type:請求的與實體對應MIME信息
B、Accept:指定客戶端能夠接受的內容類型
C、Origin:告訴最初的請求來源
D、Cookie:HTTP請求發起時,發給服務端cookie的值 
E、Cache-control:指定請求和響應緩存的機制
F、User-agent:用戶信息
G、Referer:上級請求路徑
H、X-forwarded-for:請求端的真實的IP(做代理的時候,可以通過它獲取請求端的真實IP)
I、Access-Control-Allow-Origin:允許特定的域名來訪問,通常做跨域使用
J、Last-modified:請求資源的最後響應時間

80、常見的設計模式
工程模式、單例模式、註冊樹模式、適配器模式、觀察者模式、策略模式。

81、session信息的存儲方式有哪些?如何進行遍歷?
A、默認存儲到服務器的文件的;
B、還可以通過session_set_save_handler這個函數存儲到Redis、memcache。
遍歷的話,直接遍歷$_SESSION,就可以了。

82、傳遞sessionid的問題
Session_name()和session_id()
使用示例:
<a href=”    index.php?<?php echo session_name.’=’.session_id();?>”>下一頁</a>
還有另一種簡便方式,但是,這種使用情況的前提是cookie沒有開啓,如下
<a href=”index.php?<?php echo SID;?>”>下一頁</a>
cookie開啓,SID爲空。

83、SESSION配置
A、session.auto_start  開啓session
B、Session.cookie_domain 存儲session_id的cookie的有效域名的定義
C、Session.cookie_lifetime cookie生命週期
D、Session.cookie_path cookie的路徑設置
E、Session.name 存儲session_id是PHPSESSIONID,這個設置,就是可以更改PHPSESSIONID
F、Session.save_path session文件存儲在服務器的哪個路徑之下
G、Session.use_cookies  是否使用cookie傳遞session_id
H、Sesssion.use_trans_sid 是否可以使用傳遞的方式傳遞session_id
I、Session.gc_probability 開啓垃圾回收機制
J、Session.gc_divisor 訪問多少次後進行垃圾回收
K、Session.gc_maxlifetime  session文件最大生命週期,過了最大生命週期,垃圾回收文件

84、SESSION的操作
A、開啓session: session_start();
B、使用session: 直接給$_SESSION賦值就行
C、銷燬session: $_SESSION=[]
D、刪除文件以及COOKIE:session_destory();

85、SESSION的工作原理
Session的信息存儲在服務端,但是,客戶端的cookie中存有session_id,如果,客戶端要使用session信息,通過session_id,去服務端獲取即可了。

86、COOKIE的優點和缺點
優點:信息存儲在客戶端,不會佔用服務端資源。
缺點:信息存儲在客戶端,不安全;如果用戶禁用COOKIE,那麼,我們就無法保存用戶的信息。

87、COOKIE的相關操作
設置COOKIE
setcookie( $name, $value, $expire, $path, $domain, $secure);
SETCOOKIE( cookie名,cookie值,過期時間,有效路徑,域名,安全性 )

讀取COOKIE
$_COOKIE

設置COOKIE爲數組
setcookie( ‘ a[b]’, ‘val’ );

刪除COOKIE
setcookie( $name, ‘’,time()-1 );
不能用unset刪除

88、COOKIE的工作原理
COOKIE是由服務器發送給客戶端的片段信息,存儲在客戶端瀏覽器的內存或者是硬盤當中,供頁面之間的信息交流和狀態跟蹤。

89、會話控制的傳遞方式
A、通過GET參數傳遞
B、COOKIE
C、SESSION

90、爲什麼要使用會話控制技術?
web是通過http協議來實現的,而http協議又是無狀態的協議,也就是說,http協議沒有一個內建機制來維護兩個事務之間的狀態,同一個用戶請求同一個頁面兩次的時候,http協議不會認爲這兩次請求都來自同一個用戶,會把他們當做是兩次請求的獨立,會認爲是兩個人的請求。如果用戶執行了登陸操作,再次請求頁面,http不認爲用戶有登陸,因爲無法保持該用戶之前的登陸狀態,所以,它無法在各個頁面之間保持用戶的跟蹤和狀態的保持,而會話控制技術,就是爲解決這個問題應用而生的。

91、正表達式組成部分
A、分隔符:正斜線(/)、hash符號(#)、取反符號(~)
B、通用原子:\d(0-9) \D(非0-9) \w(字母、數字、下劃線) \W(非字母、數字、下劃線) \s(空白符) \S(非空白符)
C、元字符:.(除了換行符之外的任意字符) *(0次1,次多次) ?(0次或1次) ^(非) $(以某結尾)  +(1次或多次) {n}(n次) {n,m}(最少n次,最多m次) [](匹配一個集合,[abc]就是匹配a 或者b或者 c) ()(互相引用,或看做一個整體) [^](非某個範圍) |(或者) [-](代表一個範圍[0-9]匹配0到9之間的所有數字)
D、模式修正符:i(不區分大小寫) m(將字符串分割,每一行都進行匹配,前提是字符串中有換行) e(preg_match匹配出來的內容,做一些PHP語法的處理) s(修正點的換行) U(取消貪婪模式) x(忽略模式當中的空白符) A(語句模式開頭) D(修正$對反斜線的忽略) u(中文utf-8字符匹配時可以用到)

92、fopen函數
用來打開一個指定的文件,打開時,需要指定打開的模式
常見模式:
r:只讀方式打開,將指針指向文件開頭 
r+:讀寫方式打開,將文件指針指向開頭
w:寫的方式打開文件,將文件指針指向文件開頭,並且將文件的大小記爲0(清空文件)
w+:讀寫模式打開,如果文件不存在,會爲你自動創建文件
a:追加的寫入方式,會將文件的指針指向文件的末尾,如果文件不存在,也是創建一個
a+:追加的讀寫方式,將文件指針指向文件的末尾,文件不存在,也會創建
x:以寫入的方式進行打開,將文件指針指向文件的開頭,如果文件已經存在,會報warning的錯誤,並且fopen返回一個false;如果文件不存在,纔會創建
x+:創建,並以讀寫的方式打開
b:打開一個二進制文件
t:Windows獨有的文本轉換標記,可以將\n透明地轉換爲\r \n

93、讀取函數
fread():讀取文件函數
fgets():獲取一行文件內容函數
fgetc():獲取文件一個字符

94、關閉函數
fclose()

95、文件讀取,不需要fopen打開,就能讀取的函數
file_get_contents()
file_put_contents()

96、其他的文件讀取函數
file() 將整個文件讀取到一個數組中
readfile() 將文件內容讀取出來,並且輸入到緩衝區

97、訪問遠程文件
需要在php.ini中開啓allow_url_fopen,HTTP協議連接,只能讀取,不能寫入。FTP協議,可以使用只讀或者只寫。

98、目錄相關的操作
Basename()  dirname()  pathinfo()

99、目錄讀取
opendir()  readdir()  closedir()  rewinddir()  

100、目錄刪除
rmdir() 
注意:只有當目錄爲空的時候,才能刪除,否則,有內容,刪除不了,要先刪除文件,再刪目錄。

101、目錄創建
mkdir()

102、文件大小
filesize()

103、目錄大小(磁盤大小)
disk_free_space:磁盤剩餘空間
dis_total_space:磁盤總的大小空間

104、文件拷貝
copy()

105、刪除文件
unlink()

107、獲取文件類型
filetype()
重命名文件或者目錄
rename()
注意:這個函數不光可以重命名,還可以移動位置(Linux : mv)

108、文件截取
ftruncate()

109、文件屬性
file_exists()  is_readable()  is_writeable()  is_excutable()  filectime()  fileatime()  filemtime()

110、文件鎖
flock()

111、文件指針
ftell()  fseek()  rewind()

112、常規熟悉函數

時間日期函數
date()  strtotime()  mktime()  time()  microtime()  date_default_timezone_set()

mktime() : 取得一個日期的UNIX時間戳

mktime([ int $hour = date("H")[, int $minute = date("i")[, int $second = date("s")[, int $month = date("n")[, int $day = date("j")[, int $year = date("Y")[, int $is_dst = -1]]]]]]] )

IP處理函數
Ip2long()  long2ip()

打印處理
print() :語言結構,只能接收一個變量
printf() :根據格式來輸出,直接輸出到緩衝區
print_r() :將數組對象格式化輸出(false不會輸出,true輸出1)
echo() :語言結構,可以接收多個變量,同時打印多個,建議使用echo
sprintf() :根據格式進行返回
var_dump() :將數組對象格式化輸出,類型也會打印出來,推薦使用
var_export() :格式化輸出,符合PHP語法結構,加參數true,變爲返回

序列化和反序列化
serialize()  unserialize()

字符串處理函數
implode()  explode()  join()  strrev()  trim()  ltrim()  strstr()  number_format()

字符串常用的函數
.addcslashes—以C語言的分格使用反斜線轉義字符串中的字符
.addslashes—使用反斜線引用字符串
.bin2hex—把數據的二進制字符串轉換爲十六進制值
.chop—同rtrim,取出字符右邊的空白
.chr—返回ASCII所對應的字符
.ord—返回字符的ASCII值
.chunk_split—將字符串分割成小塊
.convert_cyr_string—將字符由一種cyrillic字符轉換爲另一種
.convert_uudecode—解碼一個uuencode編碼的字符串
.convert_uuencode—使用uuencode編碼一個字符串
.count_chars—統計字符串中每個字節出現的次數
.crc32—計算一個字符串的crc32多項式
.crypt—單向字符串散列
.explode—將字符串以某個字符分割爲多個字符,併成形爲一個數組
.fprintf—寫入一個根據format格式化後的字符串到由handle句柄打開的流中
.get_html_translation_table—返回使用htmlspecialchars和htmlentities後的轉換表
.hebrev—將邏輯順序希伯來文轉換爲視覺順序希伯來文
.hebrevc—將邏輯順序希伯來文轉換爲視覺順序希伯來文,並轉換換行符
.hex2bin—轉換十六進制字符串爲二進制字符串
.htmlspecialchars—將預定義字符轉換爲HTML實體
.htmlspecialchars_decode—把一些預定義的HTML的實體轉換爲字符
.implode—將一個數組的值轉換爲字符串
.join—implode的別名,將一個數組的值轉換爲字符串
.lcfirst—使一個字符串的第一個字符小寫
.levenshtein—計算兩個字符串之間的編輯距離
.ltrim—刪除字符串開頭的空白字符
.md5_file—計算指定文件的MD5散列值
.md5—計算字符的MD5的散列值
.money_format—將數字格式化成貨幣字符串
.nl2br—在字符串所有新行之前插入HTML換行標記
.number_format—以千位分隔符格式化一個數字
.rtrim—刪除字符串的末端的空白字符
.setlocate—設置地區信息
.sha1_file—計算文件的sha1散列值
.sha1—計算字符串的sha1散列值
.similar_text—計算倆個字符串的相似度
.sscanf—根據指定的格式解析輸入的字符
.str_getcsv—解析CSV字符串爲一個數組
.str_ireplace—str_replace的忽略大小寫版本
.str_pad—使用另一個字符串來填充字符串到指定的長度
.str_repeat—重複一個字符串
.str_replace—子字符串替換
.str_rot13—對字符串執行ROT13轉換
.str_shuffle—隨即打亂一個字符串
.str_split—將字符串轉換爲數組
.str_word_count—返回字符串中單詞的使用情況
.strcasecmp—不區分大小寫,二進制安全比較字符串
.strchr—查找字符串的首次出現
.strstr—查找字符串的首次出現
.strcmp—二進制安全比較字符串
.strcoll—基於區域設置的字符串比較
.strcspn—獲取不匹配遮罩的起始子字符串的長度
.strip_tags—從字符串中去除HTML和PHP標記
.stripslashes—反引用一個引用字符串
.stristr—不區分大小寫,查找字符串首次出現的位置(strpos)
.strlen—獲取字符串的長度
.strnatcasecmp—不區分大小寫的使用“自然順序”算法比較字符串
.strnatcmp—使用自然排序算法比較字符串
.strncmp—二進制安全比較字符串開頭的若干個字符
.strpbrk—在字符串中查找一組字符的任何一個字符
.strpos—查找字符串首次出現的位置
.strrchr—查找字符在字符串中最後一次出現的位置
.strrev—反轉字符串
.strripos—不區分大小寫計算字符串在目標字符串中最後一次出現的位置
.strrpos—計算字符串在目標字符串中最後一次出現的位置
.strspn—計算字符串中全部字符都存在於指定字符集合中的第一段子串的長度
.strtok—標記分割字符串
.strtolower—將字符串轉換爲小寫
.strtoupper—將字符串轉換爲大寫
.strtr—轉換指定字符
.substr_compare—從偏移位置比較指定長度二進制安全比較字符串
.substr_count—計算字符串出現的次數
.substr_replace—替換字符串的子串
.substr—截取字符串
.trim—去掉字符串首尾的空白符
.ucfirst—將字符串的首字母轉換爲大寫
.ucwords—將字符串的每個單詞的首字母轉換爲大寫
.vsprintf—返回格式化字符串
.wordwrap—打斷字符串爲指定數量的字符串
.vprintf—輸出格式化字符串
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章