PHP面試10佳題

PHP面試10佳題

金三銀四,金九銀十,都是每年離職跳槽的旺季;

錢給夠了嗎?心委屈了嗎?

裸辭一時爽,待業人會慌。

看準機會,說出手時就出手,風風火火高薪走。

以下是朋友面試收集的一些面試題,希望對大夥有幫助。(公眾號:倒影Amoy,持續更新ing)

  1. 經典面試50題:

(此題網上搜下,最好多親手測試寫過一遍sql)

2. tp5的生命週期:

 2.1.入口文件:定義應用目錄,加載引導文件
 2.2.引導文件,進行一些常量的加載,機制的註冊;加載系統常量定義、環境變量定義、註冊自動加載機制、註冊錯誤和異常處理機制;執行應用
 2.3.應用類進行一些初始化;加載應用配置、別名定義、行為定義、註冊命名空間、加載擴展配置文件、設置默認時區、系統語言包
 2.4.URL檢測;獲取到請求地址信息,請求必須為PATHINFO格式,否則為非法
 2.5.路由檢測;如果開啟路由檢測,優先將URL與路由進行匹配,匹配成功走調度
 2.6.請求分發;最重要的環節,URL根據不同的調度找到控制器,經過一系列的代碼後,得到結果
 2.7.響應輸出;return後,就會有response類將結果輸出到客戶端
 2.8.程序結束;
 2.9.日誌一般在生命週期完成的時候寫入;
 

3. 去除下劃線 首字母大寫 (實現字符串中"open_door"轉換成"OpenDoor")

ucwords(string) //每個單詞首字母大寫
ucfirst(string) //字符串第一個字母大寫
strtolower(string) //字符串轉換成小寫
strtoupper(string) //字符串轉換成大寫
 //方法一
function change($str) {
 $arr = explode('_',$str);
 foreach($arr as $key=>$val) {
 $newStar = strtoupper(substr($val,0,1));
 $other = substr($val,1);
 $tarr[] = $newStar.$other;
 }
 return implode("",$tarr);
}
//方法二比較簡單
function change2($str) {
 $arr = explode('_',$str);
 foreach($arr as $key=>$val) {
 $tmp = ucfirst($val);
 $tarr[] = $tmp;
 }
 return implode("",$tarr);
}

4. 傳遞賦值和引用賦值

4.1傳遞賦值

1 $a = 1;
2 $b = 2;
3 $a = $b;
4 echo $a,$b; //結果為:2 2

4.2引用賦值

$a = 1;
$b = 2;
$a = &$b; //將$b的地址賦予$a,指向同一塊內存地址,則$a與$b的值相等了
$b = 3;
echo $a,$b; //結果為:3 3
unset($b);
echo $a; //結果為:3 
// 變量機制:假如多個變量指向同一地址,取消一個變量,其他變量不受影響 ;
//unset並沒有真正銷燬變量的作用...僅僅是切斷了變量與內存之間的關係,內存只要還被引用著就不會被釋放; $b和$a同時指向3,切斷其中$b的關係,$a還是指向3,
// 假如將所有指向該地址的變量都取消了,則變量的結果為 null

4.3 在PHP中對象的傳值默認是引用傳值

 class Demo
{
 public $demo = "aaaa";
}
$demo1 = new Demo();
$demo2 = $demo1;
echo $demo2->demo . "
"; $demo1->demo = "bbbb"; echo $demo2->demo . "
"; //運行結果為 aaaa bbbb

5. 什麼是析構函數,而PHP中對象銷燬的方式有哪些

對象的銷燬

1.顯試銷燬: 當對象沒有被引用時就會被銷燬,所以我們可以unset或為其賦值NULL;

2.隱試銷燬:PHP是腳本語言,在代碼執行完最後一行時,所有申請的內存都要釋放掉;

 class King 
 { 
 public $name = '老王'; 
 public $gender = null; 
 public function __destruct() { 
 echo '沒了'; 
 } 
 } 
 $a = new Human(); 
 $b = $c = $d = $a;
 unset($a); 
 //析構函數究竟是觸發了幾次,是在線上觸發,還是在線下觸發????
 ## $b = $c = $d = $a;默認引用傳值,四個變量指向同一處內存,
 ## unset的時候對象還是被還是其它三個變量使用,
 ## 所以對象並沒有被銷燬,所以析構函數是在線下觸發的(代碼執行完了,內存自動釋放)
 class King 
 { 
 public $name = '老王'; 
 public $gender = null; 
 public function __destruct() { 
 echo '沒了'; 
 } 
 } 
 $a = $b = $c = new Human(); 
 unset($a); 
 unset($b); 
 unset($c); 
 //析構函數究竟是觸發了幾次,是在線上觸發,還是在線下觸發????
 ## 三個變量指向同一處內存,
 ## 線上觸發;在代碼運行完自動釋放內存之前由於對象已經沒有被任何變量引用所以就自動釋放了內存....

6. $兩個美元符號賦值

 $a = 'hello';
 $a = 'world';
 echo "$a ${$a}";
 //結果為hello world
 #第二行可譯為:$hello = “world”
 #第三行:$a $hello

7.https協議的原理:趣解HTTPS

8.表達式答題:

 1.問:a大於b成立時:如果a小於c,那麼x=c-a否則x=a-c;否則a小於b成立時:如果b小於c,那麼x=c-b否則x=b-c:
 答:
 $a>$b ? $x=($ab then a else b end ),(case when b>c then b esle c end) from table_name
 

9. 單引號和雙引號的差別

 $foo = 2; 
 echo "foo is $foo"; // 打印結果: foo is 2 
 echo 'foo is $foo'; // 打印結果: foo is $foo 
 echo "foo is $foo\n"; // 打印結果: foo is 2 (同時換行) 
 echo 'foo is $foo\n'; // 打印結果: foo is $foo\n  

10. intval(0.58*100)輸出 57

 intval(0.68*100)輸出 68 
 intval(0.56*100)輸出 56
 intval(0.57*100)輸出 56
 intval(0.58*100)輸出 57
 intval(0.59*100)輸出 59
 // 為什麼只是0.57*100和0.58*100會特殊呢?
 ## 簡要說來就是:主要是因為 intval 函數的規則是,從第一個數字開始,知道遇到不是數字的字符,結束。
 ## 看似有窮的小數, 在計算機的二進制表示裡卻是無窮的
 # 問:要把小數裝入計算機,總共分幾步?
 1.轉換成二進制 (有可能 丟失精度)
 2.用二進制科學計算法表示
 3.表示成 IEEE 754 形式 (有可能 丟失精度)
 浮點數的表示(IEEE 754):
 浮點數, 以64位的長度(雙精度)為例, 會採用1位符號位(E), 11指數位(Q), 52位尾數(M)表示(一共64位).
 符號位:最高位表示數據的正負,0表示正數,1表示負數。
 指數位:表示數據以2為底的冪,指數採用偏移碼錶示
 尾數:表示數據小數點後的有效數字.
 0.58 對於二進制表示來說, 是無限長的值(下面的數字省掉了隱含的1)..
 0.58的二進制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
 0.57的二進制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101
 而兩者的二進制, 如果只是通過這52位計算的話,分別是
 0.58 -> 0.57999999999999996
 0.57 -> 0.56999999999999995
 浮點數的四捨五入和咱們普通的數學裡面的也是不同的,浮點數遇到 5 後,不一定總是入,有時也舍


分享到:


相關文章: