技術總結貼,蛋疼的人繞過,^_^。伴隨著Facebook的成功,PHP這門解釋型的Web開發語言由於其清晰的定位繼續受到非常多的關注,當然對於中小企業和個人來說,Linux+Apache/Nginx+PHP+MySQL幾乎不用考慮伺服器環境方面的成本;而對於開發人員來說,在中小型項目開發中PHP也非常容易上手,所以我也是目前打算主修PHP和資料庫DBA方向。
下面的這些PHP面試題很早就有了,但是我還是得把他們總結一下,談一些自己的意見。因為題目比較多,暫時就分為基礎語言方面的面試題、Regex、MySQL和系統內容的最佳化等方面的面試題兩個部分。當然,這個還是得強調,任何語言的面試題僅供參考,主要是讓大家瞭解一下這門語言的思維,把握技術經理的需求才是王道。
1. 用PHP列印出前一天的時間,格式是2006-5-10 22:21:21<?php
echo
date("Y-m-d H:i:s",time()-60*60*24);
echo
date("Y-m-d H:i:s",strtotime("-1 day"));
?>2. echo(),print(),print_r()的區別
echo 是語言結構,無傳回值;print 功能和echo基本相同,不同的是print是函數,有傳回值;print_r 是遞迴列印,用於輸出數組對象。
3. 能夠使HTML和PHP分離開使用的模板引擎
PHP模板引擎和架構是PHP面試題裡面必考的一些知識點,總的來說,瞭解smarty或者國內比較不錯的ThinkPHP都可以應對這類的問題,其實PHP這門語言本身也就是一個模板引擎。當然對實際應用的來說,大量使用正則的PHP模板引擎會提高後他開發和前端開發的效率,但是肯定會犧牲首次載入的效率。我在一位大牛的文章中看到過Blitz這個模板引擎,據說是使用C++寫的PHP擴充,號稱是速度最快的模板引擎,有興趣的可以去瞭解一下。
4. 如何?字串翻轉?
PHP本身就有字串翻轉的函數:strrev(),當然也可以定義簡單的函數來完成,下面的方法一和方法二隻能翻轉非漢字字串,方法三用來翻轉字串。
<?php
//方法一:PHP系統函數
echo
strrev("ABCDEF")."<br />";
//方法二:自訂函數,不能翻轉漢字。
function
myStrrev($str)
{
$newStr =
"";
for($i=0;$i<strlen($str);$i++)
{
$newStr =
$str[$i].$newStr;
}
return
$newStr;
}
echo
myStrrev("ABCDEF")."<br />";
//方法三,翻轉漢字
$newcnStr ="";
$cnStr =
str_split("我愛你",3);
//每個漢字佔3個位元組
//也可以使用array_reverse()翻轉後輸出
for($j=count($cnStr)-1;$j>=0;$j--)
{
$newcnStr .=$cnStr[$j];
}
echo
$newcnStr;
?>5. 執行程式段將輸出__?<?php
//參考手冊》語言參考》運算子》算術運算子》%為模數運算,輸出0
echo
8%(-2)."<br />";
//模數 $a % $b 在 $a 為負值時的結果也是負值。輸出-2
echo ((-8)%3)."<br
/>";
//輸出2
echo (8%(-3))."<br
/>";
?>6. 語句 include 和 require 都能把另外一個檔案包含到當前檔案中,它們的區別是____;為了避免多次包含同一檔案,可以用語句____來代替它們?
答:在如何處理失敗時,include() 產生一個警告而 require() 則導致一個致命錯誤;require_once()/include_once()
7. 寫一個函數,能夠遍曆一個檔案夾下的所有檔案和子檔案夾。
別人寫的代碼,已經足夠簡潔和給力了。
<?phpfunction my_scandir($dir){$files=array();if(is_dir($dir)){if($handle=opendir($dir)){while(($file=readdir($handle))!==false){if($file!="."&& $file!=".."){if(is_dir($dir."/".$file)){$files[$file]=my_scandir($dir."/".$file);}else{$files[]=$dir."/".$file;}}}closedir($handle);return $files;}}}echo "<pre>";print_r(my_scandir("D:\DouJia-3.5"));?>
8. 你如何利用 PHP 解決 HTTP 的無狀態本質?
最主要的倆各選擇是session和cookie。使用session的方法是在每一頁的開始加上 session_start(),然後利用$_SESSION散列表來儲存session變數。至於cookie你只需記著一個原則:在輸出任何文字之前調用set_cookie()函式,可以參考PHP會話管理之Cookie的使用,此外只需使用
$_COOKIE 散列表便可以存取所有 cookie 變數。
還有一個不那麼可靠的方法,就是利用訪客的 IP 位址,這個方法有特定的危險性。
9. 有一個一維數組,裡面儲存整形資料,請寫一個函數,將他們按從大到小的順序排列,要求執行效率高,並說明如何改善執行效率(該函數必須自己實現,不能使用php函數)。
學習C語言的時候各種排序方法是必須掌握的基本概念,尤其是冒泡排序法是程式員都很熟悉的演算法,其他的可以查看這篇很古老的文章:http://blog.csdn.net/rerli/archive/2003/12/15/19040.aspx,顯然C/C++裡面的指標和堆可以實現一些快速高效但是不穩定的演算法,PHP裡面保守一些還是採用穩定性比較好,演算法時間複雜度適中的冒泡排序法。
<?php
function
BubbleSort(&$arr)
{
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++)
{
if($flag==0)
{
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++)
{
if($arr[$j]>$arr[$j+1])
{
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=
array(1,3,6,8,2,7);
BubbleSort($test);
echo
"<pre>";
var_dump($test);
?>10. 以下哪一句不會把 John 新增到 users 陣列?
PHP中一些數組函數和字串函數是基礎中的基礎。
<?php
$users[]
= "john";
//成功把 John 新增到陣列 users。
array_add($users,"john");
//函式 array_add() 無定義。
array_push($users,"john");
//成功把 John 新增到陣列 users,參考array_push()函數。
$users ||=
"john";
//語法錯誤,不存在這個運算子。
?>
第一次總結,就這麼多吧,有時間準備更讓我雞動的Regex和資料庫方面的試題。