- 相關推薦
PHP大神分享面試技巧
PHP新手們是不是對PHP求職感到很迷茫,沒關系,PHP大神來幫你。以下是百分網小編精心為大家整理的PHP大神分享面試技巧,希望對大家有所幫助!更多內容請關注應屆畢業生網!
1.nginx使用哪種網絡協議?
nginx是應用層 我覺得從下往上的話 傳輸層用的是tcp/ip 應用層用的是http
fastcgi負責調度進程
2. 沒有輸出結果, 可能是什么原因, 簡述的解決此問題的過程(提示: 語法沒有問題)
可能服務器上面沒有開啟短標簽short_open_tag =設置為Off,,php.ini開啟短標簽控制參數: short_open_tag = On
3. 簡述下面程序的輸出結果, 簡要說明為什么, 如何解決這類問題?
$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
結果 1 int和string類型強制轉換造成的,0==="a"
0 == 0 肯定是true啊
PHP是弱類型。。
$tmp = 0 === "a"? 1: 2;
echo $tmp; 這樣就是2
4. 已知一個字符串如下: $str = "1109063 milo 1";
用一行代碼將該字符串里面的1109063賦值給$uid, milo賦值給$user, 1賦值給$type
空格如下
list($uid, $user, $type) = explode(" ", $str);
\t如下
list($uid, $user, $type) = explode("\t", $str);
list($uid, $user, $type) = sscanf($str, "%d %s %d");
$n = sscanf($auth, "%d\t%s %s", $id, $first, $last);
5. 分別列出如下類型的有符號和無符號范圍 TINYINT SMALLINT MEDIUMINT INT
TINYINT-2^7 - 2^7-10 ~ 2^8-1
SMALLINT-2^15 - 2^15-1 0 ~ 2^16-1
MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24-1
INT-2^31 - 2^31-1 0 ~ 2^32-1
6. 將下面的數組用一行拼裝成一個字符串i am milo! day day up!
$arr = array(
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'
);
?>
$str = strtolower(implode(" ",$arr));
7. 調用如下函數獲取函數并獲取count的值
function get_list($cnd = array(), &$count = false)
{
// 偽代碼 處理$cnd 并賦值datas
$datas = 'i am call back';
$count && $count = rand(1, 10000);
return $datas;
}
?>
$count=1;
$data = get_list($cnd,&$count);
echo $count;
8. 幾種方式去取代session機制, 簡單描述各自的優劣
mysql、memcache、cookie保持一種唯一狀態標識碼
9. 下列HTTP狀態碼出現的可能原因, 如何處理
200, 301, 404, 502, 503
200
請求已成功,請求所希望的響應頭或數據體將隨此響應返回。
301
被請求的資源已永久移動到新位置,并且將來任何對此資源的引用都應該使用本響應返回的若干個 URI 之一。如果可能,擁有鏈接編輯功能的客戶端應當自動把請求的地址修改為從服務器反饋回來的地址。除非額外指定,否則這個響應也是可緩存的。 新的永久性的 URI 應當在響應的 Location 域中返回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超鏈接及簡短說明。 如果這不是一個 GET 或者 HEAD 請求,因此瀏覽器禁止自動進行重定向,除非得到用戶的確認,因為請求的條件可能因此發生變化。 注意:對于某些使用 HTTP/1.0 協議的瀏覽器,當它們發送的 POST 請求得到了一個301響應的話,接下來的重定向請求將會變成 GET 方式。
404
請求失敗,請求所希望得到的資源未被在服務器上發現。沒有信息能夠告訴用戶這個狀況到底是暫時的還是永久的。假如服務器知道情況的話,應當使用410狀態碼來告知舊資源因為某些內部的配置機制問題,已經永久的不可用,而且沒有任何可以跳轉的地址。404這個狀態碼被廣泛應用于當服務器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況下。
502
作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
503
由于臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復。如果能夠預計延遲時間,那么響應中可以包含一個 Retry-After 頭用以標明這個延遲時間。如果沒有給出這個 Retry-After 信息,那么客戶端應當以處理500響應的方式處理它。 注意:503狀態碼的存在并不意味著服務器在過載的時候必須使用它。某些服務器只不過是希望拒絕客戶端的連接。
200 OK 一切正常,對GET和POST請求的應答文檔跟在后面。
301 Moved Permanently 客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL
404 Not Found 無法找到指定位置的資源。這也是一個常用的應答。
502 Bad Gateway 服務器作為網關或者代理時,為了完成請求訪問下一個服務器,但該服務器返回了非法的應答。
503 Service Unavailable 服務器由于維護或者負載過重未能應答。例如,Servlet可能在數據庫連接池已滿的情況下返回503。服務器返回503時可以提供一個Retry-After頭。
10. 有如下數據庫, 用原生態mysql擴展去連接并查詢user表的前十行
host: 192.168.0.254
port: 3306
user: one
pass: piece
database: db_user
table: user
$link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect: '.mysql_error());
mysql_select_db('db_user',$link);
$query = mysql_query("select * from user limit 10");
while($rs = mysql_fetch_array($query,MYSQL_ASSOC))
{}
11. 用autoload($class) 實現Lib目錄下的類的自動加載并可以兼容子目錄
$request->action = lcfirst(implode(array_map(
'ucfirst',
explode('-', strtolower($request->action))
)));
------------------------------------------------------------
function __autoload($class)
{
$cls = strtolower(str_replace("_","/",$class));
if(file_exsits(LIB.$cls.'.php'))
{
include_once(LIB.$cls.'.php');
}
else
{
die("not found {$class} class");
}
}
defined("LIB",'/data/wwwroot/www.xx.com/lib/');
$author = new Lib_Author();
-----------------------------------------------------------
function __authload($class)
{
$cls = explode("_",$class);
if(@is_dir($cls[1]))
{
if(@is_file($cls[2]))
{
include_once("CON_PATH".$cls[1].'/'.$cls[2].".php");
}
else
{
dir('error');
}
}
else if(@is_file($cls[1].".php"))
{
include_once("CON_PATH".$cls[1].".php");
}
else
{
dir('error');
}
}
---------------------------------------
function __autoload($class)
{
$cls = explode("_",$class);
$file = get_file($cls);
if($file=='error')
{
die('error');
}
include_once($file);
}
function get_file($dir)
{
if(is_array($dir))
{
foreach($dir as $k=>$v)
{
$tmpdir .= $v.'/';
if(is_dir('CON_PATH'.$tmpdir))
{
continue();
}
else if(is_file('CON_PATH'.$tmpdir.".php"))
{
return 'CON_PATH'.$tmpdir.".php";
}
else
{
return 'error';
}
}
return 'error';
}
return 'error';
}
defined("CON_PATH","/data/wwwroot/www.xx.com/app/cntroller/");
$sb = new controller_sb();
------------------------------------
function __autoload_my_classes($classname)
{
# ... your logic to include classes here
}
spl_autoload_register('__autoload_my_classes');
-----------------------------------------------------------
12. 用set_error_handle 去捕獲錯誤并輸出, 級別自己定
set_error_handle(callback,level)
function callback(int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ){
}
function dealErrorHandler($errno,$errstr,$errfile,$errline)
{
switch($errno){
case E_USER_ERROR:
echo "error [$errno] $errstr fatal error on line $errline in file $errfile";
break;
case E_USER_WARNING:
echo "my warning [$errno] $errstr":
break;
case E_USER_NOTICE:
echo "my notice[$errno] $errstr";
break;
default:
echo "unkonwn error type :[$errno] $errstr";
break;
}
}
set_erro_handler(dealErrorHandler);
trigger_error("notice", E_USER_NOTICE);
trigger_error("warning", E_USER_WARNING);
trigger_error("error", E_USER_ERROR);
13. 簡述兩種屏蔽php程序的notice警告的方法
初始化變量,文件開始設置錯誤級別或者修改php.ini 設置error_reporting
set_error_handler 和 @抑制錯誤
1.在程序中添加:error_reporting (E_ALL & ~E_NOTICE);
2.或者修改php.ini中的:error_reporting = E_ALL
改為:error_reporting = E_ALL & ~E_NOTICE
3.error_reporting(0);或者修改php.inidisplay_errors=Off
14. instanceof的作用, 經常在什么設計模式中使用
單例模式,但是其他的模式也會用到
15. 1023用二進制表示, 并簡述計算過程
10-2
1023%2=1
511%2 =1
255%2 =1
127%2 =1
63%2 =1
31%2 =1
15%2 =1
7%2 =1
3%2 =1
1%2 =1
0 =0
-------------------------------------------
1023
2^9=
511
k=9
10 9 8 7 6 5 4 3 2 1
1 1 1 1 1 1 1 1 1 1
----------------------
1023 1
1023-1/2=511 1
511-1/2=255 1
255-1/2=127 1
127-1/2=63 1
63-1/2=31 1
31-1/2=15 1
15-1/2=7 1
7-1/2=3 1
3-1/2=1 1
-----------------------------------------------
2-10
只需用將二進制數的各個位上的數從最右邊開始,最右邊的第一個數乘以二的零次方,第二個數乘以二的一次方,第三個數乘以二的二次方,依次類推可得第n個數乘以二的(n-1)次方,然后把得到的結果相加即可
例如:110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1*2^5=51
這也可以算是一個公式就是An*2^(n-1) An表示二進制數最右邊開始的第n個數,
將第一項第二項第三項一直到第n項用式子An*2^(n-1) 計算出來并加在一起即可
16. 下面php程序輸出的內容是什么? 為什么?
$str = "aa\tbb\tcc";
@list($a, $b, $c) = explode('\t', $str);
echo $a,$b,$c;
?>
aabbcc;//'\t'不會以\t切割字符串,explode之后申城一個array(0=>"aa\tbb\tcc")所以。。。,'\t'換成"\t"就被切割
17. include和require 分別返回什么錯誤級別
include會系統警告并繼續執行,require會發出系統警告但是會引致致命錯誤令腳本終止運行
18. 現有一個函數, 有不確定多少個的參數(可能有5個也可能有50個), 如何去定義這個函數
方法一: 不借助php內置函數
方法二: 提示func_num_args() func_get_arg() unc_get_args()
function param()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs
\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "
\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "
\n";
}
}
param(1,2,3,4,5);
/**
2 * 例子寫完后,本來認為完事了,結果遇到有人問call_user_func_array(),看了一下手冊
3 * 原來,我上面的那個test函數還可以精簡成如下的例子,
4 */
5 function otest1 ($a)
6 {
7 echo( '一個參數' );
8 }
9
10 function otest2 ( $a,$b)
11 {
12 echo( '二個參數' );
13 }
14
15 function otest3 ( $a,$b,$c)
16 {
17 echo( '三個啦' );
18 }
19
20 function otest ()
21 {
22 $args=func_get_args();
23 $num=func_num_args();
24 call_user_func_array( 'otest'.$num,$args );
25 }
26
27 otest(1,2);
【PHP大神分享面試技巧】相關文章:
初級PHP程序員面試經驗分享06-08
PHP小技巧07-12
PHP后門的隱藏技巧10-03
php取整方式分享07-20
java工程師面試技巧分享05-29
PHP延遲靜態綁定示例分享10-15
php防止SQL注入的方法分享09-29
PHP頁面跳轉實現技巧09-19
分享php過濾XSS攻擊的函數05-21
PHP開發CS結構的技巧08-27