PHP最新面試題2019


 

1、字符串"0"在PHP和js中轉換為布爾值是false還是true

php:false;  php 弱語言 '0'和0一樣;

js:true;字符串除了空字符串('')其他都是true(包括' '這種中間有空格的);

2、echo, print, print_r, var_dump 區別

echo 語言結構,並不是真正的函數,可以一次輸出多個值,多個值之間用逗號分隔。

print 是函數,只能輸出一個值。

print_r 能打印數組,對象。

var_dump 能打印數組,對象,並且帶數據類型。

3、程序 $a = "www"; settype($a, 'array'); (string)$a; floatval($a); echo gettype($a); 運行后輸出結果:

array  原因:settype會改變原值的數據類型,string,floatval屬於強制轉換,不改變原值的數據類型。

4、用PHP實現冒泡排序算法。

// 控制輪次數
for ($i = 1; $i < count($arr); $i++) {
    //控制次數,並判斷大小交換位置
    for ($j = 0; $j < count($arr) - $i; $j++) {
        //如果當前值大於后面的值
        if ($arr[$j] > $arr[$j + 1]) {
            // 交換
            $temp = $arr[$j];
            $arr[$j] = $arr[$j + 1];
            $arr[$j + 1] = $temp;
        }
    }
}

5、一 群猴子排成一圈,按1,2,…,n依次編號。然后從第1只開始數,數到第m只,把它踢出圈,從它后面再開始數,再數到第m只,在把它踢出去…,如此不停的 進行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個大王的編號。

// $n猴子個數 $m第幾個位置
function fn($n, $m)
{
    //將猴子數量放到數組內
    for ($i = 1; $i < $n + 1; $i++) {
        $arr[] = $i;
    }
    $i = 0;
    //當數組內只剩下一個值跳出數組
    while (count($arr) > 1) {
        //遍歷數組,判斷當前猴子是否為出局序號,如果是則出局,否則放到數組最后
        if (($i + 1) % $m == 0) {
            //當循環次數滿足m值 去除掉當前值
            unset($arr[$i]);
        } else {
            //不滿足循環次數 放到數組對尾
            array_push($arr, $arr[$i]);
            //刪除掉當前循環內容
            unset($arr[$i]);
        }
        $i++;
    }
    return $arr;
}
// 調用
var_dump(fn(15,7));

6、分表,分區,分庫,難點是什么?怎么均勻存儲數據?

分表:即把一個很大的表的數據分到幾個表中。

分表又分為垂直拆分和水平拆分。

垂直拆分:把字段拆分;可以把不常用的字段放一張表,把大字段放一張表,把常用的字段放一張表。

水平拆分:把表數據拆分;可以通過id取模的方式拆分數據,比如要拆分成100張表,user0,user1,user2......,id%100得到的余數即存儲到哪張表。

分表難點:按什么策略來分表;分表后該怎么查詢數據(什么情況下該訪問哪張表)。

 

分區:所有的數據還在一個表中,但物理存儲數據根據一定的規則存放在不同的文件中,文件也可以放到不同的磁盤上。分區的類型:range分區,list分區,hash分區和key分區。

常見分區方式:

1、根據時間間隔分區,比如以年為單位,分區存儲數據。

2、根據自增的主鍵id,hash(id div 10000000) 表示100萬數據建立一個分區。

 

分庫:把數據分幾個庫存儲。分為垂直分庫和水平分庫。

垂直分庫:根據表來分數據庫,同一類型的表一個數據庫;比如博客一個數據庫,論壇一個數據庫。

水平分庫:根據某些規則,將同一個表的數據分布在不同的庫上;比如根據用戶id把用戶的博客文章分布在5個數據庫上。

7、PHP中單引號和雙引號的區別。

在一般情況下,單引號和雙引號是可以互通的,但雙引號內部變量會解析,而單引號內部變量不解析

8、require()和include()的區別。

都是引入別的頁面;

require()出現錯誤,會終止程序;而include()則會繼續執行,並會顯示一個錯誤警告;

在實際項目中,一般使用require_one()更好。

9、PHP中超全局變量,魔術變量,魔術方法:

超全局變量(9個):

參考:https://www.php.net/manual/zh/language.variables.superglobals.php

$GLOBALS

$_SERVER

$_REQUEST

$_POST

$_GET

$_FILES

$_ENV

$_COOKIE

$_SESSION

魔術變量(8個):

__LINE__    文件中的當前行號。

__FILE__    文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。

__DIR__     文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。

__FUNCTION__    返回該函數被定義時的名字(區分大小寫)

__CLASS__    返回該類被定義時的名字(區分大小寫)。

__TRAIT__    Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 實現了代碼復用的一個方法,稱為 traits。

__METHOD__     返回該方法被定義時的名字(區分大小寫)。

__NAMESPACE__    當前命名空間的名稱(區分大小寫)。

魔術方法:

參考:https://www.php.net/manual/zh/language.oop5.magic.php

10、棧和隊列

棧:是允許在同一端進行插入和刪除的特殊線性表。

棧也稱為先進后出表。

注:線性表是最基本,最簡單,也是最常用的一種數據結構。線性表中數據元素之間的關系是一對一的關系。

隊列:是一種特殊的線性表。特殊之處在於只允許在前端進行刪除操作,在表的后端進行插入操作。

隊列也稱為先進先出表。

11、對稱加密和非對稱加密

對稱加密指的就是加密和解密使用同一個秘鑰,所以叫做對稱加密。對稱加密只有一個秘鑰,作為私鑰。 

常見的對稱加密算法:DES,AES,3DES等等。

非對稱加密指的是:加密和解密使用不同的秘鑰,一把作為公開的公鑰,另一把作為私鑰。公鑰加密的信息,只有私鑰才能解密。私鑰加密的信息,只有公鑰才能解密。 

常見的非對稱加密算法:RSA,ECC(移動設備用),DSA(數字簽名用)

12、時間復雜度和空間復雜度

算法復雜度分為時間復雜度和空間復雜度。

其作用:時間復雜度是指執行算法所需要的計算工作量;而空間復雜度是指執行這個算法所需要的內存空間。

13、抽象類和接口的區別

參考:https://blog.csdn.net/sunlylorn/article/details/6124319

14、PHP創建多級目錄

function makedir($path)
{
    if (is_dir($path)){
        echo "目錄已存在";
    }else {
        $res = mkdir($path, 0777, true);
        if ($res) {
            echo "創建成功";
        } else {
            echo "創建失敗";
        }
    }
}

15、PHP寫一段代碼,確保多個進程同時寫入一個文件成功

function writeData($filepath, $data)
{
    $fp = fopen($filepath, 'a');  //以追加的方式打開文件,返回的是指針
    do {
        usleep(100);    //暫停執行程序,參數是以微秒為單位的
    } while (!flock($fp, LOCK_EX));  //LOCK_EX 取得獨占鎖定(寫入的程序)進行排它型鎖定 獲取鎖 有鎖就寫入,沒鎖就得
    $res = fwrite($fp, $data . "\n");  // 以追加的方式寫入數據到打開的文件
    flock($fp, LOCK_UN);    //LOCK_UN 釋放鎖定(無論共享或獨占)。
    fclose($fp);  //關閉打開的文件指針
    return $res;
}

16、PHP的is_writeable()函數存在Bug,無法准確判斷一個目錄/文件是否可寫,請寫一個函數來判斷目錄/文件是否絕對可寫。

下面是CodeIgniter 中的is_really_writable函數解決方案,詳見函數注釋

其中bug存在兩個方面,

1、在windowns中,當文件只有只讀屬性時,is_writeable()函數才返回false,當返回true時,該文件不一定是可寫的。

如果是目錄,在目錄中新建文件並通過打開文件來判斷;

如果是文件,可以通過打開文件(fopen),來測試文件是否可寫。

2、在Unix中,當php配置文件中開啟safe_mode時(safe_mode=on),is_writeable()同樣不可用。

讀取配置文件是否safe_mode是否開啟。

/**
 * Tests for file writability
 *
 * is_writable() returns TRUE on Windows servers when you really can't write to
 * the file, based on the read-only attribute. is_writable() is also unreliable
 * on Unix servers if safe_mode is on.
 *
 * @access private
 * @return void
 */
if ( ! function_exists('is_really_writable')) {
    function is_really_writable($file)
    {
        // If we're on a Unix server with safe_mode off we call is_writable
        if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) {
            return is_writable($file);
        }
 
        // For windows servers and safe_mode "on" installations we'll actually
        // write a file then read it. Bah...
        if (is_dir($file)) {
            $file = rtrim($file, '/') . '/' . md5(mt_rand(1, 100) . mt_rand(1, 100));
 
            if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
                return FALSE;
            }
 
            fclose($fp);
            @chmod($file, DIR_WRITE_MODE);
            @unlink($file);
            return TRUE;
        } elseif (!is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
            return FALSE;
        }
 
        fclose($fp);
        return TRUE;
    }
}

17、php中去除一個字符串中非字母部分

preg_replace('/[^a-z]/i', '', $str);

18、將一個字符串去除字符串中非字母部分,並將字符串中’_‘號后面首字母和字符串首字母大寫,如a2b_ab23c得到AbAbc。

function getStr($str)
{
    // [^a-z]用來匹配任何不在a和z之間的字符,i表示不區分大小寫。
    $str = preg_replace('/[^a-z_]/i', '', $str);
    $arr = explode('_', $str);
    foreach($arr as $key=>$value){
        // ucfirst()首字母大寫
        $arr[$key] = ucfirst($value);
    }
    $str = implode('', $arr);
    echo $str;
}
getStr('a2b_ab23c');

19、使用js實現進入一個頁面10s后彈出提示框,提示框內容為‘hello world’。

setTimeout("alert('hello world')", 10000)

20、寫一個sql語句查詢表A中user_name字段重復出現兩次以上的所有數據。

SELECT user_name, COUNT(user_name) AS num 
        FROM A GROUP BY user_name HAVING num >=2;

注意

  • having只能用在group by之后,對分組后的結果進行篩選(即使用having的前提條件是分組)。
  • where肯定在group by 之前。
  • where后的條件表達式里不允許使用聚合函數,而having可以。

21、redis內存滿了之后怎么處理的

參考博客:https://blog.csdn.net/qq_28018283/article/details/80764518

如果達到設置的上限,Redis的寫命令會返回錯誤信息(但是讀命令還可以正常返回。)或者你可以將Redis當緩存來使用配置淘汰機制,當Redis達到內存上限時會沖刷掉舊的內容。有5中內存淘汰機制,具體看參考博客。

22、PHP互換兩個變量值的方法(不用第三變量)

function exchange()
{
    /**
     * 雙方變量為字符串或者數字時,可用此交換方法
     * 使用異或運算
     */
    $a = "This is A"; // a變量原始值
    $b = "This is B"; // b變量原始值
    echo '交換之前 $a 的值:' . $a . ', $b 的值:' . $b, '<br>'; // 輸出原始值
    /**
     * 原始二進制:
     * $a:010101000110100001101001011100110010000001101001011100110010000001000001
     * $b:010101000110100001101001011100110010000001101001011100110010000001000010
     *
     * 下面主要使用按位異或交換,具體請參照下列給出的二進制過程,
     */
    $a = $a ^ $b; // 此刻$a:000000000000000000000000000000000000000000000000000000000000000000000011
    $b = $b ^ $a; // 此刻$b:010101000110100001101001011100110010000001101001011100110010000001000001
    $a = $a ^ $b; // 此刻$a:010101000110100001101001011100110010000001101001011100110010000001000010
    echo '交換之后 $a 的值:' . $a . ', $b 的值:' . $b, '<br>'; // 輸出結果值
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM