1.類中如何定義常量、如何類中調用常量、如何在類外調用常量。
~~~
類中的常量也就是成員常量,常量就是不會改變的量,是一個恒值。
定義常量使用關鍵字const.
例如:const PI = 3.1415326;
無論是類內還是類外,常量的訪問和變量是不一樣的,常量不需要實例化對象,
訪問常量的格式都是類名加作用域操作符號(雙冒號)來調用。
即:類名 :: 類常量名;
~~~
2.接口和抽象類的區別是什么?
~~~
抽象類是一種不能被實例化的類,只能作為其他類的父類來使用。
抽象類是通過關鍵字 abstract 來聲明的。
抽象類與普通類相似,都包含成員變量和成員方法,兩者的區別在于,抽象類中至少要包含一個抽象方法,
抽象方法沒有方法體,該方法天生就是要被子類重寫的。
抽象方法的格式為:abstract function abstractMethod();
因為php中只支持單繼承,如果想實現多重繼承,就要使用接口。也就是說子類可以實現多個接口。
接口是通過interface關鍵字來聲明的,接口中的成員常量和方法都是public的,方法可以不寫關鍵字public,
接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現的。
抽象類和接口實現的功能十分相似,最大的不同是接口能實現多繼承。在應用中選擇抽象類還是接口要看具體實現。
子類繼承抽象類使用extends,子類實現接口使用implements。
~~~
3.__call的參數有幾個,類型是什么,意義是什么?
~~~
魔術方法__call()的作用是當程序調用一個不存在或不可見的成員方法時,php會先調用__call()方法,
將那個不存在的方法的方法名和參數都存儲下來。
__call()包含兩個參數,第一個參數是那個不存在的方法的方法名,是個字符串類型;
第二個參數是那個不存在的方法的所有參數,是個數組類型。
本人認為__call()方法的意義更多在于調試,可以定位到錯誤。同時可以捕捉異常,如果某個方法不存在,
則執行其它可替代方法。
~~~
4.構造方法、析構方法是如何定義的?
~~~
構造方法就是在實例化一個對象的同時自動執行的成員方法,作用就是初始化對象。
php5之前,一個跟類名完全相同的方法是構造方法,php5之后魔術方法__construct()就是構造方法。
如果類中沒有定義構造方法,那么php會自動生成一個,這個自動生成的構造方法沒有任何參數,
沒有任何操作。
構造方法的格式如下:
function __construct(){}
或者:function 類名(){}
構造方法可以沒有參數,也可以有多個參數。
析構方法的作用和構造方法正好相反,是對象被銷毀時被自動調用的,作用是釋放內存。
析構方法的定義方法為:__destruct();
因為php具有垃圾回收機制,能自動清除不再使用的對象,釋放內存,一般情況下可以不手動創建析構方法。
~~~
5.===是什么運算?
~~~
是php比較運算符中的一種,表示恒等,說明兩個變量不只是數值上相等,而且兩者的數據類型也相等。
如果$a !== $b,那么說明兩個變量要么數值不等,要么就是數據類型不相同。
~~~
6.__autoload()函數是如何運作的?
~~~
使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。
當程序執行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執行__autoload()函數。
這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后
就執行include或者require來載入該類,然后程序繼續執行,如果這個路徑下不存在該文件時就提示錯誤。
使用自動載入的魔術函數可以不必要寫很多個include或者require函數。
~~~
7.網頁靜態化要用到哪類函數?
`使用ob系列函數。這個問題需要到php高級才學。`
8.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]] )
~~~
9.試舉正則表達式對字符串最常用的3種操作?
~~~
1. 利用正則表達式,實現對一個字符串的切割,切割后返回一個數組。如split()。
2. 利用正則可以實現對一個字符串中符合的內容批量替換。如果替換為空則達到了過濾的作用。如preg_replace()。
3. 利用正則判斷一個字符串中是否含有符合的子字符串。如preg_match()。
~~~
10.字符串怎么轉成整數,有幾種方法?怎么實現?
~~~
強制類型轉換: (整型)字符串變量名;
直接轉換:settype(字符串變量,整型);
intval(字符串變量);
~~~
11.php怎么定義函數?
~~~
使用關鍵字function加函數名,參數和函數體來定義函數。格式為:
function 函數名(參數){函數體};
~~~
12.函數內怎么使用局部變量和全局變量?
~~~
局部變量是函數內部定義的變量,其作用域是所在的函數。如果函數外還有一個跟局部變量名字一樣的變量,
程序會認為它們兩個是完全不同的兩個變量。當退出函數的時候,其中的局部變量就同時被清除。
全局變量是定義在所有函數以外的變量,其作用域是整個php文件,但是在用戶自定義的函數內部是無法使用的。
如果一定要在用戶自定義的函數內部使用全局變量,那么就需要使用global關鍵字聲明。
也就是說如果在函數內的變量前加上golbal來修飾,那么函數內部就可以訪問到這個全局變量,
不僅可以利用這個全局變量進行運算而且可以對這個全局變量進行重新賦值。
~~~
13.字符串和數組怎么取長度?
~~~
字符串:strlen();
count() -- 計算數組中的元素個數。
可以使用count(數組名)或者count(數組名,1),如果有第二個參數,并且是數字1,則表示遞歸統計數組元素的個數。
如果第二個參數是數字0,則等同于只有一個參數的count()函數。
sizeof() -- count() 的別名
~~~
14.頁面字符出現亂碼,怎么解決?
~~~
1.首先考慮當前文件是不是設置了字符集。查看是不是meta標簽中寫了charset,如果是php頁面還可以看看是不是
在header()函數中指定了charset;
2.如果設置了字符集(也就是charset),那么判斷當前文件保存的編碼格式是否跟頁面設置的字符集保持一致,
兩者必須保持統一;
3.如果涉及到從數據庫提取數據,那么判斷數據庫查詢時的字符集是否跟當前頁面設置的字符集一致,兩者必須統一。
~~~
15.php訪問數據庫有哪幾步?
~~~
1.連接數據庫服務器:
mysql_connect('數據庫服務器的主機名或ip','數據庫服務器的用戶名','數據庫服務器的密碼');
2.選擇數據庫:
mysql_select_db(數據庫名);
3.設置從數據庫提取數據的字符集:
mysql_query("set names utf8");
4.執行sql語句:
mysql_query(sql語句);
5.關閉結果集,釋放資源:
mysql_free_result($result);
6.關閉與數據庫服務器的連接:
mysql_close($link);
~~~
16.文件上傳應該注意哪些細節?
~~~
1.首現要在php.ini中開啟文件上傳;
2.在php.ini中有一個允許上傳的最大值,默認是2MB。必要的時候可以更改;
3.上傳表單一定要記住在form標簽中寫上enctype="multipart/form-data";
4.要注意上傳文件的大小、文件類型是否符合要求,上傳后存放的路徑是否存在。
~~~
17.怎么把文件保存到指定目錄?怎么避免上傳文件重名問題?
~~~
可以通過上傳的文件名獲取到文件后綴,然后使用時間戳+文件后綴的方式為文件重新命名,這樣就避免了重名。
可以自己設置上傳文件的保存目錄,與文件名拼湊形成一個文件路徑,使用move_uploaded_file(),就可以完成
將文件保存到指定目錄。
~~~
18.session和cookie有什么區別?
~~~
cookie是保存在客戶端機器的,對于未設置過期時間的cookie,cookie值會保存在機器的內存中,只要關閉瀏覽器則
cookie自動消失。如果設置了cookie的過期時間,那么瀏覽器會把cookie以文本文件的形式保存到硬盤中,
當再次打開瀏覽器時cookie值依然有效。
session是把用戶需要存儲的信息保存在服務器端。每個用戶的session信息就像是鍵值對一樣存儲在服務器端,
其中的鍵就是sessionid,而值就是用戶需要存儲信息。服務器就是通過sessionid來區分存儲的session信息是
哪個用戶的。
兩者最大的區別就是session存儲在服務器端,而cookie是在客戶端。session安全性更高,而cookie安全性弱。
~~~
19.session有什么用?怎么使用?
~~~
session在web開發中具有非常重要的份量。它可以將用戶正確登錄后的信息記錄到服務器的內存中,當用戶以此身份
訪問網站的管理后臺時,無需再次登錄即可得到身份確認。而沒有正確登錄的用戶則不分配session空間,即便輸入了
管理后臺的訪問地址也不能看到頁面內容。通過session確定了用戶對頁面的操作權限。
使用session的步驟:
1. 啟動session:
使用session_start()函數來啟動。
2. 注冊會話:
直接給$_SESSION數組添加元素即可。
3. 使用會話:
判斷session是否為空或者是否已經注冊,如果已經存在則像普通數組使用即可。
4. 刪除會話:
1.可以使用unset刪除單個session;
2.使用$_SESSION=array()的方式,一次注銷所有的會話變量;
3.使用session_destroy()函數來徹底銷毀session。
~~~
20.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或小于當前時間戳。
~~~
21.怎么定義常量?
~~~
define('變量名','值');
還可以使用constant()函數來定義一個常量。例如constant(常量名).
~~~
22.break和continue的區別?
~~~
break可以終止循環。
continue沒有break強大,只能終止本次循環而進入到下一次循環中。
~~~
23.循環語句有哪幾種?
~~~
while(){};
do{}whlie();
for(){};
foreach(){};
~~~
24.數組怎么聲明?怎么賦值?
~~~
數組的聲明方式主要有兩種。
1.通過array()函數聲明數組;
可以通過key=>value的方式分別定義索引和值,也可以不定義數組的索引下標,只給出數組的元素值。
2.直接為數組元素賦值,不需要調用array()函數。例如:
$arr[0] = 1;
$arr[1] = 2;
~~~
25.說出數組涉及到的常用函數。
~~~
array -- 聲明一個數組
count -- 計算數組中的單元數目或對象中的屬性個數
foreach -- 遍歷數組
list -- 遍歷數組
explode -- 將字符串轉成數組
implode -- 將數組轉成一個新字符串
array_merge -- 合并一個或多個數組
is_array -- 檢查是否是數組
print_r -- 輸出數組
sort -- 數組排序
array_keys -- 返回數組中所有的鍵名
array_values -- 返回數組中所有的值
key -- 從關聯數組中取得鍵名
~~~
26.數組有哪幾種類型?
~~~
數字索引數組
關聯數組
根據數組構造還可以分一維數組、二維數組、多維數組。
~~~
27.foreach 用法。
~~~
foreach($數組名 as $key=>$value){
循環體
};
~~~
28.說出有哪幾種分支語句。
~~~
if(){};
if(){}else{};
if(){}elseif(){}else{};
swich(){case1 ,case2,……};
~~~
29.什么是全局變量,自定義函數中如何使用全局變量?
~~~
全局變量是定義在所有函數以外的變量,其作用域是整個php文件,但是在用戶自定義的函數內部是無法使用的。
如果一定要在用戶自定義的函數內部使用全局變量,那么就需要使用global關鍵字聲明。
也就是說如果在函數內的變量前加上golbal來修飾,那么函數內部就可以訪問到這個全局變量,
不僅可以利用這個全局變量進行運算而且可以對這個全局變量進行重新賦值。
~~~
30.字符串的常用函數?
~~~
trim();--去除空格
strlen();--字符串長度
substr();--截取字符串
str_replace();--替換字符串函數
substr_replace() -- 對指定字符串中的部分字符串進行替換
strstr();--檢索字符串函數
explode();--分割字符串函數
strcasecmp();--比較字符串函數
~~~
31.PHP數據類型有哪些?
~~~
php支持8種原始數據類型。
包括:
四種標量類型(布爾型boolean,整型interger,浮點型float/double , 字符串string)
兩種復合類型(數組array , 對象object)
兩種特殊類型(資源resource,NULL)
~~~
32.如何定義一個變量?
`使用$和變量名表示,變量名區分大小寫。變量名不可以以數字或者@等特殊字符開頭。`
33.怎么定義一個整數變量?
` $變量名=整數值;`
34.print與echo有什么區別?
` echo可以一次輸出多個值,中間用逗號隔開。而print一次只能輸出一個值。`
35.你是怎么理解正則表達式的?
~~~
正則表達式是用于描述字符排列模式的一種語法規則。正則表達式也叫做模式表達式。
網站開發中正則表達式最常用于表單提交信息前的客戶端驗證。
比如驗證用戶名是否輸入正確,密碼輸入是否符合要求,email、手機號碼等信息的輸入是否合法。
在php中正則表達式主要用于字符串的分割、匹配、查找和替換操作。
~~~
36.你是如何認識ajax的?
~~~
ajax是asynchronous javascript and xml的縮寫,是javascript、xml、css、DOM等多個技術的組合。
Ajax的工作原理是一個頁面的指定位置可以加載另一個頁面所有的輸出內容,這樣就實現了一個靜態頁面也能獲取到
數據庫中的返回數據信息了。所以ajax技術實現了一個靜態網頁在不刷新整個頁面的情況下與服務器通信,
減少了用戶等待時間,同時也從而降低了網絡流量,增強了客戶體驗的友好程度。
Ajax的優點是:
1. 減輕了服務器端負擔,將一部分以前由服務器負擔的工作轉移到客戶端執行,利用客戶端閑置的資源進行處理;
2. 在只局部刷新的情況下更新頁面,增加了頁面反應速度,使用戶體驗更友好。
Ajax的缺點是不利于seo推廣優化,因為搜索引擎無法直接訪問到ajax請求的內容。
ajax的核心技術是XMLHttpRequest,它是javascript中的一個對象。
~~~
37. 你如何理解smarty,smarty的運用過程中注意哪些細節?
~~~
Smarty是基于MVC概念的一種模板引擎,它將一個頁面程序分成了兩部分來實現:即視圖層和控制層,
也就是說smarty技術將用戶UI與php代碼分離開。
這樣程序員和美工各司其職,互不干擾。
smarty運用過程中要注意以下幾個問題:
1.正確配置smarty。主要要配置smarty模板文件的路徑;
2.php頁面中使用assign賦值 和 display顯示頁面;
3.smarty模板文件中不允許出現php代碼段,所有的注釋,變量,函數都要包含在定界符內。
~~~
38. 如果理解oop?
~~~
OOP(object oriented programming),即面向對象編程,其中兩個最重要的概念就是類和對象。
世間萬物都具有自身的屬性和方法,通過這些屬性和方法可以區分出不同的物質。
屬性和方法的集合就形成了類,類是面向對象編程的核心和基礎,
通過類就將零散的用于實現某個功能的代碼有效地管理起來了。
類只是具備了某些功能和屬性的抽象模型,而實際應用中需要一個一個實體,也就是需要對類進行實例化,
類在實例化之后就是對象。
OOP具有三大特點:
1. 封裝性:
也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。
于是開發人員只需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,
實現代碼模塊間松藕合。
2. 繼承性:
就是子類自動繼承其父級類中的屬性和方法,并可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。
php只支持單繼承,也就是說一個子類只能有一個父類。
3. 多態性:
子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。
于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。
多態性增強了軟件的靈活性。
~~~