PHP知識大全
———————————————————
PHP知識大全
———————————————————
1. 變數如何定義?如何檢查變數是否定義?如何刪除一個變數?怎樣檢測變數是否設定?
$定義 isset()// 檢測變數是否設定
defined()// 檢測常量是否設定
unset()//銷燬指定的變數
empty()// 檢測變數是否為空
2. 什麼是可變變數?
一個變數的變數名可以動態的設定和使用。
$a = `hello` , $$a = `world`, ${$a}=hello world
3. 變數賦值方式有哪幾種?
1)直接賦值 2)變數間賦值 3)引用賦值
4. 引用和拷貝有什麼區別?
拷貝是將原來的變數內容複製下來,拷貝後的變數與原來的變數使用各自的記憶體,互不干擾。
引用相當於是變數的別名,其實就是用不同的名字訪問同一個變數內容。當改變其中一個變數的值時,另一個也跟著發生變化。
5. php中變數有哪些基本資料型別?
php支援8種原始資料型別包括:
四種標量型別(布林型boolean,整型interger,浮點型float/double
, 字串string)
兩種複合型別(陣列array , 物件object)
兩種特殊型別(資源resource,NULL)
6. 其它型別轉換為boolean型別時,哪些被認為是false?
布林值false,整型值0, 浮點型值0.0, 空白字串, 字串`0`, 空陣列,特殊資料型別NULL, 沒有設定的變數。
empty()函式在哪些情況下返回true?
布林值false,整型值0, 浮點型值0.0, 空白字串, 字串`0`,
array()空陣列,特殊資料型別NULL, 沒有任何屬性的物件,沒有賦值的變數。
7. 如果定義了一個變數$a ,但是沒有賦初始值
那麼$a==0嗎? $a==false嗎? $a==“嗎?
$a==NULL嗎? $a===NULL嗎? 答:echo=>什麼都沒有 ,
var_dump=>NULL
empty($b)==true嗎?———————————— echo=>1 , var_dump=>bool(true)
此時如果輸出$a++是多少?——————— echo=>什麼都沒有 ,
var_dump=>NULL
如果輸出++$a又是多少?————————— echo=>1 ,
var_dump=>int(1)
8. 字串怎麼轉成整數,有幾種方法?怎麼實現?
強制型別轉換: (整型)字串變數名;
直接轉換:settype(字串變數,整型);
intval(字串變數);
9. 標量資料和陣列的最大區別是什麼?
一個標量只能存放一個資料,而陣列可以存放多個資料。
10. 常量如何定義? 如何檢測一個常量是否被定義?常量的值只能是哪些資料型別?
define()//定義常量 , defined()//檢查常量是否定義
常量的值只能是標量型別的資料。
11. 常量分為系統內建常量和自定義常量。請說出最常見的幾個系統內建常量?
__FILE__ , __LINE__ , PHP_OS , PHP_VERSION
12. 如果定義了兩個相同的常量,前者和後者哪個起作用?
前者起作用,因為常量一旦定義就不能被重新定義或者取消定義。
13. 常量和變數有哪些區別?
1)常量前沒有$符號;
2)常量只能通過define()定義,而不能通過賦值語句定義;
3)常量可以在任何地方定義和訪問,而變數有全域性和區域性之分;
4)常量一旦定義就不能被重新定義或者取消定義,而變數而通過賦值方式重新定義;
5)常量的值只能是標量資料,而變數的資料庫型別有8種原始資料型別。
14. PHP中常用的幾個預定義的全域性陣列變數是哪些?
有9大預定義的內建陣列變數:
$_POST, $_GET, $_REQUEST, $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS
15. 在實際開發中,常量最常用於哪些地方?
1)連線資料庫的資訊定義成常量,如資料庫伺服器的使用者名稱、密碼、資料庫名、主機名;
2)將站點的部分路徑定義成常量,如web絕對路徑,smarty的安裝路徑,model、view或者controller的資料夾路徑;
3)網站的公共資訊,如網站名稱,網站關鍵詞等資訊。
16. 函式的優越性有哪些?
提高程式的可維護性 提高軟體的可靠性 提高程式的可重用性 提高程式的開發效率
17. 如何定義一個函式?函式名區分大小寫嗎?
1)使用 function 關鍵字;
2)函式命名規則和變數一樣,以字母或者下劃線開頭,而不能以數字開頭;
3)函式名不區分大小寫;
4)函式名不可以使用已經宣告過的或者系統自建的函式名稱。
18. 什麼是變數的能見度 或者 說是變數作用域?
就是變數在程式中的可作用範圍。根據變數的能見度,變數分為區域性變數和全域性變數。
19. 什麼是區域性變數和全域性變數?函式內是否可以直接呼叫全域性變數?
區域性變數是函式內部定義的變數,其作用域是所在的函式。如果函式外還有一個跟區域性變數名字一樣的變數,程式會認為它們兩個是完全不同的兩個變數。當退出函式的時候,其中的區域性變數就同時被清除。全域性變數是定義在所有函式以外的變數,其作用域是整個php檔案,但是在使用者自定義的函式內部是無法使用的。如果一定要在使用者自定義的函式內部使用全域性變數,那麼就需要使用global關鍵字宣告。也就是說如果在函式內的變數前加上golbal來修飾,那麼函式內部就可以訪問到這個全域性變數,不僅可以利用這個全域性變數進行運算而且可以對這個全域性變數進行重新賦值。全域性變數還可以使用 $GLOBALS[`var`] 來呼叫。
21. 什麼是靜態變數?
如果一個函式內定義的變數前使用關鍵字static來宣告,那麼該變數就是靜態變數。
一般函式內的變數在函式呼叫結束後,其儲存的資料將被清除,所佔的記憶體空間也被釋放。而使用靜態變數時,該變數會在函式第一次被呼叫時被初始化,初始化後該變數也不會被清除,當再次呼叫該函式時,這個靜態變數不再被初始化,而能儲存上次函式執行完後的值。可以說靜態變數在所有對該函式的呼叫之間共享。
22. php中函式傳遞引數的方式有哪些?兩者有什麼區別?
按值傳遞和按地址傳遞(或按引用傳遞)
(1)按值傳遞: 待傳遞的變數,與傳遞給函式之後的變數是儲存在不同的空間中。所以函式體內對
該變數值做的修改,不影響原本的變數值。
(2)按地址傳遞: 使用 & 符號,表明該引數是以地址的方式傳遞值。並不會將主程式中的指定數值或目標變數傳遞給函式,而是把該數值或變數的記憶體儲存區塊地址匯入函式之中,所以函式體內的該變數和主程式中的該變數在記憶體中是同一個。函式體做的修改,直接影響到函式體外部的該變數的值。
23. 什麼是遞迴函式?如何進行遞迴呼叫?
遞迴函式其實就是呼叫自身的函式,但是必須滿足以下兩個條件:
1)在每一次呼叫自身時,必須是更接近於最終結果;
2)必須有一個確定的遞迴終止條件,不會造成死迴圈。
舉例說明:
在實際工作中往往會在遍歷資料夾的時候使用。
如果有個例子是希望獲取到目錄windows下所有的檔案,那麼先遍歷windows目錄,如果發現其中還有資料夾,那麼就會呼叫自身,繼續往下尋找,依次類推,
直到遍歷到再也沒有資料夾為止,這也就是意味著遍歷出來了所有的檔案。
24. 判斷一個函式是否存在?
function_exists( string $function_name ) 如果存在,返回true, 不存在則返回 false。
25. func()和@func()之間有什麼區別?
第二個函式呼叫失敗不會報錯,第一個會報錯
26. include()和require()函式的用法和區別是什麼?include_once()和require_once()呢?
include和require出現錯誤後的錯誤級別不一樣
include_once()和require_once()在載入之前要判斷是否已經匯入
27. 說出前置++和後置++的區別?
前置++是先將變數增加1,然後在將值賦值給原來的變數;
後置++是先返回變數的當前值,然後再將變數的當前值增加1.
28. 字串運算子“.”與算術運算子“+”有什麼區別?
當“a”“b”之間使用.時認為是連字元。如果兩者間是+的時候php會認為是一次運算。
1)如果+號兩邊的字串是數字組成的,那麼會將字串自動轉為整型;
2)如果+號兩邊是純粹的字母,那麼會輸出0;
3)如果+號兩邊的字串是以數字開頭的,那麼會擷取字串開頭的數字,然後進行運算。
29. 什麼是三目(或三元)運算子?
根據一個表示式的結果在另兩個表示式中選擇一個。
例如: ($a==true) ? `good`:`bad`;
30. 控制流程語句有哪些?
1:三種程式結構 順序結構、分支結構、迴圈結構
2:分支: if/esle/esleif/ switch/case/default
3: switch 需要注意的:
case子句中的常量可以是整型、字串型常量、 或者常量表示式,不允許是變數。
同一個switch子句中,case的值不能相同,否則只能取到首次出現case中的值。
4: 迴圈 for while do…while
do…while 後面必須加入分號結尾。
while 和 do…while 的區別
5:break 和 continue 的區別。
break可以終止迴圈。
continue沒有break強大,只能終止本次迴圈而進入到下一次迴圈中。
31. 陣列的概念是什麼?陣列根據索引分為哪兩種,如何區分?陣列的賦值方式有哪兩種?
陣列是一個可以儲存一組或一系列數值的變數(複合型變數)
索引陣列(索引值為數字,以0開始)和關聯陣列(以字串作為索引值)
陣列的賦值方式有哪兩種?
陣列的宣告方式主要有兩種。
1.通過array()函式宣告陣列;
可以通過key=>value的方式分別定義索引和值,也可以不定義陣列的索引下標,只給出陣列的元素值。
2.直接為陣列元素賦值,不需要呼叫array()函式。例如:
$arr[0] = 1; $arr[1] = 2;
特別注意:
陣列的下標如果是等價於整數的字串值(但不能以0開頭),則會被當作整數對待。
例如: $array[3] 與 $array[`3`] 引用的是相同的一個元素,而 $array[`03`] 引用的則就是另外的一個元素了。
32.陣列如何遍歷?
①for迴圈
②foreach迴圈 ,這是最常用的遍歷方式。用法如下:foreach($arr
as $key=>$value){}
③list each 和while 配合起來迴圈
33. foeach陣列的時候指標是如何指向的?list()/each()/while()迴圈陣列的時候指標如何指向的呢?
當foreach開始執行的時候,陣列內部的指標會自動指向第一個單元。因為foreach所操作的是指定陣列的拷貝,而不是該陣列本身。而each()一個陣列後,陣列指標將停留在陣列中的下一個單元或者碰到陣列結尾時停留在最後一個單元。如果要再次使用each()遍歷陣列,必須要使用reset().
reset()將陣列的內部指標倒回到第一個單元並返回第一個陣列單元的值。
34. 如何計算陣列長度(或者說計算陣列中所有元素的個數)?字串怎麼取長度?
count() — 計算陣列中的元素個數。
可以使用count(陣列名)或者count(陣列名,1),如果有第二個引數,並且是數字1,則表示遞迴統計陣列元素的個數。如果第二個引數是數字0,則等同於只有一個引數的count()函式。
sizeof() — count() 的別名(count — 計算陣列中的單元數目或物件中的屬性個數)
字串:strlen()— 獲取字串長度
mb_strlen()— Get string length
35. 陣列中相關的常用函式有哪些?
1) count —(sizeof別名)— 計算陣列中的單元數目或物件中的屬性個數
例如:int count ( mixed $var [, int $mode ] ) $var 通常都是陣列型別,任何其它型別都只有一個單元。 $mode 預設值為0.
1為開啟遞迴地對陣列計數
2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 檢查陣列中是否存在某個值。如果needle 是字串,則比較是區分大小寫的。如果第三個引數 strict 的值為 TRUE 則 in_array() 函式還會檢查needle 的型別是否和 haystack 中的相同。
3) array_merge(array $array1 [, array $array2 [, array $… ]] ) 將一個或多個陣列的單元合併起來,一個陣列中的值附加在前一個陣列的後面。返回作為結果的陣列。
特別注意:如果輸入的陣列中有相同的字串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果陣列包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
如果只給了一個陣列並且該陣列是數字索引的,則鍵名會以連續方式重新索引
4) 陣列與字串之間的轉換
(1)explode ( string $separator , string $string [, int $limit ] ) 使用一個分隔字元來分隔一個字串。
(2)implode ( string $glue , array $arr ) 使用一個連線符將陣列中的每個單元連線為一個字串。join為 implode 的別名
5) sort(array &$array [, int $sort_flags ]) — 對陣列按照值排序,當本函式結束時陣列單元將被從最低到最高重新安排。
36. 陣列合並函式array_merge()和陣列加法運算$arr
+ $arr2 的區別是什麼?
array_merge()->使用array_merge(),如果是關聯陣列合並,如果陣列的鍵名相同,那麼後面的值將覆蓋前者;如果是數字索引陣列合並,則不覆蓋,而是後者附加到前者後面。“+”->使用陣列加法運算,與array_merge()不同,加法運算不管是關聯陣列還是數字索引陣列,都是將相同鍵名的的值捨棄,也就是隻保留首次出現該鍵名的元素,後來的具有相同鍵名的元素都不會被加進來。
37. 字串定義的時候單引號和雙引號有什麼區別?
單引號載入速度比雙引號載入速度快
38. echo(),print(),print_r()的區別?
(1)echo 是語法,Output one or more strings,沒有返回值;
(2)print 是函式,不能輸出陣列和物件,Output a string,print有返回值;
(3)print_r 是函式,可以輸出陣列。print_r是個比較有意思的函式,可以輸出stirng、int、float、 array、object等,輸出array時會用結構表示,print_r輸出成功時返回true;而且print_r可以通過print_r($str,true)來,使print_r不輸出而返回print_r處理後的值。此外,對於echo和print,基本以使用echo居多,因為其效率比print要高。
39. 按照功能分類說說都有哪些字串處理函式?這些函式的作用是什麼?
A. 字串輸出函式
(1)echo $a,$b,$c……; 是一個語言結構,而不是一個真正的函式。
(2)print($a) 本函式輸出字串。若成功則返回 1,失敗返回 0
(3)print_r($a)
(4)var_dump($a); 能輸出型別、長度、值
B. 去除字串首尾空格的函式: trim ltrim rtrim(別名:chop) 使用第二個引數,還可以去除指定的字元。
C. 轉義字串函式:addslashes()
D. 獲取字串長度的函式:strlen()
E. 擷取字串長度的的函式:substr()
F. 檢索字串函式: strstr() , strpos()
G. 替換字串函式:str_replace()
40. 請給出以下問題的正確答案?
1).$arr = array(`james`, `tom`, `symfony`);請將$arr陣列的值用’,’分割併合併成字串輸出? echo
implode(‘,’,$arr);
2).$str = ‘jack,james,tom,symfony’; 請將$str用’,’分割,並把分割後的值放到$arr陣列中? $arr
= explode(‘,’,$str);
3).$arr = array(3,7,2,1,’d’,’abc’); 請將$arr按照從大到小的順序排序,並保持其鍵值不變? arsort($arr);
print_r($arr);
4).$mail = “gaofei@163.com”; 請將此郵箱的域(163.com)取出來並列印,看最多能寫出幾種方法?
echo strstr($mail,`163`);
echo substr($mail,7);
$arr = explode(“@”,$mail); echo $arr[1];
5). 如果有一個字串,該字串是“123,234,345,”。請問如何切割掉這個字串最後一個逗號?
6). 獲取隨機數的函式有哪幾個?mt_rand() 和 rand()哪個執行速度快?
41.頁面字元出現亂碼,怎麼解決?
1.首先考慮當前檔案是不是設定了字符集。檢視是不是meta標籤中寫了charset,如果是php頁面還可以看看是不是
在header()函式中指定了charset;
例如:
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
header(“content-type:text/html;charset=utf-8”);
2.如果設定了字符集(也就是charset),那麼判斷當前檔案儲存的編碼格式是否跟頁面設定的字符集保持一致,
兩者必須保持統一;
3.如果涉及到從資料庫提取資料,那麼判斷資料庫查詢時的字符集是否跟當前頁面設定的字符集一致,兩者必須統一,
例如:mysql_query(“set
names utf8”)。
42. 正規表示式是什麼?php中有哪些常用的跟正則相關的函式?請寫出一個email的正則,中國手機號碼和座機號碼的正規表示式?
正規表示式是用於描述字元排列模式的一種語法規則。正規表示式也叫做模式表示式。
網站開發中正規表示式最常用於表單提交資訊前的客戶端驗證。
比如驗證使用者名稱是否輸入正確,密碼輸入是否符合要求,email、手機號碼等資訊的輸入是否合法
在php中正規表示式主要用於字串的分割、匹配、查詢和替換操作。
preg系列函式可以處理。具體有以下幾個:
string preg_quote ( string str [, string delimiter] )
轉義正規表示式字元 正規表示式的特殊字元包括:.
\ + * ? [ ^ ] $ ( ) { } = ! < > | :。
preg_replace — 執行正規表示式的搜尋和替換
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]
preg_replace_callback — 用回撥函式執行正規表示式的搜尋和替換
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
preg_split — 用正規表示式分割字串
array preg_split ( string pattern, string subject [, int limit [, int flags]] )
常用的正規表示式寫法:
中文:/^[u4E00-u9FA5]+$/
手機號碼:/^(86)?0?1d{10}$/
EMAIL:
/^[w-]+[w-.]?@[w-]+.{1}[A-Za-z]{2,5}$/
密碼(安全級別中):
/^(d+[A-Za-z]w*|[A-Za-z]+dw*)$/
密碼(安全級別高):
/^(d+[a-zA-Z~!@#$%^&(){}][w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+d[w~!@#$%^&(){}]*)$/
44. preg_replace()和 str_ireplace()兩個函式在使用上有什麼不同?preg_split()和split()函式如何使用?
preg_replace — 執行正規表示式的搜尋和替換
str_ireplace — str_replace() 的忽略大小寫版本 str_replace — 子字串替換
preg_split — 用正規表示式分割字串
split — 用正規表示式將字串分割到陣列中
45. 獲取當前時間戳的函式主要有哪些?用PHP列印出今天的時間,格式是2010-12-10
22:21:21?
用PHP列印出前一天的時間格式是2010-12-10
22:21:21?如何把2010-12-25 10:30:25變成unix時間戳?
echo date (“Y-m-d H:i:s” ,strtotime(‘-1,days’));
date(`Y-m-d H:i:s`,time());
$unix_time = strtotime(“2009-9-2 10:30:25”);//變成unix時間戳
echo date(“Y-m-d H:i:s”,$unix_time);//格式化為正常時間格式
46. 在url中用get傳值的時候,若中文出現亂碼,應該用哪個函式對中文進行編碼?
使用者在網站表單提交資料的時候,為了防止指令碼攻擊(比如使用者輸入<script>alert(111);</script>),php端接收資料的時候,應該如何處理?
使用urlencode()對中文進行編碼,使用urldecode()來解碼。
使用htmlspecialchars($_POST[‘title’])來過濾表單傳參就可以避免指令碼攻擊。
48. 說說mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之間有什麼區別?
第一個是返回結果集中的一行作為索引陣列,第二個是返回關聯陣列,而第三個既可以返回索引陣列也可以返回關聯陣列,取決於它的第二個引數 MYSQL_BOTH MYSQL_NUM MYSQL_ASSOC 預設為MYSQL_BOTH
$sql =”select * from table1”;
$result = mysql_query($sql);
mysql_fetch_array($result, MYSQL_NUM);
49. 請說出目前學過的返回是資源的函式?
答: fopen(開啟檔案)
imagecreatefromjpeg(png gif) — 從 JPEG 檔案新建一影像
imagecreatetruecolor — 新建一個真彩色影像
imagecopymerge — 拷貝併合並影像的一部分
imagecopyresized — 拷貝部分影像並調整大小
mysql_connect — 開啟一個到 MySQL 伺服器的連線
mysql_query();只有這執行select的時候成功,才返回資源,失敗返回FALSE
50. 開啟、關閉檔案分別是什麼函式? 檔案讀寫是什麼函式?刪除檔案是哪個函式?
判斷一個檔案是否存在是哪個函式?新建目錄是哪個函式?
51. 檔案上傳需要注意哪些細節?怎麼把檔案儲存到指定目錄?怎麼避免上傳檔案重名問題?
1.首現要在php.ini中開啟檔案上傳;
2.在php.ini中有一個允許上傳的最大值,預設是2MB。必要的時候可以更改;
3.上傳表單一定要記住在form標籤中寫上enctype=”multipart/form-data”;
4. 提交方式 method 必須是 post;
5. 設定 type=”file” 的表單控制元件;
6.要注意上傳檔案的大小MAX_FILE_SIZE、檔案型別是否符合要求,上傳後存放的路徑是否存在。
可以通過上傳的檔名獲取到檔案字尾,然後使用時間戳+檔案字尾的方式為檔案重新命名,這樣就避免了重名。可以自己設定上傳檔案的儲存目錄,與檔名拼湊形成一個檔案路徑,使用move_uploaded_file(),就可以完成將檔案儲存到指定目錄。
52. $_FILES是幾維陣列?第一維和第二維的索引下標分別是什麼?批量上傳檔案的時候需要注意什麼?
二維陣列。第一維是上傳控制元件的name,二維下標分別為name/type/tmp_name/size/error.
53. header()函式主要的功能有哪些?使用過程中注意什麼?
答:
header()傳送http頭資訊
-header(“content-type:text/html; charset=utf-8”);——————-//當前頁面輸出內容是html,編碼為utf-8格式
-<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
-header(“content-type:image/png gif jpeg”);———————————-//當前頁面輸出內容的格式是圖片
-header(“refresh:5;url=http://www.1004javag.com/five/string.php”);–//頁面5秒後要跳轉到新網址
-header(“location:http://1004javag.com/five/string.php”);———–//頁面重定向
54. 檔案下載的時候如果使用header()函式?
答:header(“content-type: application/octet-stream;charset=UTF-8”); //在這裡加utf-8和在上面定義有什麼區別?、??
header(“accept-ranges: bytes”);
header(“accept-length: “.filesize($filedir.$filename));
header(“content-disposition: attachment; filename=”.$filedir.$filename);
55. 什麼是ajax?ajax的原理是什麼?ajax的核心技術是什麼?ajax的優缺點是什麼?
ajax是asynchronous javascript and xml的縮寫,是javascript、xml、css、DOM等多個技術的組合。 `$`是jQuery的別名.
頁面中使用者的請求通過ajax引擎非同步地與伺服器進行通訊,伺服器將請求的結果返回給這個ajax引擎,
最後由這個ajax引擎來決定將返回的資料顯示到頁面中的指定位置。Ajax最終實現了在一個頁面的指定位置可以載入另一個頁面所有的輸出內容。
這樣就實現了一個靜態頁面也能獲取到資料庫中的返回資料資訊了。所以ajax技術實現了一個靜態網頁在不重新整理整個頁面的情況下與伺服器通訊,
減少了使用者等待時間,同時也從而降低了網路流量,增強了客戶體驗的友好程度。
Ajax的優點是:
1. 減輕了伺服器端負擔,將一部分以前由伺服器負擔的工作轉移到客戶端執行,利用客戶端閒置的資源進行處理;
2. 在只區域性重新整理的情況下更新頁面,增加了頁面反應速度,使使用者體驗更友好。
Ajax的缺點是不利於seo推廣優化,因為搜尋引擎無法直接訪問到ajax請求的內容。
ajax的核心技術是XMLHttpRequest,它是javascript中的一個物件。
56. jquery是什麼?jquery簡化ajax後的方法有哪些?
jQuery是Javascript的一種框架。
$.get(),$.post(),$.ajax()。$是jQuery物件的別名。
程式碼如下:
$.post(非同步訪問的url地址 ,
{`引數名` : 引數值} , function(msg){
$(“#result”).html(msg);
});
$.get(非同步訪問的url地址 , {`引數名`
: 引數值} , function(msg){
$(“#result”).html(msg);
});
$.ajax({
type: “post”,
url: loadUrl,
cache:false,
data: “引數名=” + 引數值,
success: function(msg) {
$(“#result”).html(msg);
}
});
57. 什麼是會話控制?
簡單地說會話控制就是跟蹤和識別使用者資訊的機制。會話控制的思想就是能夠在網站中跟蹤一個變數,通過這個變數,系統能識別出相應的使用者資訊,根據這個使用者資訊可以得知使用者許可權,從而展示給使用者適合於其相應許可權的頁面內容。目前最主要的會話跟蹤方式有cookie,session。
58. 會話跟蹤的基本步驟
1).訪問與當前請求相關的會話物件 2).查詢與會話相關的資訊
3).儲存會話資訊 4).廢棄會話資料
59. 使用cookie的注意事項有哪些?
1) setcookie()之前不可以有任何頁面輸出,就是空格,空白行也不可以;
2) setcookie()後,在當前頁面呼叫$_COOKIE[`cookiename`]不會有輸出,必須重新整理或到下一個頁面才可以看到cookie值;
3) 不同的瀏覽器對cookie處理不同,客戶端可以禁用cookie,瀏覽器也可以閒置cookie的數量,一個瀏覽器能建立的cookie數量最多300個,並且每個不可以超過4kb,
每個web站點能設定的cookie總數不能超過20個。
4) cookie是儲存在客戶端的,使用者禁用了cookie,那麼setcookie就不會起作用了。所以不可以過度依賴cookie。
60. 使用session的時候,通過什麼來表示當前使用者,從而與其他使用者進行區分?
sessionid,通過session_id()函式可以取得當前的session_id。
61. session和cookie的使用步驟分別是什麼?什麼是sesssion和cookie的生命週期?session和cookie的區別是什麼?
cookie是儲存在客戶端機器的,對於未設定過期時間的cookie,cookie值會儲存在機器的記憶體中,只要關閉瀏覽器則cookie自動消失。如果設定了cookie的過期時間,那麼瀏覽器會把cookie以文字檔案的形式儲存到硬碟中,當再次開啟瀏覽器時cookie值依然有效。
session是把使用者需要儲存的資訊儲存在伺服器端。每個使用者的session資訊就像是鍵值對一樣儲存在伺服器端,其中的鍵就是sessionid,而值就是使用者需要儲存資訊。伺服器就是通過sessionid來區分儲存的session資訊是哪個使用者的。
兩者最大的區別就是session儲存在伺服器端,而cookie是在客戶端。session安全性更高,而cookie安全性弱。
session在web開發中具有非常重要的份量。它可以將使用者正確登入後的資訊記錄到伺服器的記憶體中,當使用者以此身份訪問網站的管理後臺時,無需再次登入即可得到身份確認。而沒有正確登入的使用者則不分配session空間,即便輸入了管理後臺的訪問地址也不能看到頁面內容。通過session確定了使用者對頁面的操作許可權。
使用session的步驟:
1. 啟動session:使用session_start()函式來啟動。
2. 註冊會話:直接給$_SESSION陣列新增元素即可。
3. 使用會話:判斷session是否為空或者是否已經註冊,如果已經存在則像普通陣列使用即可。
4. 刪除會話:
1.可以使用unset刪除單個session;
2.使用$_SESSION=array()的方式,一次登出所有的會話變數;
3.使用session_destroy()函式來徹底銷燬session。
cookie怎麼使用?
1. 記錄使用者訪問的部分資訊
2. 在頁面間傳遞變數
3. 將所檢視的internet頁儲存在cookies臨時資料夾中,可以提高以後的瀏覽速度。
建立cookie:setcookie(string
cookiename , string value , int expire);
讀取cookie:通過超級全域性陣列$_COOKIE來讀取瀏覽器端的cookie的值。
刪除cookie:有兩種方法
1.手工刪除方法:
右擊瀏覽器屬性,可以看到刪除cookies,執行操作即可將所有cookie檔案刪除。
2.setcookie()方法:
跟設定cookie的方法一樣,不過此時將cookie的值設定為空,有效時間為0或小於當前時間戳。
62. 如何設定一個cookie的名字為username,值為jack,並且讓此cookie一週後失效?
一個瀏覽器最多可以產生多少個cookie,每個cookie檔案最大不能超過多少?
setcookie(‘username’,’jack’,time()+7*24*3600);
最多可以產生20個cookie,每個最多不超過4K
63. 設定或讀取session之前,需要做什麼?
可以直接在php.ini中開啟session.auto_start
= 1或者在頁面頭部用session_start();
開啟session,session_start()前面不能有任何輸出,包括空行。
64. 在實際開發中,session在哪些場合使用?
session用來儲存使用者登入資訊和用在跨頁面傳值。
1)常用在使用者登入成功後,將使用者登入資訊賦值給session;
2)用在驗證碼圖片生成,當隨機碼生成後賦值給session。
65. 登出session會話的形式有幾種?
unset() $_SESSION=array(); session_destroy();
66. 什麼是OOP?什麼是類和物件?什麼是類屬性?
OOP(object oriented programming),即物件導向程式設計,其中兩個最重要的概念就是類和物件。
世間萬物都具有自身的屬性和方法,通過這些屬性和方法可以區分出不同的物質。
屬性和方法的集合就形成了類,類是物件導向程式設計的核心和基礎,
通過類就將零散的用於實現某個功能的程式碼有效地管理起來了。
類只是具備了某些功能和屬性的抽象模型,而實際應用中需要一個一個實體,也就是需要對類進行例項化,類在例項化之後就是物件。類是物件的抽象概念,物件是類的例項化。
物件是一個高階的陣列,陣列是一個最原始的物件,同樣的物件也可以遍歷
OOP具有三大特點:
1. 封裝性:也稱為資訊隱藏,就是將一個類的使用和實現分開,只保留部分介面和方法與外部聯絡,或者說只公開了一些供開發人員使用的方法。於是開發人員只需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程式間相互依賴,實現程式碼模組間鬆藕合。
2. 繼承性:就是子類自動繼承其父級類中的屬性和方法,並可以可以新增新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了程式碼的可重用性。 php只支援單繼承,也就是說一個子類只能有一個父類。
3. 多型性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。於是多個子類中雖然都具有同一個方法,但是這些子類例項化的物件呼叫這些相同的方法後卻可以獲得完全不同的結果,這種技術就是多型性。多型性增強了軟體的靈活性。
OOP的優點:1、程式碼重用性高(省程式碼) 2、使程式的可維護性高(擴充套件性) 3、靈活性
67. 常用的屬性的訪問修飾符有哪些?分別代表什麼含義?
private,protected,public。
類外:public ,var
子類中:public,protected
,var
本類中:private,protected,public
,var
如果不使用這三個關鍵詞,也可以使用var關鍵字。但是var不可以跟許可權修飾詞一起使用。var定義的變數,子類中可以訪問到,類外也可以訪問到,相當於public
類前面:只能加final,abstract
屬性前面:必須有訪問修飾符(private,protected,public,var)
方法前面:static,final,private,protected,public ,abstract
68. $this和self、parent這三個關鍵詞分別代表什麼?在哪些場合下使用?
$this 當前物件 self 當前類 parent 當前類的父類
$this在當前類中使用,使用->呼叫屬性和方法。
self也在當前類中使用,不過需要使用::呼叫。 parent在類中使用。
69.類中如何定義常量、如何類中呼叫常量、如何在類外呼叫常量。
類中的常量也就是成員常量,常量就是不會改變的量,是一個恆值。
定義常量使用關鍵字const.
例如:const PI = 3.1415326;
無論是類內還是類外,常量的訪問和變數是不一樣的,常量不需要例項化物件,
訪問常量的格式都是類名加作用域操作符號(雙冒號)來呼叫。
即:類名 :: 類常量名;
70. 作用域操作符::如何使用?都在哪些場合下使用?
呼叫類常量 呼叫靜態方法
71. 什麼是魔術方法?常用的魔術方法有哪幾個?
以__開頭的系統自定義的方法。
__construct() __destruct() __autoload() __call() __tostring()
72. 什麼是構造方法和析構方法?
構造方法就是在例項化一個物件的同時自動執行的成員方法,作用就是初始化物件。
php5之前,一個跟類名完全相同的方法是構造方法,php5之後魔術方法__construct()就是構造方法。如果類中沒有定義構造方法,那麼php會自動生成一個,這個自動生成的構造方法沒有任何引數,沒有任何操作。
構造方法的格式如下:
function __construct(){}
或者:function 類名(){}
構造方法可以沒有引數,也可以有多個引數。
析構方法的作用和構造方法正好相反,是物件被銷燬時被自動呼叫的,作用是釋放記憶體。
析構方法的定義方法為:__destruct();
因為php具有垃圾回收機制,能自動清除不再使用的物件,釋放記憶體,一般情況下可以不手動建立析構方法。
73. __autoload()方法的工作原理是什麼?
使用這個魔術函式的基本條件是類檔案的檔名要和類的名字保持一致。
當程式執行到例項化某個類的時候,如果在例項化前沒有引入這個類檔案,那麼就自動執行__autoload()函式。這個函式會根據例項化的類的名稱來查詢這個類檔案的路徑,當判斷這個類檔案路徑下確實存在這個類檔案後就執行include或者require來載入該類,然後程式繼續執行,如果這個路徑下不存在該檔案時.
就提示錯誤。使用自動載入的魔術函式可以不必要寫很多個include或者require函式。
74. 什麼是抽象類和介面?抽象類和介面有什麼不同和相似的地方?
抽象類是一種不能被例項化的類,只能作為其他類的父類來使用。
抽象類是通過關鍵字 abstract 來宣告的。
抽象類與普通類相似,都包含成員變數和成員方法,兩者的區別在於,抽象類中至少要包含一個抽象方法,
抽象方法沒有方法體,該方法天生就是要被子類重寫的。
抽象方法的格式為:abstract function abstractMethod();
因為php中只支援單繼承,如果想實現多重繼承,就要使用介面。也就是說子類可以實現多個介面。介面類是通過interface關鍵字來宣告的,介面類中的成員變數和方法都是public的,方法可以不寫關鍵字public,介面中的方法也是沒有方法體。介面中的方法也天生就是要被子類實現的。抽象類和介面實現的功能十分相似,最大的不同是介面能實現多繼承。在應用中選擇抽象類還是介面要看具體實現。子類繼承抽象類使用extends,子類實現介面使用implements。
抽象類至少有一個抽象方法嗎??????
答:如果一個類宣告成抽象類,裡面可以沒有抽象方法
如果一個類中有抽象方法,這個類必須是抽象類
75. __call的引數有幾個,型別是什麼,意義是什麼?
魔術方法__call()的作用是當程式呼叫一個不存在或不可見的成員方法時,php會先呼叫__call()方法,將那個不存在的方法的方法名和引數都儲存下來。
__call()包含兩個引數, 第一個引數是那個不存在的方法的方法名,是個字串型別;
第二個引數是那個不存在的方法的所有引數,是個陣列型別。
本人認為__call()方法的意義更多在於除錯,可以定位到錯誤。同時可以捕捉異常,如果某個方法不存在,則執行其它可替代方法。
76. smarty模板技術的用途是什麼?
為了php與html分開,美工和程式設計師各司其職,互不干擾。
77. smarty配置主要有哪幾項?
1. 引入smarty.class.php;
2. 例項化smarty物件;
3. 重新修改預設的模板路徑;
4. 重新修改預設的編譯後檔案的路徑;
5. 重新修改預設的配置檔案的路徑;
6. 重新修改預設的cache的路徑。
7. 可以設定是否開啟cache。
8. 可以設定左側和右側定界符。
78. smarty在使用過程中需要注意哪些細節?
Smarty是基於MVC概念的一種模板引擎,它將一個頁面程式分成了兩部分來實現:即檢視層和控制層,也就是說smarty技術將使用者UI與php程式碼分離開。這樣程式設計師和美工各司其職,互不干擾。
smarty運用過程中要注意以下幾個問題:
1.正確配置smarty。主要要例項化smarty物件,配置smarty模板檔案的路徑;
2.php頁面中使用assign賦值 和 display顯示頁面;
3.smarty模板檔案中不允許出現php程式碼段,所有的註釋,變數,函式都要包含在定界符內。
A.{}
B. foreach
C. if else
D. include
E. literal
79. MVC的概念是什麼?各層主要做什麼工作?
MVC(即模型–檢視–控制器)是一種軟體設計模式或者說程式設計思想。
M指Model模型層,V是View檢視層(顯示層或者使用者介面),C是Controller控制器層。
使用mvc的目的是實現M和V分離,從而使得一個程式可以輕鬆使用不同的使用者介面。
在網站開發中,
模型層一般負責對資料庫表資訊進行增刪改查,
檢視層負責顯示頁面內容,
控制器層在M和V之間起到調節作用,控制器層決定呼叫哪個model類的哪個方法,
執行完畢後由控制器層決定將結果assign到哪個view層。
81. java語言中方法重寫和過載分別代表什麼意思?準確說php支援方法的過載嗎?很多參考書中提到的php過載實際上該如何正確理解?
答:
php不支援方法的過載,很多書裡提到的PHP‘過載’應該是‘重寫’
82. final關鍵字能定義類中的成員屬性嗎?
答:不能,類的成員屬性只能有public ,private , protected ,var 來定義
83. final關鍵字定義的類能夠被繼承嗎?
答:final定義的類不能被繼承
84. 說說static關鍵字的使用場合?static能用在class前嗎?
static可以跟public,protected,private一起使用嗎?構造方法可以是static的嗎?
答: static可以在屬性和方法前面使用,呼叫static屬性或者方法時,只要將類載入就可用,不用例項化
static不能用在class的前面
static可以跟public,protected,private一起使用,在方法的前面;
▲構造方法不能是static
85. 介面可以例項化嗎?抽象類能例項化嗎?
答:介面和抽象類都不能被例項化
86. class前面能加訪問修飾符嗎?如果能加,只能是哪幾個訪問修飾符?可以是許可權訪問修飾符public,protected,private嗎?
答:class前面可以加final,static;
class前面不能加public,protected,private
87. 類中屬性前可以不加訪問修飾符嗎?成員變數前的修飾符只能是public,protected,private嗎?還可以是哪幾個?
答:類中的屬性必須加修飾符,除了那3個以外,還可以加var
88. 如果echo一個陣列,頁面輸出什麼?echo一個物件呢?print一個陣列或者物件呢?
答:頁面只能輸出“Array”;echo一個物件會出現“Catchable
fatal error: Object of class t2 could not be converted to string in G:php2 2.php on line 33”
print一個陣列時也只是輸出“Array”,print一個物件出現“Catchable
fatal error: Object of class t2 could not be converted to string in G:php2 2.php ”
▲print和echo是一樣的
89. __tostring()魔術方法在什麼時候被自動執行? __tostring()魔術方法必須要return返回值嗎?
當echo或者print一個物件時,就是自動觸發。而且__tostring()必須要返回一個值
90. 什麼是抽象方法?
答:在方法前面有abstract,而且方法沒有方法體,連“{
}”也不能有
91. 如果一個類中有一個方法是抽象方法,而這個類沒有定義成抽象類,會報錯嗎?
答:會,”Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement
the remaining methods (t2::ee) in”
92. 如果一個類是抽象類,而類中的方法都是非抽象的方法,會報錯嗎?
答:不會報錯,如果一個類是抽象類,其中可以沒有抽象方法,但是一個類中有個方法是抽象方法,那麼這個類一定是一個抽象類
94. final 關鍵字的應用應注意的問題?
使用final關鍵字定義的類,禁止繼承。
使用final關鍵字定義的方法,禁止重寫。
95. 如果一個類既要繼承一個父類,又要實現多個介面,該如何寫?
書寫格式例如: class MaleHuman extends Human implements Animal,Life { … }
96. 什麼是單點入口呢?
所謂單點入口就是整個應用程式只有一個入口,所有的實現都通過這個入口來轉發,
比如說在上面我們就使用index.php作為程式的單點入口,當然這個是可以由你自己任意控制的。
單點入口有幾大好處:
第一、一些系統全域性處理的變數,類,方法都可以在這裡進行處理。比如說你要對資料進行初步的過濾,你要模擬session處理,你要定義一些全域性變數,甚至你要註冊一些物件或者變數到註冊器裡面
第二、程式的架構更加清晰明瞭。
97. PHP提供了2套正規表示式函式庫,分別是哪兩套?【
(1) PCRE Perl相容正規表示式 preg_ 為字首
(2) POSIX 行動式的作業系統介面 ereg_ 為字首
98. 正規表示式的組成?
由原子(普通字元,如英文字元)、
元字元(有特殊功用的字元)
模式修正字元
一個正規表示式中,至少包含一個原子
99. 不常用魔術方法的觸發時機?
__isset() __unset()的觸發時機
__sleep()、 __wakeup() 在對物件進行序列化的時候呼叫
如果序列化物件的時候,不寫__sleep()方法,則所有的成員屬性都會被序列化,而定義了__sleep()方法,則只序列化指定陣列中的變數。因此,如果有非常大的物件而並不需要完全儲存下來時此函式也很有用。
使用 __sleep 的目的是關閉物件可能具有的任何資料庫連線,提交等待中的資料或進行類似的清除任務。此外,如果有非常大的物件而並不需要完全儲存下來時此函式也很有用。
使用 __wakeup 的目的是重建在序列化中可能丟失的任何資料庫連線以及處理其它重新初始化的任務。
101.常見框架
thinkPHP yii ZendFramework CakePhp sy
102. 常用魔術方法的觸發時機?
1)__autoload() :當程式例項化某個類,而該類沒有在當前檔案中被引入。此時會觸發執行__autoload()。程式希望通過該方法,自動引入這個類檔案。該方法有一個引數,即就是那個忘記引入的類的名稱。__autoload()方法的工作原理是什麼?當程式執行到例項化某個類的時候,如果在例項化前沒有引入這個類檔案,那麼就自動執行__autoload()函式。這個函式會根據例項化的類的名稱來查詢這個類檔案的路徑,當判斷這個類檔案路徑下確實存在這個類檔案後,就執行include或者require來載入該類,然後程式繼續執行,如果這個路徑下不存在該檔案時就提示錯誤。使用自動載入的魔術函式可以不必要寫很多個include或者require函式。
2)__construct() :這個是魔術構造方法。構造方法是例項化物件的時候自動執行的方法,作用就是初始化物件。該方法可以沒有引數,也可以有多個引數。如果有引數,那麼new這個物件的時候要記得寫上相應的引數。在php5以前,沒有魔術構造方法,普通構造方法是一個跟類名同名的方法來實現構造的。如果一個類中既寫了魔術構造方法,又定義了普通構造方法。那麼php5以上版本中,魔術方法起作用,普通構造方法不起作用。反之,在php5以前版本中,不認識魔術構造方法,只是把該方法當做普通的方法。
3)__destruct() :這個是魔術析構方法。析構方法的作用和構造方法正好相反,是物件被銷燬時被自動呼叫的,作用是釋放記憶體。析構方法沒有引數。
4)__call() :當程式呼叫一個不存在或不可見的成員方法時,自動觸發執行__call()。它有兩個引數,分別是未訪問到的方法名稱和方法的引數。而第二個引數是陣列型別。
5)__get() :當程式呼叫一個未定義或不可見的成員屬性時,自動觸發執行__get()。它有一個引數,表示要呼叫的屬性的名稱。
6)__set():當程式試圖寫入一個不存在或不可見的成員屬性時,PHP就會自動執行__set()。它包含兩個引數,分別表示屬性名稱和屬性值。
7)__tostring() :當程式使用echo或print輸出物件時,會自動呼叫該方法。目的是希望通過該方法將物件轉化為字串,再輸出。__tostring() 無引數,但是該方法必須有返回值。
8)__clone() :當程式clone一個物件的時候,能觸發__clone()方法,程式希望通過這個魔術方法實現:不僅僅單純地克隆物件,還需要克隆出來的物件擁有原來物件的所有屬性和方法。
103. MVC的概念是什麼?
MVC(即模型–檢視–控制器)是80年代發明的一種軟體設計模式或者說程式設計思想。
M指模型層,V是指檢視層(顯示層或者使用者介面),C是指控制層。
使用mvc的目的是實現M和V分離,從而使得一個程式可以輕鬆使用不同的使用者介面。
C存在的目的則是在M和V之間起到調節作用,確保M和V的同步,一旦M改變,V應該能同步更新。
將M和V分離,就可以做到同一個網頁,在不同節日到來的時候能顯示不同的頁面風格,這隻需要提前製作多個檢視層模板頁面,
而無需更改M層程式。
MVC做到了程式設計中的分工合作,程式碼的可重用性得到最大化體現,程式邏輯更加清晰而富有條理,便於後期維護管理。
104、 訪問許可權修飾符有哪幾種,對比解釋
答:1、public 表示公共的,在本類中和子類中以及類外,可以對其呼叫
2、protected表示受保護的,可以在本類中和子類中呼叫
3、private表示私有的,只能在本類中呼叫
4、var,效果等同於public
105、 Class關鍵詞前可以有哪些修飾詞
a) Final修飾,表示該類是最終的,無法繼承
b) Abstract修飾,表示該類是抽象類
106、 作用域操作符在那些場合下使用
答:作用於操作符的使用場合
a) 本類中:
i. self::類常量
ii. self::靜態屬性
iii. self::方法() parent::方法()
b) 子類中:
i. parent::類常量
ii. parent::靜態屬性(public或者protected)
iii. parent::方法()(public或者protected)
c) 類外:
i. 類名::類常量
ii. 類名::靜態屬性(public)
iii. 類名::靜態方法(public)
107、 $this,self, parent分別代表什麼?哪些場合下使用
答:$this代表的是當前物件 self代表的是當前的類 parent代表的是當前類的父類
使用場合:
$this只能使用在當前類中,通過$this->可以呼叫當前類中的屬性和方法;
self只能在當前類中使用,通過作用域操作符::訪問當前類中的類常量、當前類中的靜態屬性、當前類中的方法;
parent只能使用在有父類的當前類中,通過作用域操作符::訪問父類中的類常量、父類中的靜態屬性、父類中的方法。
108、 說明是介面、抽象類二者有何相同和不同的地方?
1、介面是幫助php實現功能意義上的多繼承的,用interface來宣告,其方法沒有方法體,使用implemens關鍵詞來實現介面。
介面中只能包含抽象方法和類常量,不可以包含成員屬性。
2、抽象類是一種不能被例項化的類,只能作父類,用abstract class來定義,抽象類和普通類可以沒有區別,類中可以包含成員屬性、類常量、方法。
子類得用extends來繼承,而且只能是單繼承。
兩者相同點是都不可以被例項化,都是需要被繼承才可以使用。
兩者的最大區別是介面可以實現多繼承,而抽象類只能是單繼承。
介面中不能包含成員屬性,而抽象類中可以有成員屬性。
介面中的抽象方法必須是public或者無訪問修飾詞,介面中的抽象方法不能用abstract來修飾。
抽象類中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract來修飾。
109、 解釋PHP中單例模式?
又叫做單態模式、單元素模式、singleton pattern。單例模式指在PHP的應用程式的範圍內只對指定的類建立一個例項。使用單例模式的類稱為單例類。在php中單例類必須要有一個私有的構造方法,還要有一個私有的魔術克隆方法(該方法體中為空)和一個私有的靜態的成員屬性$_instance.私有構造方法防止除自身以外的類來例項化它。私有的方法體為空的克隆方法防止該類被克隆。$_instance用來儲存被自身例項化後的物件。還必須要有一個公共的靜態的方法getInstance()。該方法返回已經儲存了例項物件的$_instance。
單例:一個類至始至終只能例項化一個物件,這樣的類就是單例類
單例類的優點:① 節省空間 ② 節省資源
實現單例類的四個要點:①私有的建構函式②私有的__clone的方法③私有的靜態屬性,屬性有以儲存類的例項④公共的靜態方法來例項化物件
無限級分類:
①資料庫設計:region_id(自增ID)
region_name(地區名稱) parent-id(上級地區id) region_path(全路徑)
②程式設計:全路徑的作用:a根據全路徑順序取資料 b用作資訊層級顯示
110、 什麼是SQL注入?
SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一。一部分程式設計師在編寫程式碼的時候,
沒有對使用者輸入資料的合法性進行判斷,注入者可以在表單中輸入一段資料庫查詢程式碼並提交,
程式將提交的資訊拼湊生成一個完整sql語句,伺服器被欺騙而執行該條惡意的SQL命令。注入者根據程式返回的結果,
成功獲取一些敏感資料,甚至控制整個伺服器,這就是SQL注入。
111、 如何防止SQL注入?
要對提交的資訊進行過濾,對單引號進行轉義。
首先可以在php.ini中設定,讓所有的單引號在提交後都進行轉義。或者使用addslashes().
112、 FCKEditor自動過濾的解決辦法?
如果您需要編輯模板頁,預設的FCK設定是會去掉<HTML></HTML><BODY></BODY>標籤,而且會給你加上<P></P>標籤的,如果需要保留的話,只要更改下設定可以了。
在fckconfig.js裡面有:FCKConfig.FullPage
= false ;
改為:FCKConfig.FullPage = true;
如果想去掉自動新增<P>的程式碼就可以在這裡設定
預設是
FCKConfig.EnterMode = `p` ; // p | div | br
FCKConfig.ShiftEnterMode = `br` ; // p | div | br
改成
FCKConfig.EnterMode = `br` ; // p | div | br
FCKConfig.ShiftEnterMode = `p` ; // p | div | br
113、 $_REQUEST、$_GET、$_POST、$_COOKIE 的關係和區別:
1.關係:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的所有內容,是它們的集合體。
2.通過$_REQUEST獲取變數值,PHP頁面因為不確定它是哪種傳值方式,
因此會根據php.ini中的配置來接收值。
php.ini裡可以設定,variables_order = “GPC”。其含義是GET,POST,COOKIE.
所以PHP頁面會先從$_GET中獲取,再從$_POST中獲取,然後從$_COOKIE中獲取。
新獲得的值會覆蓋之前獲取到的值。
因此從表現形式上看,$_REQUEST最後是獲取$_COOKIE中的值,如果$_COOKIE中沒有值,
會獲取$_POST中的值,如果$_POST沒有獲取到 ,就去$_GET中獲取。
如果$_GET中也沒有該值,那麼$_REQUEST就返回null。
114、 什麼是多條件查詢(複合查詢),如何實現多條件查詢?
如何實現萬能查詢呢?查詢的時候要填寫查詢條件,這些條件會通過表單進行提交。
首先需要檢查提交的條件是否為空。如果不為空,就認為這個值是要被當作條件,
我們就可以使用字串連線的方式來組合一個sql查詢語句。
當執行後獲取查詢結果。
115. 檔案上傳需要注意哪些細節?怎麼把檔案儲存到指定目錄?怎麼避免上傳檔案重名問題?
1). 首現要在php.ini中開啟檔案上傳;
2). 在php.ini中有一個允許上傳的最大值,預設是2MB。必要的時候可以更改;
3). 上傳表單一定要記住在form標籤中寫上enctype=”multipart/form-data”;
4). 提交方式 method 必須是 post;
5). 設定 type=”file” 的表單控制元件,並且必須具有name屬性值;
6). 為了上傳成功,必須保證上傳檔案的大小是否超標、檔案型別是否符合要求,上傳後存放的路徑是否存在;
7). 表單提交到接收頁面,接收頁面使用$_FILES來接收上傳的檔案。$_FILES是個多維陣列。第一維下標是上傳控制元件的name,二維下標分別為name/type/tmp_name/size/error。分別代表檔名、檔案型別、上傳到臨時目錄下的臨時檔名、檔案大小、是否有錯誤。如果是批量上傳,那麼二維下標就是陣列,而並非是字串。
8). 檔案上傳後是被放置在伺服器端臨時路徑下,需要使用move_uploaded_file ()函式,才可以將上傳後的檔案儲存到指定目錄。
9). 為了避免上傳檔案重名,可以通過上傳的檔名獲取到檔案字尾,然後使用時間戳+檔案字尾的方式為檔案重新命名。
116. 使用GD2庫建立影像的步驟?
1). 建立一個畫布:imagecreate();
2). 設定畫布背景顏色,使用RGB設定顏色:imagecolorallocate();
3). 設定文字顏色:imagecolorallocate();
4). 在畫布上書寫文字:imagestring();
5). 以 JPEG 格式將影像輸出到瀏覽器或檔案:【根據圖片格式不同,函式還可以是imagepng()、imagegif()等】 imagejpeg();
6). 清除影像資源:imagedestroy();
117. GD2庫生成縮圖的步驟是什麼?
1). 讀取希望生成縮圖的源影像,建立影像物件:【根據圖片格式不同,函式也相應不同】
$src_image = imagecreatefromjpeg();
2). 獲取原影像的寬度和高度$srcW,$srcH,根據縮放比例計算出新影像的寬度和高度$dstW、$dstH:
3). 建立一個真色彩的影像物件,寬度和高度設定成剛才計算出的寬度和高度:
$dst_image = imagecreatetruecolor($dstW,$dstH);
4). 拷貝影像並調整大小: imagecopyresized();
5). 將影像輸出:【根據圖片格式不同,函式也相應不同】 imagejpeg();
6). 清除影像資源(將源影像資源和目標影像資源都清除) imagedestroy();
118. GD2庫給圖片增加水印如何做?
1. 新增簡單的文字水印:
利用imagestring()函式就可以在圖片上寫文字水印。
2. 增加一個圖形水印:
1). 讀取希望增加水印的源圖片,建立影像物件:【根據圖片格式不同,函式也相應不同】
$image = imagecreatefromjpeg();
2). 建立一個水印圖片的影像物件:
$watermark = imagecreatefrompng();
3). 拷貝併合並影像:
imagecopymerge();
4). 將影像輸出:【根據圖片格式不同,函式也相應不同】
imagejpeg();
5). 清除影像資源(將源影像資源和水印影像資源都清除)
imagedestroy();
119. 什麼是事務?什麼是回滾?事務的作用是什麼?
事務就是組合起來的幾個獨立的sql操作。如果其中一項失敗,那麼就讓這幾個組合起來的sql操作都回退到未執行狀態。這就是事務的回滾。mysql中MyISAM儲存引擎的表不支援事務,只有InnoDB 儲存引擎的表才支援事務,為了讓事務正常執行,就需要讓參與事務的所有資料表都設定成innoDB型別。事務被包裝在了 BEGIN 和COMMIT 語句之間。在沒有使用 COMMIT 語句的情況下,對資料庫的操作不是永久的,一旦執行了ROLLBACK,就會被回退。只有執行了COMMIT,資料表中的資訊才被改動。事務的目的就是為了保證資料的完整性。
120. 模擬SESSION機制實現資料庫存放會話資料有什麼作用?【備用】
如果使用預設的SESSION機制,大家都知道預設的SESSION_ID是存放在COOKIE中,使用者的身份是靠SESSION_ID來識別的,而COOKIE檔案是存放在使用者瀏覽器的客戶端,這樣就會帶來一個問題,當使用者在辦公室選擇一些商品到購物車,在準備下訂單付款的時候,使用者選擇了支付寶線上的支付方式,恰巧辦公室的電腦上面沒有安裝支付寶的數字證照,而在使用者家裡的電腦安裝過數字證照,所以呢,使用者就需要回家去支付。但是回家登入商城之後,發現購物車中精心挑選的商品都不存在了。這是為什麼呢?問題就在家裡電腦上的並沒有存放SESSION_ID的cookie檔案,因而就無法正確的讀取伺服器上對應session檔案中的資料,所以無法將原來的選擇的商品息讀取過來。這樣的購物車功能給使用者的使用者體驗式非常糟糕的,所以我們就需要採取模擬SESSION機制使用資料庫來存放會話資料。
121. 什麼是無限極分類?
要實現無限極分類,資料庫建表是關鍵。
表結構中至少需要三個欄位,如果想避免遞迴迴圈,那麼需要四個欄位。
1. id ,當前資料的唯一標識;
2. typename ,型別名稱;
3. parentid , 當前型別的上一層父型別的id;
4. path , 其中儲存當前型別的id和它所有父級型別的id。
這些id之間採用“–”隔開。
5. 當通過以下sql語句就可以實現,相同頂級類下的資訊都在一起集中顯示。
select * from 表名 where 條件 order
by path;
無限極分類的原理是什麼?
要實現無限極分類,資料庫表結構是關鍵。
表結構中至少需要三個欄位,如果想避免遞迴迴圈,那麼需要四個欄位。
1. id ,當前資料的唯一標識;
2. typename ,型別名稱;
3. parentid , 當前型別的上一層父型別的id;
4. path , 其中儲存當前型別的id和它所有父級型別的id。
這些id之間採用“–”隔開。
5. 當通過以下sql語句就可以實現,相同頂級類下的資訊都在一起集中顯示。
select * from 表名 where 條件 order
by path;
122. 分頁原理是什麼?
資料分頁需要以下幾個條件:
1. 參與分頁的總條數 【$msg_count】 ,該值通過資料庫查詢可以獲取到;
2. 每頁顯示的條數【$pagesize】 ,這個數值由自己定義;
3. 當前頁的頁碼數 【$page】,該數值通過位址列傳遞和接收;
4. 可以通過以上資料計算出總頁數 【$pagecount】 ,此處需要藉助ceil();
【$pagecount = ceil($msg_count/$pagesize);】
5. 資料庫查詢藉助sql語句中的【limit】來實現資料的變化:
例如:
select * from 表名 where 條件 limit
$startnum , $pagesize;
而$startnum = ($page-1)*$pagesize;
123、 如何在smarty模板語言中使用php程式碼?
藉助於兩個smarty內建函式。
1. inluce_php 函式用於在模板中包含 php 指令碼。例如:
{include_php file=”test.php”}
2. php 標籤允許在模板中直接嵌入 php 指令碼。例如:
{php}
echo “這個是php內建函式的作用“;
{/php}
124、 請列出至少五個smarty中的變數調節符並說明功能?
default 例如:{$arr|default:’xxxx’} ,預設變數調節器,當變數為空時顯示給定的預設值
truncate 例如:{$articleTitle|truncate:10} , 切割字串長度為指定的長度;
count_characters 例如:{$articleTitle|count_characters} ,獲取字串長度;
strip_tags 例如: {$articleTitle|strip_tags} ,去除字串中的所有html標籤;
date_format 例如:{$smarty.now|date_format(‘’)} ,格式化時間戳。
125、 寫程式實現如下功能:
a.如何判斷一個字串中是否存在一個字元?
echo strstr(`abcdefgcd` , `cd`);
echo strpos(`ab0defgcd` , `cd`);
b.如何判斷一個字串中一個字元出現的次數?
echo substr_count(`abcdefgcd` , `cd`);
c.如何去掉一個字串的最後一個字元
echo substr(`abcdefgcd` , 0 , -1);
126、 如何使用smarty的快取、步驟?什麼叫單模板多快取?
如果給整個網站開啟快取,那麼$smarty->caching=1,此時快取的時間為smarty.class.php中預設的時間,也就是3600秒。如果對每一個頁面獨立設定快取,那麼$smarty->caching=2 ,快取時間就會跟display的引數模板頁相掛鉤,也就是可以實現對每個模板頁設定不同的快取時間。
用法例如:
if(!$smarty->is_cached(`index.html`)) {
//此處可以執行資料庫操作
$smarty->cache_lifetime = 3600*6;
}
$smarty->display(`index.html`);
對於例如新聞單條這樣的頁面,新聞的模板都是一個,如果開啟快取,那麼所有的新聞單頁的快取都是一個,根本不會隨著id的變化而變換內容。所以為了區分不同的頁面快取,需要使用單模板多快取技術。具體做法是以id作為display的第二個引數來實現。此外對於具有分頁的列表頁,也必須在display中使用第二個引數,可以使用新聞型別id和當前頁面合併成第二個引數。
127、 寫一個遞迴函式完成以下功能:向函式中傳一個多維陣列,對陣列中所有的值做判斷
,如果值是’number’則設定該值為0?(提示:該題考的是遞迴的應用,因為傳入的陣列不確定是多少維的,所以需要遞迴判斷)
function recursive_array($arr) {
if(is_array($arr)) {
foreach($arr as $key=>$value) {
if(is_array($value)) {
$arr[$key] = recursive_array($value);
} else {
if($value==`number`) {
$arr[$key] = `0`; }
}}}
return $arr;
}
128、 使用jquery寫一個全選的例子?
//全選與取消全選
function selectAll(flag) {
for(var i=0; i<$(“#fonds input”).size(); i++) {
$(“#fonds input”).get(i).checked=flag;
}}
//判斷核取方塊已經被勾選了多少個?
function checkFonds() {
var count=0;
for(var i=0; i<$(“#fonds input”).size(); i++) {
if($(“#fonds input”).get(i).checked==true) {
count++;
}}
alert(count);
}
//利用後代選擇器和get()來獲取指定的控制元件
$(“div a”).get(2)
129、 請說明smarty中fetch方法的功能?
Fetch方法可以獲取到頁面所有的內容,並且賦值到一個變數中。
如果第四個引數為true,則等同於display,直接輸出到瀏覽器中。
如果第四個引數為false,則不輸出。
Display方法就是第四個引數為true的fetch方法。
Display = Fetch() + echo()
130、 寫出關於檔案上傳的相關函式?
strrchr($filename , `.`); explode(`.` , $filename);
end($arr); strrpos($filename , `.`);
substr($filename , $pos+1); pathinfo($filename , PATHINFO_EXTENSION);
date(‘YmdHis’) time() rand();
mt_rand() move_uploaded_file()
131、 如何將SESSION存放在資料庫中,可以結合資料表設計說明.
預設情況下php.ini中session.save_handler
= files,也就是session是以檔案形 式儲存的。
如果想更改為資料庫或其它儲存方式,那麼需要更改設定,讓 session.save_handler = user。
除了在php.ini中配置外,還可以在PHP頁面中單獨配置,用
ini_set (`session.save_handler, `user`)來設定session的儲存方式,設定為使用者自定義儲存方式。
設定好儲存方式後,需要使用session_set_save_handler()函式。
該函式是設定使用者級別的session儲存過程的函式。該函式有6個引數,這6個引數其實是6個自定義函式的名稱,分別代表對session的開啟,關閉,讀,寫 ,銷燬,gc(垃圾回收)。
示例程式碼如下:
function open () { }
function close() { }
function read () { }
function write () {}
function destroy () {}
function gc () {}
session_set_save_handler (“open”, “close”, “read”, “write”, “destroy”, “gc”);
session_start();
現在你就可以象往常一樣地使用session了。
資料庫結構如下:
Session_id , session_value ,expire_time , 分別儲存sessionid的id和值以及失效時間。
132、 常用的正規表示式寫法:
中文:/^[u4E00-u9FA5]+$/
手機號碼:/^(86)?0?1d{10}$/
EMAIL:
/^[w-]+[w-.]?@[w-]+.{1}[A-Za-z]{2,5}$/
密碼(安全級別中):
/^(d+[A-Za-z]w*|[A-Za-z]+dw*)$/
密碼(安全級別高):
/^(d+[a-zA-Z~!@#$%^&(){}][w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+d[w~!@#$%^&(){}]*)$/
——————————————————————————
PHP初
——————————————————————————
order順序
var(variables)變數
model典型 樣式 模型
module模數;模組;元件
enctype
SEO搜尋引擎優化(Search Engine Optimization)
Search搜尋
Engine 引擎
Optimization最佳化,最優化
mod_rewrite模組重寫
CMS 內容管理系統(content manage system)
electronic commerce(電子商務)
gc(garbage collection)垃圾回收
—————Apache與WAMP安裝—————
1.wamp安裝
apache (2.2版本) mysql(5.067版本) php(5.2版本)
LAMP Linux下的安裝
負責版本控制 SVN
一臺機器能安裝多個apache服務 但是隻能安裝一個MySQL服務
————-PHP上————-
PHP: personal home page 個人家庭主頁 94年產生的 5.2.6版本
ASP: active server page 93
JSP: java server page
類裡面定義常量叫類常量 用const定義
類常量必須有初始值
define(“,“,`false/true`)裡有三個引數,預設為false時區分大小寫,反之不區分大小寫
在類裡面叫做方法 在類外叫做函式
常量預設為大小寫敏感。
::作用域操作符
標量和非標量型別的區別:標量只能存一個資料,非標量能存多個資料
(屬性 變數名 類常量)區分大小寫
(變數 類名 系統自帶函式 自定義函式)不區分大小寫
當$_POST[`user_name`]等沒加‘’是會先當作常量來編譯
3.函式
可變函式:函式的名字是一個變數
可選引數:引數有預設值
遞迴(recursive)函式體內有一個迴圈體,自己呼叫自己,但他跟死迴圈有區別,死迴圈是沒有盡頭的, 他是無限迴圈,遞迴有盡頭,他最終會獲得一個值
function pager( $page $msg_count $pagesize $url=”?“){
}—-》$url=”?”即為可選引數
陣列的合併 array_merge()
$arr1+$arr2
兩陣列相加: 只要是具有相同的下標,則只保留首次出現的元素,後者捨去
array_merge:索引陣列會將後者的元素附加到前者後面;若是關聯陣列,相同下標,後者覆蓋前者
explode() 取陣列最後一個元素
8.檔案的操作
mkdir新建目錄
rmdir刪除目錄
skandir輸出指定路徑下的檔案或目錄
fopen(資源)— 開啟檔案或者 URL
fclose— 關閉一個已開啟的檔案
fgets — 一次讀取一行
fgetc — 一次只讀取一個字元
fgetss — 一次讀取一行並過濾掉 HTML 標記
file_get_contents — 將整個檔案讀入一個字串
fread-讀取檔案
file_put_contents— 將一個字串寫入檔案
fwrite-寫入檔案
unlink-刪除檔案
pathinfo — 返回檔案路徑的資訊
array_push — 將一個或多個單元壓入陣列的末尾(入棧)
array_unshift — 在陣列開頭插入一個或多個單元
9.其它函式
輸出控制函式:ob(output buffer) ob_flush
加密函式 md5
數學類函式:abs絕對值,rand隨機數,ceil取整,floor,mt_rand生成更好的隨機數
轉換函式:explode 使用一個字串分割另一個字串,implode
時間函式:date(),strtotime (將字串轉換為時間戳)
處理位址列: url_encode url_decode
10.亂碼問題
ASCII(American Standard Code for Information Interchange)81年產生
ANSI 美國國家標準學會( American National Standards Institute)
utf-8(-8代表一次傳輸8個字元)可變位元組編碼(中文3個位元組)(utf:Unicode轉換格式(UCS
Transformation Format)
utf-16(-16代表一次傳輸16個字元)
GBK. 國家標準擴充套件碼(Guo-Biao Kuozhan)90年產生(雙位元組編碼)
GB2312 因為國際排行2312位(81年產生)
BIG5
unicode (國際編碼)可變位元組編碼
Latin_1
utf-8+ bom
ISO:國際標準化組織(International Standardization Organization)
11.資料庫操作
資料庫優化:char(查詢速度快)
varchar
引擎:myisam(mysql indexed
sequential access method)索引順序訪問方法
支援事務的引擎:BDB ,innodb
innodb:是以inno開頭的一家公司的商標
表型別就是表的儲存引擎
dll:動態資料連線庫 封裝的類庫
修飾符:public,var,protected,private,static,final,abstract
訪問許可權修飾符:public,private,protected
public:類成員訪問沒有限制,多有外部成員都可以訪問
protected:受保護的,不能被類外部成員訪問,該類的直接子類可以訪問,可以實現對成員屬性的讀、寫操作
private:私有的,只能類裡邊的成員自己訪問,類外部的成員都不能訪問
一個屬性被修飾為私有的(private),那麼這個屬性在類的外部是不可以讀取和修改的,現在有一種方法 可以設定該屬性既是私有的,還可以被類的外部成員讀取即__get()和__set()
修飾class的修飾符:final,abstract(抽象)
final被它修飾的類是不能被繼承的
定義屬性必須要加修飾符:可以是public和var
定義方法時可以有修飾符public,可以不寫,預設為public
如果父類中的方法被宣告為final,則子類無法覆蓋該方法; 如果一個類被宣告為final,則不能被繼承。
final只能出現在class類和方法中
方法前可以有public,private,protected,static,final,abstract修飾。
繼承性:耦合性越低越好
const修飾,一定要有初始值 ( smarty的保留變數:{$smarty.now},{$smarty.const},{$smarty.post},{$smarty.get},{$smarty.cookies},{$smarty.config},{$smarty.session},){$smarty.capture}
呼叫屬性時,如果前有$後邊就不能有,後有前不能有,如:$this->abc
self::$abc
當用parent呼叫父類方法時,將方法自動轉化為靜態的
多型性:由繼承 重寫(覆蓋)(重新寫一遍)(override重寫)造成的
php不支援過載(重複載入),php為弱變數語言(overload過載)
抽象:一個類包含抽象方法就是抽象類,抽象類中不一定有抽象方法
抽象類的定義abstract
介面裡可以有抽象類,還可以有類常量,通過interface來定義一個介面,
實現多個介面時,介面中的方法不能有重名。
介面中定義的所有方法都必須是public,這是介面的特性。
介面裡的方法必須被重寫
靜態:static 不能與構造方法共存,static不能new物件,構造方法可以new物件,方法體中不能用$this
在php5以前的版本中,當普通構造方法和__construct(魔術方法)共存在時,它會呼叫普通構造方法,它對__construct(魔術方法)是不識別的,在php5以後的版本中,當共存時他會先呼叫__construct(魔術方法)。析構方法是最後被執行的,被自動呼叫的方法
單例(單態)singleton
——————————————————————————
PHP中
——————————————————————————
2.jQuery
包括javascript框架和prototype.js框架
選擇器:
1.基本選擇器:
①、$(`#result`)=jQuery(`#result`)=document.getElementById(`result`)
<div id=`result`>
<div class=`result`>
②、class選擇器 $(`.result`)
③、元素選擇器$(`div`)
2.子代選擇器:$(`#myform < input`)
3.後代選擇器:$(`#myform input`)
4.組合選擇器:$(`#myform < span < input`)
3.Ajax
ajax的用處是用來非同步js和xml 不僅可以獲取xml資料,還可獲得hmtl和json資料
ajax的優點:1.提升使用者的體驗2.佔用頻寬小3.減小伺服器的負載
ajax就是把B頁面的內容,顯示到A頁面的指定位置,實現非同步傳輸
$.ajax() 返回其建立的 XMLHttpRequest 物件。
$.ajax({
url:, data:, type:, datatype:, success:function(這個引數裡,存在被傳回的頁面的所有內容){} });
$.post(`請求地址`,`傳遞引數`,`回撥函式`);
$.get(`請求地址`,`傳遞引數`,`回撥函式`);
post傳值檔案沒有大小限制,保密性好,必須有form表單
get傳值安全性不高,有大小限制
當位址列裡有中文時,用urlencode(編碼 URL 字串)
urlencode — 編碼 URL 字串
urldecode(解碼已編碼的 URL 字串)
4.會話控制
session:unset()和array() 是連同記憶體和session檔案內容一起刪除,而session_destroy只是將檔案刪除
cookie沒有生命週期的叫會話cookie,隨著瀏覽器的關閉,cookie消失
cookie有兩種存在方式,一種是以檔案形式存在,另一種是儲存在記憶體裡
cookie裡面只能存字串
會話控制主要是為了跨頁面傳值
序列化是把其他的型別轉換成字串型別
5.smarty
程式碼重用(include,require,include_once,require_once)
include require 比 require_once include_once 效能高
載入類檔案用 require_once(最好) include_once
6.PDO
dsn(data source name)
//資料來源
$dsn = `mysql:host=127.0.0.1;dbname=java1008a`;
die(`到此結束`); 等同於 echo `到此結束`;die;
———————————————————————————-
2.b/s與c/s簡單比較,區別:
–a、執行環境不同(廣域網、區域網)
–b、安全級別不同(低/高)
–c、使用者群不同(全部使用者/區域性使用者)
–d、系統升級不同(無縫升級/整體升級)
–e、使用者開啟不同(瀏覽器/特製軟體)
–f、軟體介面特點不同(資訊流/使用者體驗)
比如:b/s就是網上的微博、部落格;c/s就是在網咖打的網路遊戲(奇蹟、傳奇等)
3.php是什麼:執行在伺服器端的指令碼語言
–Hypertext Preprocessor
–personal home page
4.php語言能做什麼
—圖形化使用者介面程式
—伺服器端執行指令碼程式
3.php外部變數$_POST[]、$_GET[];
特殊運算子
`.`是連線符
“.=”是連線賦值
“@”遮蔽錯誤資訊 $link=@mySQl_connect(主機,使用者名稱,密碼)
5.流程控制(順序、選擇、迴圈)
******************************************************************************
******************************************************************************
第三單元【字串】
1.字串的三種定義方式(單引號、雙引號、定界符)
—單引號定義(轉義`和\)
—雙引號定義(轉義
$ \ “)
—定界符方法<<<eof
2.函式部分
explode/implode
substr()**
str_replace/trim/ltrim/rtrim
strstr(str, search)獲得指定字串最開始出現到最後的內容
strrchr(str, search)獲得指定字串最後出現到最後的內容
strpos(str, search)獲得指定字串最開始出現的位置
strrpos(str, search)獲得指定字串最後出現的位置
ucfirst(str)將字串第一個字母大寫
ucwords(str)將字串的每個單詞的第一個字母大寫
strlen(str)獲得字串長度
strcmp(str1, str2)比較兩個字串大小,
返回負數表示 str1 小於 str2;
返回正數表示 str1 大於 str2;
返回零表示二字串相同
urlencode(str)替換所有非字母數字的字元,變為%後面跟兩位16進位制數,空格變為+號
urldecode(str)對已%##編碼的URL進行解析還原
parse_url(str)解析完整的url轉變為為陣列
parse_str(str,out)解析請求字串轉變為陣列
htmlspecialchars()轉換html程式碼為實體程式碼
printf/sprintf %b %d %c %x %s %f %X
– b 整數轉成二進位。
– c 整數轉成對應的 ASCII 字元。
– d 整數轉成十進位。
– f 單倍精確度數字轉成浮點數。
– o 整數轉成八進位。
– s 轉成字串。
– x 整數轉成小寫十六進位。
– X 整數轉成大寫十六進位。
1.陣列和棧的操作
array_push(目標陣列,字串)將字串壓入陣列的最後
array_pop(目標陣列)將陣列最後的元素彈出並返回
2.陣列和佇列的操作
array_unshift(目標陣列,字串)將字串放到陣列的開始位置
array_shift(目標陣列)刪除陣列的第一個元素並返回
3.陣列和指標的操作key() current() next() prev() reset() end()
4.預定義陣列($_GET $_POST $_FILES $_COOKIE $_SESSION)
******************************************************************************
******************************************************************************
第六單元【其他常用函式】
date(format,[timestamp])//格式化時間資訊,並返回
time()//返回當前時間戳資訊
mktime(hour,minute,second,month,day,year)
mktime(小時,分鐘,秒,月,天,年)//取得一個日期的 Unix 時間戳
max()//取得最大值
-echo max(1, 3, 5, 6, 7); // 7
-echo max(array(2, 4, 5)); // 5
-echo max(0, `1hello`); // 1hello
-echo max(`hello`, 0); // hello
-echo max(-1, `hello`); // hello
-echo max(array(2, 4, 8), array(2, 5, 7)); // array(2, 5, 7)
-echo max(`string`, array(2, 5, 7), 42); // array(2, 5, 7)陣列和非陣列比較陣列總認為最大
mt_rand(65,94)//獲得隨機數
round()//四捨五入取整
flush()//輸出準備區內容
urlencode(`張三`)//返回字串中,除了-_.之外的所有非字母數字部分為%後接兩位
16進位制數,空格轉化為+
urldecode()//對已經編碼的部分反編碼
var_dump()//輸出變數的詳細資訊(八種資料型別資料都可以輸出)
chr(mt_rand(65,94))隨機獲得字母
ord(chr(mt_rand(65,94)))將字母轉化為數字
basename(路徑名)獲得路徑中檔名部分
strtolower轉換小寫
第七單元【php連線mysql】
*mysql_connect(主機,使用者名稱,密碼) 開啟一個到 MySQL 伺服器的連線
*mysql_select_db(資料庫,連線資料庫資源) 選擇 MySQL 資料庫
*mysql_query(“set names utf8”);設定字符集
*mysql_close() 關閉 MySQL 連結
*mysql_query(語句) 傳送並執行一條sql語句
mysql_fetch_row(結果資源)從結果集中取得一行結果(索引陣列)
mysql_fetch_assoc(結果資源)從結果集中取得一行結果(關聯陣列)
*mysql_fetch_array(結果資源)從結果集中取得一行結果(索引/關聯陣列)
mysql_fetch_object(結果資源)從結果集中取得一行結果(物件陣列)
mysql_errno()返回錯誤號碼
*mysql_error()返回錯誤資訊
*mysql_num_rows(結果資源)用於計算查詢結果中所得行的數目
*mysql_affected_rows()獲得受影響的結果數目
*mysql_insert_id()傳回最後一次使用 INSERT 指令產生的自動增長 ID 值
mysql_result(結果集,索引行,欄位)指定獲取結果
mysql_free_result(結果資源)釋放結果集
mysql_num_fields(結果資源)用於計算查詢結果中所得列的數目
mysql_fetch_field(結果資源)從結果集中取得列的結果,以物件形式返回
mysql_pconnect()永久連線資料庫
1.留言板建立資料庫bbs,建立兩張表leave_word和back_word(留言表和回覆表)
leave_word:
欄位 資料型別
id int 主鍵、自增
title varchar(20) 標題
content text 內容
itime datetime 新增時間
back_word:
id int 主鍵、自增
leave_id int 外來鍵(留言id)
content text 內容
btime datetime 回覆時間
4.刪除留言,對無效、無用的留言實現刪除功能(這時需要用get方式傳遞被刪除留言id值)
5.修改留言,對需要修改(get方式傳遞被刪除留言id值,再利用隱藏域方式傳遞給接收頁面)
6.留言詳細顯示功能,有的留言內容比較多,在明細頁面不可能全部顯示出來(這時利用get方式傳遞留言id)
7.在詳細頁面可以實現回覆功能和回覆留言展示,步驟:製作一個回覆表單和接收資料頁面
3.構造方法和析構方法
建構函式:例項化物件首先第一個需要做的事情就是建構函式。一個小孩出生到5歲之前,所有的事情都是父母幫助做的,包括起名字、穿衣服、吃飯等等。
解構函式:一個物件被使用完後需要做一些善後工作,這些善後工作是不需要人為干預的,例如資源釋放、變數刪除等。例如:一個小狗死後,主人非常愛惜它,就把它埋在了家後園的一顆樹下。小狗被埋這件事情是主人做的,不是狗做的。這就是解構函式。
3.類的重寫
子類和父類之間的事情,就是說父類有的方法,子類不但可以直接使用,還可以在子類中
重新定義具體內容,例如有一個父親會駕駛汽車,那麼他的兒子也會駕駛汽車,但他的兒子
可以不駕駛汽車,而駕駛飛機,這就是類方法的重寫。
D 1.final(最後的)關鍵字使用
該關鍵字修飾的類不能被繼承
該關鍵字修飾的方法不能被重寫
2.static(靜態)關鍵字使用(類的內部、外部、子類)
例項化物件在記憶體中的分配有講到大的資料在記憶體被分配到堆空間裡邊。現在有一個例子:有一個
“學生“這個類,裡邊有一個成員屬性是“國家“,標識該物件是屬於哪個國家的,比如美國、英國、德國等 ,這個類在例項化物件時候,每個物件在記憶體中都會分配一個空間用於存放國家這個成員屬性,如果
有100個物件,那麼在內容中會分配100個相應的空間。如果這個類的使用物件是在“中國“境內,那麼
每個物件的國家屬性就會是一樣的,即“中國“,相應的在記憶體中會有100個空間存放100個相同的內容
這會造成空間浪費,其實到這裡我們可以知道100個相同的內容用一個空間存放就可以,反正都是一樣的,
這就產生了靜態化概念“static”。
用static修飾的成員屬性,該屬性就不是物件的,而是類的。
3.self和parent關鍵字使用
在類的內部訪問類中的成員(屬性和方法),可以用“$this”,該關鍵字泛指物件,這是訪問一般的類
成員,如果訪問的成員是用static關鍵字修飾的,就不能用“$this”了,因為用static修飾的類
成員是被類本身擁有,不屬於任何物件了,這時候需要用“self”關鍵字修飾 self::成員
在類的外部訪問類本身擁有的成員可以這樣 類名::成員屬性。
在子類中訪問父類擁有的成員可以用parent關鍵字 parent::成員屬性
4.const(常量)關鍵字使用
在php中可以定義常量,類外部用define定義,類內部用const定義。
常量的擁有者是類本身,類內部訪問常量用 self::常量
類外部訪問常量用 類名::常量
子類訪問常量 parent::常量
6.魔術方法clone、__call、__autoload使用
clone:在一個專案裡邊我們有時候需要兩個或多個完全一樣的初始化物件,這時候可以使用clone技術
不用clone技術也可以,不過每個新的物件都需要初始化屬性值,這樣比較繁瑣,也容易出錯,
使用clone就比較簡單,克隆出來的多個物件彼此是獨立的,互不相干。
$p2 = clone $p1;
__call:在類的使用過程中,如果一個物件呼叫的方法不在類裡邊,那麼這時候程式要報錯,然後程式退
出不能繼續執行。這樣做使用者體驗非常不好,如果有一種方法可以使得程式報錯完後可以繼續運
行,這樣的程式給人更智慧、使用者體驗更好的感覺,這時候就可以用__call
public function __call($method_name,$args){
echo “你訪問的方法:”;
echo $method_name;
echo “引數:”;
print_r($args);
echo “不存在“;
}
__autoload:開發一個軟體系統,往往裡邊會有很多類,在初始化類物件之前需要先include這個對
象對應的類檔案。所有的類不能都放到一個檔案(檔案臃腫,不易維護),這樣就會在程
序開始處有很多的include列表,這樣做非常繁瑣,出現一個新的類就需要被include,
有沒有一種方法可以使得被include的類檔案在例項化物件時候才引入,否則不動作,
答案是有的,這時候可以用魔術方法__autoload
function __autoload($className){
include($className.`.php`);
}
8.子類繼承父類時候成員修飾符限制,子類的修飾級別大於父類。例如父類的修飾符是protected,
則子類修飾級別是protected或public。父類是public的,子類也必須是public的
1.抽象類
在類裡邊定義的沒有方法體的方法就是抽象方法,有抽象方法的類被稱為抽象類。抽象類不能例項化物件。
所謂沒有方法體就是方法在宣告時候沒有花括號和裡邊的內容。
作用之處:
例如:我有一個類“動物“,裡邊有方法“吃食“(還可以有許多其他的方法)
動物這個類可以有許多子類例如:狗、魚、鳥等,這些子類有一個共性就是都有吃食這個方法
一般的解決方法是:定義3個類,裡邊都有吃食方法。這樣實現沒有問題的,但是如果其中一個
類沒有吃食方法,這時候程式是不給報錯的。我們現在要做的就是3個類中任何一個沒有吃食方法
系統就要報錯。這時候就需要用到抽象類了。
抽象類按照字面意思理解就是對3個類的進一步抽象。抽象出來吃食方法。
抽象類技術特性:
a、抽象類不能例項化
b、類的成員方法是抽象的,則這個類也是抽象的
c、抽象方法體內沒有實現細節,具體實現留給子類實現
d、繼承抽象類的子類必須實現父類的抽象類,除非自己也是抽象類。
2.介面(插座例項)
當一個抽象類裡邊的全部方法都是抽象方法時候,這個抽象類就是“介面“。
介面技術特性:
a、interface宣告
b、全部介面方法是public的,因此可以省略
c、介面只定義方法,沒有具體方法實現
d、實現類用implements實現介面,全部介面方法都要實現
e、介面可以多實現,中間用逗號分開
f、介面是對抽象類的抽象,抽象類是對類的抽象,類是對事物的抽象。
g、介面不能例項化
(1)、抽象類和介面有什麼不同
抽象類只能單繼承,介面可以多實現
抽象類裡面可以有抽象方法和普通方法,而介面裡只有抽象方法
抽象類裡面可以有自己的屬性,而介面裡面只能有常量
介面裡面的方法必須是public的,而抽象類不同
(2)、抽象類和介面的相似之處
抽象類裡面的抽象方法在繼承的時候必須都要重寫,介面裡面的方法也必須都要實現。
抽象類和介面都不能直接例項化,
抽象類需要繼承(extends),介面需要實現(implements)。
抽象類和介面都體現了多型的特性。
3.jquery
jquery是js的封裝包,裡邊有很多整合的函式可以讓我們使用,jquery的宗旨就是寫更少的程式碼實現更多的功能
使用的方法:
1.引進jquery包
<script type=”text/javascript” src=`jquery-1.4.2.js`><script>
2.測試jquery是否載入成功
$(function(){
alert(“jquey載入成功“);
})
3.獲取頁面的元素
$(`#div`);通過id獲取頁面元素
$(`.div`);通過class獲取頁面元素
jquery中的事件
1.$(`#mydiv`).click(function(){});滑鼠點選事件【要寫在onload事件裡邊】
2.$(`#mydiv`).hover(function(){},function(){});滑鼠移動到物件事件
3.$(`#mydiv`).attr();獲得物件屬性資訊
4.$(`#mydiv`).attr(`checked`);檢視單核取方塊的選定情況!
5.$(`#mydiv`).css();獲得物件的屬性資訊
6.$(`#mydiv`).css(樣式,值);給物件賦予樣式
7.$(`#mydiv`).addClass(`trb`);給元素class屬性賦值trb;
8.$(`#mydiv`).removeClass(`trb`);使元素失去class屬性;
9.$(`#mydiv`).submit(function(){});提交事件;
10.$(`#mydiv`).keyup(function(){});鍵盤敲擊事件;
在專案中的使用:表單的驗證
20. * 什麼是單一入口(單點入口)呢?
所謂單一入口就是整個應用程式只有一個入口,所有的實現都通過這個入口來轉發,
比如說在上面我們就使用index.php作為程式的單點入口,
當然這個入口檔案的名字是可以由自己任意定義的。
單點入口有幾大好處:
第一、一些系統全域性變數,都可以在這裡定義。
比如說你要對資料進行初步的過濾,你要模擬session處理,
你要定義一些全域性變數,甚至你要註冊一些物件或者變數到註冊器裡面
第二、程式的架構更加清晰明瞭。
相關文章
- MySQL 索引知識大全MySql索引
- PHP 知識PHP
- Android知識體系大全!Android
- 計算機硬核知識大全計算機
- HTTP協議冷知識大全HTTP協議
- 校招前端面試知識大全前端面試
- PHP基礎知識PHP
- JavaSE基礎學習知識整理大全Java
- LVM的知識總結和操作大全LVM
- 例項總結Oracle知識點大全Oracle
- 【精益生產】精益知識大全
- Spark SQL知識點大全與實戰SparkSQL
- PHP物件基礎知識PHP物件
- php知識點目錄PHP
- PHP 基礎知識-1PHP
- PHP基礎知識——PHP偽協議PHP協議
- 2021-PHP面試題“資料庫“相關知識點面試大全總結PHP面試題資料庫
- Word 列印技巧大全,列印知識全在這。
- PHP 易錯知識點整理PHP
- PHP 資源大全PHP
- PHP函式大全PHP函式
- 實驗室資訊管理系統(LIMS)知識大全
- PHP 面試知識點整理歸納PHP面試
- 騰訊 PHP 面試必備知識PHP面試
- 自己整理的php面試知識點PHP面試
- 前後端均適用的網路知識點大全後端
- 【全面】Linux基礎知識和基本操作語句大全(一)Linux
- C++篇:第八章_類_知識點大全C++
- 你瞭解C盤嗎?C盤檔案知識大全
- php curl引數大全PHP
- PHP常用函式大全PHP函式
- PHP 模式大全 - 策略模式PHP模式
- PHP模式大全 - 多例模式PHP模式
- PHP入門易忘知識點彙總PHP
- 網站安全公司 滲透測試基礎知識點大全網站
- C++篇:第四章_函式_知識點大全C++函式
- PHP模式大全 - 流介面模式PHP模式
- PHP知識筆記:CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI區別PHP筆記AST
- 搞定PHP面試 - HTTP協議知識點整理PHP面試HTTP協議