一、PHP核心技術
更多PHP相關知識請關注我的專欄PHP?zhuanlan.zhihu.com
1.寫出一個能創建多級目錄的PHP函式(新浪網技術部)
<?php /** * 創建多級目錄 * @param $path string 要創建的目錄 * @param $mode int 創建目錄的模式,在windows下可忽略 */ function create_dir($path,$mode = 0777) { if (is_dir($path)) { # 如果目錄已經存在,則不創建 echo "該目錄已經存在"; } else { # 不存在,創建 if (mkdir($path,$mode,true)) { echo "創建目錄成功"; } else { echo "創建目錄失敗"; } } } ?>
2.寫出smarty模板的特點(新浪網技術部)
速度快,編譯型,快取技術,插件機制,強大的表現邏輯
3.打開php.ini中的safe_mode,會影響哪些函式?至少說出6個,(新浪)
safe_mode,PHP安全模式,它提供一個基本安全的共享環境,在一個有多個用戶賬戶存在的php開發的web服務器上,當安全模式打開的時候,一些函式將被完全的禁止,而另一些函式的功能將會受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等,
注意,在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了,
4.抓取遠程圖片到本地,你會用什么函式?(http://51.com筆試題)
file_get_contents或者curl
5.PHP的垃圾收集機制是怎樣的(騰訊)
PHP可以自動進行記憶體管理,清除不再需要的物件,
PHP使用了參考計數(reference counting)這種單純的垃圾回收(garbage collection)機制,每個物件都內含一個參考計數器,每個reference連接到物件,計數器加1,當reference離開生存空間或被設為NULL,計數器減1,當某個物件的參考計數器為零時,PHP知道你將不再需要使用這個物件,釋放其所占的記憶體空間,
6.請寫一段PHP代碼,確保多個行程同時寫入同一個檔案成功(騰訊)
核心思路:加鎖
<?php $fp = fopen("lock.txt","w+"); if (flock($fp,LOCK_EX)) { //獲得寫鎖,寫資料 fwrite($fp, "write something"); // 解除鎖定 flock($fp, LOCK_UN); } else { echo "file is locking..."; } fclose($fp); ?>
7.寫一個函式,盡可能高效的,從一個標準url里取出檔案的擴展名,例如:
http://www.sina.com.cn/abc/de/fg.php?id=1需要取出php或.php(新浪)
<?php // 方案一 function getExt1($url){ $arr = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 ) $file = basename($arr['path']); $ext = explode('.', $file); return $ext[count($ext)-1]; } // 方案二 function getExt2($url){ $url = basename($url); $pos1 = strpos($url,'.'); $pos2 = strpos($url,'?'); if (strstr($url,'?')) { return substr($url,$pos1+1,$pos2-$pos1-1); } else { return substr($url,$pos1); } } $path = "http://www.sina.com.cn/abc/de/fg.php?id=1"; echo getExt1($path); echo "<br />"; echo getExt2($path); ?>
相關題目:使用五種以上方式獲取一個檔案的擴展名,要求:dir/upload.image.jpg,找出.jpg或者jpg,必須使用PHP自帶的處理函式進行處理,方法不能明顯重復,可以封裝成函式,比如get_ext1(file_name)
8.寫一個函式,能夠遍歷一個檔案夾下的所有檔案和子檔案夾,(新浪)
<?php function my_scandir($dir){ $files = array(); if(is_dir($dir)){ if ($handle = opendir($dir)) { while (($flie = readdir($handle))!== false) { if ($flie!="." && $file!="..") { if (is_dir($dir."/".$file)) { $files[$file] = my_scandir($dir."/".$file); } else { $files[] = $dir."/".$file; } } } closedir($handle); return $files; } } } ?>
9.簡述論壇中無限分類的實作原理,(新浪)
創建類別表如下:
CREATE TABLE category( cat_id smallint unsigned not null auto_increment primary key comment'類別ID', cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'類別名稱', parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'類別父ID' )engine=MyISAM charset=utf8;
撰寫一個函式,遞回遍歷,實作無限分類
<?php
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是頂級分類,則將其存到$list中,并以此節點為根節點,遍歷其子節點
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
?>
10.寫一個函式,算出兩個檔案的相對路徑,如b='/a/b/12/34/c.php';計算出a的相對路徑應該是../../c/d(新浪)
<?php function releative_path($path1,$path2){ $arr1 = explode("/",dirname($path1)); $arr2 = explode("/",dirname($path2)); for ($i=0,$len = count($arr2); $i < $len; $i++) { if ($arr1[$i]!=$arr2[$i]) { break; } } // 不在同一個根目錄下 if ($i==1) { $return_path = array(); } // 在同一個根目錄下 if ($i != 1 && $i < $len) { $return_path = array_fill(0, $len - $i,".."); } // 在同一個目錄下 if ($i == $len) { $return_path = array('./'); } $return_path = array_merge($return_path,array_slice($arr1,$i)); return implode('/',$return_path); } $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; $c = '/e/b/c/d/f.php'; $d = '/a/b/c/d/g.php'; echo releative_path($a,$b);//結果是../../c/d echo "<br />"; echo releative_path($a,$c);//結果是a/b/c/d echo "<br />"; echo releative_path($a,$d);//結果是./ echo "<br />"; ?>
11.mysql_fetch_row()和mysql_fetch_array()有什么分別?
mysql_fetch_row()把資料庫的一列儲存在一個以零為基數的陣列中,第一欄在陣列的索引0,第二欄在索引1,依此類推,
mysql_fetch_assoc()把資料庫的一列儲存在一個關聯陣列中,陣列的索引就是欄位名稱,例如我的資料庫查詢送回“first_name”、“last_name”、“email”三個欄位,陣列的索引便是“first_name”、“last_name”和“email”,
mysql_fetch_array()可以同時送回mysql_fetch_row()和mysql_fetch_assoc()的值,
12.有一個網頁地址,比如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");
13.談談對mvc的認識
由模型(model),視圖(view),控制器(controller)完成的應用程式,
model層負責提供資料,和資料庫有關的操作都交給模型層來處理,view層則提供互動的界面,并輸出資料,而controller層則負責接收請求,并分發給相應的model來處理,然后呼叫view層來顯示,
14.What does the GD library do?(Yahoo)
GD庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片,在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站資料生成報表,自從PHP 4.3.0版本后GD便內建在PHP系統中,
15.What function can you use to open a file for reading and writing?(Yahoo)
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()這不是一個PHP函式,會引致執行錯誤,
file_open()這不是一個PHP函式,會引致執行錯誤,
fopen()這是正確答案,fopen()可以用來開啟檔案以便讀寫,
open_file()這不是一個PHP函式,會引致執行錯誤,
16.Smarty的原理
smarty是一個模板引擎,使用smarty主要是為了實作邏輯和外在內容的分離,如果不使用模板的話,通常的做法就是php代碼和html代碼混編,使用了模板之后,則可以將業務邏輯都放到php檔案中,而負責顯示內容的模板則放到html檔案中,
Smarty在執行display方法的時候,讀取模板檔案,并進行資料替換,生成編譯檔案,之后每次訪問都會直接訪問編譯檔案,讀取編譯檔案省去了讀取模板檔案,和字串替換的時間,所以可以更快,編譯檔案里時間戳記錄模板檔案修改時間,如果模板被修改過就可以檢測到,然后重新編譯(編譯是把靜態內容保存起來,動態內容根據傳入的引數不同而不同),
如果啟用了快取,則會根據編譯檔案生成快取檔案,在訪問的時候如果有快取檔案并且快取檔案沒有過期,則直接訪問快取檔案,
相關題目1:能夠使HTML和PHP分離開使用的模板
smarty,phplib等
相關題目2:您是否用過模板引擎?如果有您用的模板引擎的名字是?
Smarty
17.PHP如何實作頁面跳轉
方法一:php函式跳轉,缺點,header頭之前不能有輸出,跳轉后的程式繼續執行,可用exit中斷執行后面的程式,
header("Location:網址");//直接跳轉
header("refresh:3;url=http://axgle.za.NET");//三秒后跳轉
方法二:利用meta
echo"<meta http-equiv=refresh content='0;url=網址'>";
18.PHP可以和sql server/oracle等資料庫連接嗎?
可以
19.使用哪些工具進行版本控制?
SVN或者CVS
相關題目:您是否用過版本控制軟體?如果有您用的版本控制軟體的名字是?
TortoiseSVN-1.2.6
20.寫出一個正則運算式,過慮網頁上的所有JS/VBS腳本(即把script標記及其內容都去掉):
過濾JavaScript腳本參考:
<?php header("content-type:text/html;charset=utf-8"); $script = "以下內容不顯示:<script type='text/javascript'>alert('cc');</script>"; $pattern = '/<script[^>]*?>.*?</script>/si'; echo preg_replace($pattern, "腳本內容", $script);//以下內容不顯示:腳本內容 ?>
21.給定一行文本$string,如何撰寫一個正則運算式來去掉所有的HTML標記?
方案一,使用PHP內建函式strip_tags()除去HTML標簽
方案二,自定義函式,如下:
<?php header("content-type:text/html;charset=utf-8"); function strip_html_tags($str){ $pattern = '/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>/'; return preg_replace($pattern,'',$str); } // 實體 $html = '<p id="">ddddd<br /></p>'; echo strip_html_tags($html); echo "<br />"; $html = '<p id=">">bb<br />aaa<br /></p>'; echo strip_html_tags($html); ?>
22.請寫一個函式驗證電子郵件的格式是否正確(要求使用正則)(新浪)
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);
相關題目:請用正則運算式寫一個函式,驗證電子郵件的格式是否正確,(鑫眾人云)
23.請對POSIX風格和兼容Perl風格兩種正則運算式的主要函式進行類比說明(騰訊)
主要區別有以下三種:
preg_replace()里面的正則可以寫成型如:"/.xxx/"而ereg_replace()里面的正則需寫成型如 "xxx"
preg_replace()能操作陣列,而ereg_replace()不可以
在逆向參考用preg_replace()可使用0-99個,而ereg_replace()最多為9個
使用Perl兼容正則運算式語法的preg_match()函式通常是比ereg()更快的替代方案,
24.請寫出并說明如何在命令列下運行PHP腳本(寫出兩種方式)同時向PHP腳本傳遞引數?(騰訊)
首先進入php安裝目錄
php -f d:/wamp/www/1.php 其中-f引數指定要執行的php檔案
php -r phpinfo(); 其中-r表示直接執行php代碼,無需寫開始結束標記
25.使用正則運算式提取一段標識語言(html或xml)代碼段中指定標簽的指定屬性值(需考慮屬性值對不規則的情況,如大小寫不敏感,屬性名值與等號間有空格等),此處假設需提取test標簽的attr屬性值,請自行構建包含該標簽的串(騰訊)
撰寫如下函式:
<?php header("content-type:text/html;charset=utf-8"); function getAttrValue($str,$tagName,$attrName){ $pattern1="/<".$tagName."(\\s+\\w+\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\9))*\\s*>/i"; $arr=array(); $re=preg_match($pattern1,$str,$arr); if($re){ echo"<br/>\$arr[6]={$arr[6]}"; }else{ echo"<br/>沒找到,"; } } // 示例 $str1="<test attr='ddd'>"; getAttrValue($str1,"test","attr");//找test標簽中attr屬性的值,結果為ddd $str2="<test2 attr='ddd'attr2='ddd2't1=\"t1 value\"t2='t2 value'>"; getAttrValue($str2,"test2","t1");//找test2標簽中t1屬性的值,結果為t1 value ?>
26.What does the following code do?Explain what's going on there.date);(Yahoo)
這是把一個日期從MM/DD/YYYY的格式轉為DD/MM/YYYY格式,
輸出26/08/2003
27.What function would you use to redirect the browser to a new page?(Yahoo)
A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir()這不是一個PHP函式,會引致執行錯誤,
header()這個是正確答案,header()函式發送頭資訊,可以用來使瀏覽器轉向到另一個頁面,例如:header("Location:http://www.search-this.com/"),
location()這不是一個PHP函式,會引致執行錯誤,
redirect()這不是一個PHP函式,會引致執行錯誤,
28.When turned on____________will_________your script with different variables from
HTML forms and cookies.(騰訊)
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C
29.一個函式的引數不能是對變數的參考,除非在php.ini中把____設為on,
allow_call_time_pass_reference
是否啟用在函式呼叫時強制引數被按照參考傳遞
30.在HTML語言中,頁面頭部的meta標記可以用來輸出檔案的編碼格式,以下是一個標準的meta陳述句<META http-equiv='Content-Type'content='text/html;charset=gbk'>,請使用PHP語言寫一個函式,把一個標準HTML頁面???的類似meta標記中的charset部分值改為big5,(新浪)
請注意:
(1)需要處理完整的html頁面,即不光此meta陳述句
(2)忽略大小寫
(3)'和"在此處是可以互換的
(4)'Content-Type'兩側的引號是可以忽略的,但'text/html;charset=gbk'兩側的不行
(5)注意處理多余空格
撰寫正則運算式如下:
$reg1="/(<meta\\s*http-equiv\\s*=\\s*(['\"]?)Content-Type(\\2)\\s*content\\s*=\\s*(['\"])text\/html;charset=)(UTF-8)(\\4)(\\s*\/?>)/i";
31.PHP中如何判斷一個字串是否是合法的日期模式:2007-03-13 13:13:13,要求代碼不超過5行,(酷訊)
<?php function checkDateTime($data){ if (date('Y-m-d H:i:s',strtotime($data)) == $data) { return true; } else { return false; } } // 示例 $data = '2015-06-20 13:35:42'; var_dump(checkDateTime($data));//bool(true) $data = '2015-06-36 13:35:42'; var_dump(checkDateTime($data));//bool(false) ?>
32.PHP中,如何獲得一個陣列的鍵值?(酷訊)
使用key()可以獲得陣列中當前元素的鍵名,使用current()則可以回傳當前元素的值,
使用array_keys()則可以得到陣列中所有的鍵名,
使用foreach結構foreach($arr as value)可以通過value分別獲取鍵名和值,
33.如果模板是用smarty模板,怎樣用section陳述句來顯示一個名為$data的組,比如:
$data=https://www.cnblogs.com/a609251438/p/array( 0=>array('id'=>8,'name'=>'name1'), 1=>array('id'=>10,'name'=>'name2'), 2=>array('id'=>15,'name'=>'name3') );
寫出在模板頁的代碼?若用foreach陳述句又要怎樣顯示呢?
用section陳述句:
<{section name=test loop=$data start=0 step=1}>
id:<{$data[test].id}><br/>
name:<{$data[test].name}><br/><br/>
<{sectionelse}>
陣列為空
<{/section}>
用foreach陳述句:
<{foreach from=$data item=test}>
id:<{$test.id}><br/>
name:<{$test.name}><br/><br/>
<{foreachelse}>
陣列為空
<{/foreach}>
34.哪個選項會匹配下邊的這個正則運算式?(/.*xyz\d/)
A.*****xyz
B.*****xyz1
C.******xyz2
D.*xyz
答案:C
35.以下哪個錯誤無法被標準的錯誤控制器獲取?
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:B
36.以下哪種錯誤型別無法被自定義的錯誤處理器捕捉到?(奇矩互動)
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:C
37.(^\s)|(\s$)這個正則運算式作用是:__________;
匹配以0個或多個空白符開頭或者0個或多個空白符結尾的字串
38.撰寫函式取得上一月的最后一天
<?php date_default_timezone_set('PRC'); /** * 獲取給定月份的上一月最后一天 * @param $date string 給定日期 * @return string 上一月最后一天 */ function get_last_month_last_day($date = ''){ if ($date != '') { $time = strtotime($date); } else { $time = time(); } $day = date('j',$time);//獲取該日期是當前月的第幾天 return date('Y-m-d',strtotime("-{$day} days",$time)); } // 測驗 echo get_last_month_last_day(); echo "<br />"; echo get_last_month_last_day("2013-3-21"); ?>
39.在很多時候,我們可以通過apache的主組態檔來設定對test目錄的訪問權限控制,如http://IP/test請問如果需設定test下的一個子目錄的訪問控制權限,是否可以在主組態檔中修改,如果不可以應如何解決,
可以,還可以在需要控制的子目錄下創建.htaccess檔案,寫入訪問控制,
40.如果我的網站用的utf-8編碼,為防止亂碼出現,都需要注意哪些地方?
從以下幾個方面考慮:
資料庫中庫和表都用utf8編碼
php連接mysql,指定資料庫編碼為utf8 mysql_query(“set names utf8”);
php檔案指定頭部編碼為utf-8header(“content-type:text/html;charset=utf-8”);
網站下所有檔案的編碼為utf8
html檔案指定編碼為utf-8<meta http-equiv="Content-Type"content="text/html;charset=utf-8"/>
41.在url中用get傳值的時候,若中文出現亂碼,應該用哪個函式對中文進行編碼?
urlencode()
42.寫出兩種對變數加密的函式?
md5(str);
43.如何把2009-9-2 10:30:25變成unix時間戳?
<?php date_default_timezone_set("PRC"); // 將字串轉成Unix時間戳 $unix_time = strtotime("2009-9-2 10:30:45"); echo $unix_time; echo "<br />"; // 格式化Unix時間戳為正常時間格式 echo date("Y-m-d H:i:s",$unix_time); ?>
44.如何把一個GB2312格式的字串裝換成UTF-8格式?
<?php iconv('GB2312','UTF-8','悄悄是別離的笙簫'); ?>
45.如果需要原樣輸出用戶輸入的內容,在資料入庫前,要用哪個函式處理?
htmlspecialchars或者htmlentities
46.寫出五種以上你使用過的PHP的擴展的名稱(提示:常用的PHP擴展)
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等
47.了解MVC模式嗎?請寫出三種以上目前PHP流行的MVC框架名稱(不區分大小寫)
FleaPHP、Zend Framework、CakePHP、Symfony、ThinkPHP、YII、CodeIgniter等
48.php中WEB上傳檔案的原理是什么,如何限制上傳檔案的大小?
上傳檔案的表單使用post方式,并且要在form中添加enctype='multipart/form-data',
一般可以加上隱藏域:<input type=hidden name='MAX_FILE_SIZE' value=https://www.cnblogs.com/a609251438/p/dddddd>,位置在file域前面,
value的值是上傳檔案的客戶端位元組限制,可以避免用戶在花時間等待上傳大檔案之后才發現檔案過大上傳失敗的麻煩,
使用file檔案域來選擇要上傳的檔案,當點擊提交按鈕之后,檔案會被上傳到服務器中的臨時目錄,在腳本運行結束時會被銷毀,所以應該在腳本結束之前,將其移動到服務器上的某個目錄下,可以通過函式move_uploaded_file()來移動臨時檔案,要獲取臨時檔案的資訊,使用$_FILES,
限制上傳檔案大小的因素有:
客戶端的隱藏域MAX_FILE_SIZE的數值(可以被繞開),
服務器端的upload_max_filesize,post_max_size和memory_limit,這幾項不能夠用腳本來設定,
自定義檔案大小限制邏輯,即使服務器的限制是能自己決定,也會有需要個別考慮的情況,所以這個限制方式經常是必要的,
49.簡述UBB code的實作原理,(YG)
UBB代碼是HTML的一個變種,通程序式自定義我們的標簽,比如“[a]PHP中UBB的使用[/a]”這樣的標簽,其實質就是查找[a][/a]標簽,將其替換成的標準html,說白了,就是將標準的html標記通過技術手段使其簡化,其輸出出來的結果還是標準的html,
明白了ubb的原理,那么再制作一個簡單的ubb編輯器就不難了,和fck之類的編輯器比較起來,ubb代碼最大的優點就是代碼簡單,功能很少,簡單的ubb只需要一個檔案,而且ubb標簽可以自己來定義,更改起來很方便,在php中就是利用替換函式就可以將
html進行標簽化,輸出時進行標簽的轉化,
50.怎么把檔案保存到指定目錄?怎么避免上傳檔案重名問題?
可以自己設定上傳檔案的保存目錄,與檔案名拼湊形成一個檔案路徑,使用move_uploaded_file(),就可以完成將檔案保存到指定目錄,
可以通過上傳的檔案名獲取到檔案后綴,然后使用時間戳+亂數+檔案后綴的方式為檔案重新命名,這樣就避免了重名,
51._____函式能回傳腳本里的任意行中呼叫的函式的名稱,該函式同時還經常被用在除錯中,用來判斷錯誤是如何發生的,(奇矩互動)
debug_print_backtrace()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91801.html
標籤:PHP
上一篇:PHP版本微信支付開發
