我們在之前的文章中我們介紹了php面試題的匯總,以及php面試題中thinkphp以及筆記題目的匯總,這些對新手以及工作經驗不是很多的小伙伴們來說已經是足夠使用了,但對於一些高手甚至是工作三四年的朋友來說我們之前介紹的php面試題顯然就不夠用了,那麼我們今天就大家來總結下php面試題中的PHP核心技術!
PHP核心技術
1.請寫一段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);?>
2.寫一個函數,盡可能高效的,從一個標準url裡取出檔案的副檔名,例如:http://www.php.cn/abc/de/fg.php?id=1需要取出php或.php
<?php // 方案一 function getExt1($url){ $arr = parse_url($url); //Array ( [scheme] => http [host] => www.php.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.php.cn/abc/de/fg.php?id=1"; echo getExt1($path); echo "<br />"; echo getExt2($path);?>
相關題目:使用五種以上方式取得一個檔案的副檔名,要求:dir/upload.image.jpg,找出.jpg或jpg,必須使用PHP自帶的處理函數進行處理,方法不能明顯重複,可以封裝成函數,例如get_ext1(filename ),getext2(file_name)
3.簡述論壇中無限分類的實作原理
##建立類別表如下:
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; } ?>
#4.寫出一個正則表達式,過慮網頁上的所有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);//以下内容不显示:脚本内容 ?>
5.寫出一個能創建多級目錄的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 "创建目录失败"; } } }?>
6.PHP的垃圾收集機制是怎樣的
PHP可以自動進行記憶體管理,清除不再需要的物件。PHP使用了引用計數(reference counting)這個單純的垃圾回收(garbage collection)機制。每個對象內含一個引用計數器,每個reference連接到對象,計數器加1。當reference離開生存空間或被設為NULL,計數器會減1。當某個物件的參考計數器為零時,PHP知道你將不再需要使用這個對象,釋放其所佔的記憶體空間。
7.寫一個函數,能夠遍歷一個資料夾下的所有檔案和子資料夾
<?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; } } }?>
8.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)?>
9.PHP中,如何得到一個陣列的鍵值?
使用key()可以獲得陣列中目前元素的鍵名,使用current()則可以傳回目前元素的值。使用array_keys()則可以得到陣列中所有的鍵名。
使用foreach結構foreach($arr as key=>value)可以透過key和value分別取得鍵名和值。
10.如果模板是用smarty模板。怎樣用section語句來顯示一個名為$data的群組。例如:
$data=array(0=>array('id'=>8,'name'=>'name1'),1=>array('id'=>10,'name'=>'name2'),2=>array('id'=>15,'name'=>'name3') );
寫出在模板頁的程式碼?若用foreach語句又要怎樣顯示呢?
<{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}>
總結:
#在我們這片文章我們主要給大家總結的是php面試題中php核心技術,對於新手可能有點深度了,但是對於經驗豐富的朋友來說,這確實一個不錯的選擇!希望對你有幫助!相關推薦:#
#以上是php面試題中php核心技術的問題分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!