PHP筆試題和面試題,php試題和面
1、不用新變量直接交換現有兩個變量的值
(1)list($a,$b)=array($b,$a);
(2)a=a+b,b=a-b,a=a-b
2、PHP數字金額轉大小格式,同時說明思路
function daxie($num){
$da_num = array('零','一','二','三','四','五','六','七','八','九');
$return = '';
$len_num = strlen($num);
if(!is_numeric($num) || $len_num < 0){
return '';
}
for($i=0;$i<$len_num;$i++){
$return .= $da_num[ substr($num,$i,1)];
}
return$return;
}
3.SQL查詢語句如下:
select * from table where (ID = 10) or (ID = 32) or (ID = 22) or (ID = 76) or (ID = 13) or (ID = 44) 讓結果按10,32,22,76,13,44的順序檢索出來,請問如何書寫?
select * from table
where id in (10,32,22,76,13,44)
order by charindex(id,'10,32,22,76,13,44') desc
4.用PHP打印出前一天的時間,格式是2006-5-10 22:21:21
(1)
echo
date
(
'Y-m-d H:i:s'
,time()-60*60*24);
(2)
echo
date
(
'Y-m-d H:i:s'
,
strtotime
(
'-1 day'
))
5. echo(),print(),print_r()的區別
echo
是語言結構,無返回值;
print
功能和
echo
基本相同,不同的是
print
是函數,有返回值;print_r是遞歸打印,用於輸出數組或對象
6.能夠使HTML和PHP分離開使用的模板
PHP本身是一種模版引擎,我用過的是smarty,常見的還有PHPLib,FastTemplate,Savant
7.使用哪些工具進行版本控制?
CVS和SVN,SVN號稱下一代CVS,功能強大,不過CVS是老牌,市占率很高.CVS Server on Apache作服務端,WinCVS作客戶端;<br>Subversion on Apache/DAV 做服務端,TortoiseSVN做客戶端,或者Subclipse做客戶端
8.如何實現字符串翻轉?
其實PHP本身就有字符串翻轉的函數:
strrev
(),不過這種方法都不能解決中文字符串翻轉的問題,會出錯的。
<?php
function
reverse(
$var
)
{
$res
=
""
;
for
(
$i
=0,
$j
=
strlen
(
$var
);
$i
<
$j
;
$i
++)
{
$res
=
$var
[
$i
].
$res
;
}
return
$res
;
}
$tmpvar
=
"wofang"
;
$res
=reverse(
$tmpvar
);
echo
$res
;
?>
9.優化MYSQL數據庫的方法
(1).數據庫設計方面,這是DBA和Architect的責任,設計結構良好的數據庫,必要的時候,去正規化(英文是這個:denormalize),<br> 允許部分數據冗余,避免JOIN操作,以提高查詢效率
(2).系統架構設計方面,表散列,把海量數據散列到幾個不同的表裡面.快慢表,快表只留最新數據,慢表是歷史存檔.集群,主服務器Read & write,<br> 從服務器read only,或者N台服務器,各機器互為Master
(3).(1)和(2)超越PHP Programmer的要求了,會更好,不會沒關系.檢查有沒有少加索引
(4).寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連接啊,大量的Group By和order by,沒有limit等等.<br> 必要的時候,把數據庫邏輯封裝到DBMS端的存儲過程裡面.緩存查詢結果,explain每一個sql語句
(5).所得皆必須,只從數據庫取必需的數據,比如查詢某篇文章的評論數,select
count
(*) … where article_id = ? <br> 就可以了,不要先select * … where article_id = ?然後msql_num_rows.
只傳送必須的SQL語句,比如修改文章的時候,如果用戶只修改了標題,那就update … set title = ? where article_id = ?<br> 不要set content = ?(大文本)
(6).必要的時候用不同的存儲引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度
10.用PHP寫出顯示客戶端IP與服務器IP的代碼:
echo
'客戶端IP:'
.
$_SERVER
[
'REMOTE_ADDR'
].
'<br />'
;
echo
'服務器端IP:'
.
gethostbyname
(
$_SERVER
[
'SERVER_NAME'
]);
11.在PHP中,當前腳本的名稱(不包括路徑和查詢字符串)記錄在預定義變量(1)中;而鏈接到當前頁面的URL記錄在預定義變量(2)中。前執行腳本的絕對路徑名(3),正在浏覽當前頁面用戶的 IP 地址(4),查詢(query)的字符串(URL 中第一個問號 ? 之後的內容):id=1&bi=2(5),當前運行腳本所在的文檔根目錄(6)。
(1)
$_SERVER
[
'SCRIPT_FILENAME'
];或者
$_SERVER
[
'PHP_SELF'
]<br>(2)
$_SERVER
[
'HTTP_REFERER'
]
(3)
$_SERVER
[
'SCRIPT_FILENAME'
];<br>(4)
$_SERVER
[
'REMOTE_ADDR'
];<br>(5)
$_SERVER
[
'QUERY_STRING'
];<br>(6)
$_server
[
'DOCUMENT_ROOT'
];
12.執行程序段 將輸出__。
(1)
echo
8%(-2)。輸出:0
(2)
echo
(-8)%3 .輸出:-2
(3)
echo
8%(-3).輸出:2
13.數組函數 arsort 的作用是____;語句 error_reporting(2047)的作用是____。
arsort:對數組進行逆向排序並保持索引關系
error_reporting
(2047)的作用是:report All errors
and
warnings
14.寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把script標記及其內容都去掉):
$a
=
"<script type='text/javascript'>XXXXXXXXXXXXXXX</script>"
;<br>
echo
preg_replace(
'/\<script[^>]*?>.*<\/script\>/is'
,
''
,
$a
);
15.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句____動態裝載PHP模塊,
然後再用語句____使得Apache把所有擴展名為php的文件都作為PHP腳本處理。
LoadModule php5_module
"c:/php/php5apache2.dll"
;
AddType application/x-httpd-php .php
16.類的屬性可以序列化後保存到 session 中,從而以後可以恢復整個類,這要用到的函數是
serialize() /unserialize()
17.MySQL數據庫,怎麼優化?
(1) 配置優化(服務器配置) (2)建表優化(表、字段設置) (3)查詢優化(sql語句) 答: 1、選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設置NOT NULL,例如’省份,性別’,最好設置為ENUM 2、使用連接(JOIN)來代替子查詢: 3、使用聯合(UNION)來代替手動創建的臨時表 4、事務處理: 5、鎖定表,優化事務處理: 6、使用外鍵,優化鎖定表 7、建立索引: 8、優化查詢語句
18.數據庫中的事務是什麼?
事務(transaction)是作為一個單元的一組有序的數據庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成, 事務則提交,其修改將作用於所有其他數據庫進程。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。
19.如何修改SESSION的生存時間
方法1:將php.ini中的session.gc_maxlifetime設置為9999重啟apache
方法2:$savePath = "./session_save_dir/"; $lifeTime = 小時 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime); session_start();
方法3:setcookie() and session_set_cookie_params($lifeTime);
20.有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?
方法1(對於PHP5及更高版本):
$readcontents = fopen("http://www.phpres.com/index.html", "rb"); $contents = stream_get_contents($readcontents); fclose($readcontents); echo $contents;
方法2: echo file_get_contents("http://www.phpres.com/index.html");
21.談談asp,php,jsp的優缺點
ASP全名Active Server Pages,是一個WEB服務器端的開發環境, 利用它可以產生和運行動態的、交互的、高性能的WEB服務應用程序。ASP采用腳本語言VB Script(Java script )作為自己的開發語言。
PHP是一種跨平台的服務器端的嵌入式腳本語言. 它大量地借用C,Java和Perl語言的語法 , 並耦合PHP自己的特性,使WEB開發者能夠快速地寫出動態生成頁面.它支持目前絕大多數數據庫。還有一點,PHP是完全免費的,不用花錢,而且你可以不受限制地獲得源碼,甚至可以從中加進你自己需要的特色。
JSP 是Sun公司推出的新一代站點開發語言,他完全解決了目前ASP,PHP的一個通病-- 腳本級執行,Jsp 可以在Serverlet和JavaBean的支持下,功能強大。
三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執行程序代碼的能力。 但JSP代碼被編譯成 Servlet 並由 Java 虛擬機解釋執行,這種編譯操作僅在對 JSP 頁面的 第一次請求時發生。在 ASP 、PHP、JSP 環境下, HTML 代碼主要負責描述信息的顯示樣式 ,而程序代碼則用來描述處理邏輯。普通的 HTML 頁面只依賴於 Web 服務器,而 ASP 、PH P、JSP 頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入到 HTML 代碼中,然後一起發送給浏覽器。 ASP 、PHP、 JSP三者都是面向 Web 服務器的技術 ,客戶端浏覽器不需要任何附加的軟件支持。
22.請說明php中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?
按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須復制值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。
按引用傳遞則不需要復制值,對於性能提高很有好處。
23.JS的轉向函數是?怎麼引入一個外部JS文件?
window.location.href,<script type="text/javascript" src="js/js_function.js"></script>
24.GD庫是做什麼用的?
gd庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。 在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。
=================================================================================================
- 我們在使用哪個版本的 PHP?
- PHP 標簽有那些?
- 在一個純 PHP 文件(例如,僅包含一個類定義的文件)中包含一個關閉?>標簽時,確保其後不會跟著任何換行。 說說你的理解。
- 自動加載類,有那些方法?
- 單引號和雙引號有什麼異同?
- define() vs. Const ?
- 有多種方式來配置一個 web 服務器以提供 PHP 服務。你知道哪幾種?
- 淨化 HTML 輸入和輸出,如何處理?
- PHP 中的UTF-8,你有什麼認識?
- php處理日期和時間方式?
=================================================================================================
1.寫一個function實現數組內每個元素之間加法的迭代運算,注意:數組元素全部為自然數。例子:$data=array(1.2.3);程序要求打印出數組每個數組元素相互之間各種可能性加法(包括元素自己本身加法)1+1=2,1+2=3,1+3=4,2+2=4,2+3=5,3+3=6
2.一個小孩買了價值小於1美元的糖,並將1美元的錢交給售貨員。售貨員希望用數目最少的硬幣個數找給小孩。假設提供的數目不限的面值為25美分,10美分,5美分,1美分的硬幣,寫一個算法讓售貨員用最少的硬幣個數找給小孩。
3.有10名新員工,按其應聘成績排名1到10,並用10個連續四位自然數依次作為他們的工號。其每個人的工號都能被他們的成績排名整除,問他們的工號分別是什麼?
=================================================================================================
1. 變量如何定義?如何檢查變量是否定義?如何刪除一個變量?判斷一個變量是否為空的函數?
isset() 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'] 來調用。
20. global關鍵詞如何使用?預定義的全局變量數組$GLOBALS如何使用?
Global的作用是定義全局變量,但是這個全局變量不是應用於整個網站,而是應用於當前頁面,包括include或require的所有文件。
在 $GLOBALS 數組中,每一個變量為一個元素,鍵名對應變量名,值對應變量的內容。$GLOBALS 之所以在全局范圍內存在,是因為 $GLOBALS 是一個超全局變量。global 也就是說在一個文件裡 只要你聲明為global $db 那麼在聲明的下面 你就可以引用這個$db了。
21. 什麼是靜態變量?
如果一個函數內定義的變量前使用關鍵字static來聲明,那麼該變量就是靜態變量。 一般函數內的變量在函數調用結束後,其存儲的數據將被清除,所占的內存空間也被釋放。而使用靜態變量時, 該變量會在函數第一次被調用時被初始化,初始化後該變量也不會被清除,當再次調用該函數時,這個靜態變量 不再被初始化,而能保存上次函數執行完後的值。可以說靜態變量在所有對該函數的調用之間共享。
22. php中函數傳遞參數的方式有哪些?兩者有什麼區別?
按值傳遞和按地址傳遞(或按引用傳遞) (1)按值傳遞: 待傳遞的變量,與傳遞給函數之後的變量是存儲在不同的空間中。所以函數體內對 該變量值做的修改,不影響原本的變量值。 (2)按地址傳遞: 使用 & 符號,表明該參數是以地址的方式傳遞值。並不會將主程序中的指定數值或目標變量傳遞給函數,而是把該數值或變量的內存儲存區塊地址導入函數之中,所以函數體內的該變量和主程序中的該變量在內存 中是同一個。函數體做的修改,直接影響到函數體外部的該變量的值。
23. 什麼是遞歸函數?如何進行遞歸調用?
遞歸函數其實就是調用自身的函數,但是必須滿足以下兩個條件: 1)在每一次調用自身時,必須是更接近於最終結果; 2)必須有一個確定的遞歸終止條件,不會造成死循環。
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() 的別名 字符串:strlen()、mb_strlen();
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. 字符串定義的時候單引號和雙引號有什麼區別?
” ” 雙引號裡面的字段會經過編譯器解釋,然後再當作HTML代碼輸出。
‘ ‘ 單引號裡面的不進行解釋,直接輸出。
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 = “
[email protected]”; 請將此郵箱的域(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]] )
43. 如果想過濾掉某個字符串中所有的html標記使用哪個函數?
好像是用strip_tags函數吧
44. preg_replace()和 str_ireplace()兩個函數在使用上有什麼不同?preg_split()和split()函數如何使用?
str_replace:這個應該作為字符串替換的首選方法,不過有一點需要注意,就是把最希望匹配的元素放在前面。
strtr: strtr在短字符串替換的時候也是挺高效的,不過search數組的下標長度的差別也對效率產生比較大的影響,還有就是沒事最好不要使用strtr(string, string, string)這種形式(對於非單字節字符很容易產生亂碼)。
preg_replace:這個不用說,可以使用正則匹配,功能絕對是最強的,不過也是要犧牲一點效率的。
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’])來過濾表單傳參就可以避免腳本攻擊。
47. 連接數據庫操作的步驟是什麼?每一步的返回值是什麼數據類型?尤其是mysql_query()返回什麼數據類型?
$conn=mysql_pconnect("localhost","root","123456");//打開連接
mysql_select_db("數據庫名",$conn);//連接到指定的數據庫
mysql_query("set names utf8");//設置字符編碼
$sql="";
$R=mysql_query($sql);//執行SQL語句返回結果集
while($v=mysql_fetch_array($R)){
echo "字段名".$v['title'];
}
mysql_query()如果裡面放的是查詢之類的語句,那返回的是資源,說白了就是你要查的數據結果集;如果裡面放的是增刪改之類的語句,那返回的是true或者false了。
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. 請說出目前學過的返回是資源的函數?
答: mysql_connect(); mysql_query();只有這執行select的時候成功,才返回資源,失敗返回FALSE fopen();
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函數進行跳轉頁面,header(‘Location:’.$url);使用header聲明content-type,header(‘content-type:text/HTML;charset=utf-8′);使用header返回response 狀態碼,例如:header(‘HTTP/1.1 404 Not Found’);使用header在某個時間後執行跳轉,header(“Refresh: {$delay}; url={$url}”),其中$delay就是推遲跳轉的時間,$url為需要跳轉的url;使用header控制浏覽器緩存;執行http驗證,header(‘HTTP/1.1 401 Unauthorized’),header(‘WWW-Authenticate: Basic realm=”Top Secret”‘);使用header進行下載操作;
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. 封裝性(又叫做隱藏性);2. 繼承性; 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會自動生成一個,這個自動生成的構造方法沒有任何參數, 沒有任何操作。析構方法的作用和構造方法正好相反,是對象被銷毀時被自動調用的,作用是釋放內存。 析構方法的定義方法為:__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層。
80. 略
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一個對象會出現錯誤提示。print一個數組時也只是輸出“Array”,print一個對象出現錯誤提示, 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. 如果一個類是抽象類,而類中的方法都是非抽象的方法,會報錯嗎?
不會,如果一個類是抽象類,其中可以沒有抽象方法,但是一個類中有個方法是抽象方法,那麼這個類一定是一個抽象類
93.略
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 的目的是重建在序列化中可能丟失的任何數據庫連接以及處理其它重新初始化的任務。
100. OOP的三大特性是什麼?
1. 封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。於是開發人員只需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。 2. 繼承性:就是子類自動繼承其父級類中的屬性和方法,並可以可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。php只支持單繼承,也就是說一個子類只能有一個父類。 3. 多態性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。於是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法後卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。
101. 常見框架
thinkPHP yii ZendFramework CakePhp sy
102. 常用魔術方法的觸發時機?
1)__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. 略
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。
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. 略
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. 分頁原理是什麼?
數據分頁需要以下幾個條件: 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;
121、如何在smarty模板語言中使用php代碼?
借助於兩個smarty內建函數。 1. inluce_php 函數用於在模板中包含 php 腳本。例如: {include_php file="test.php"} 2. php 標簽允許在模板中直接嵌入 php 腳本。例如: {php} echo "這個是php內建函數的作用"; {/php}
122、請列出至少五個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(‘’)} ,格式化時間戳。
123、寫程序實現如下功能:
a.如何判斷一個字符串中是否存在一個字符? echo strstr('abcdefgcd' , 'cd'); echo strpos('ab0defgcd' , 'cd'); b.如何判斷一個字符串中一個字符出現的次數? echo substr_count('abcdefgcd' , 'cd'); c.如何去掉一個字符串的最後一個字符 echo substr('abcdefgcd' , 0 , -1);
124、請說明smarty中fetch方法的功能?
Fetch方法可以獲取到頁面所有的內容,並且賦值到一個變量中。 如果第四個參數為true,則等同於display,直接輸出到浏覽器中。 如果第四個參數為false,則不輸出。 Display方法就是第四個參數為true的fetch方法。 Display = Fetch() + echo()
125、常用的正則表達式寫法:
中文:/^[\u4E00-\u9FA5]+$/
手機號碼:/^(86)?0?1\d{10}$/ EMAIL: /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/
密碼(安全級別中): /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/
密碼(安全級別高): /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/
=================================================================================================