我遇到過的面試題及答案(一)

来源:https://www.cnblogs.com/zydj333/archive/2018/01/24/PHP.html
-Advertisement-
Play Games

1、<?php echo count(strlen(“http://php.net”)); ?>的執行結果是? 答案:1 講解:count(var)是用來統計數組或對象的元素個數的。當var是null或者空數組時,結果為0。如果var是普通變數,則返回1。正常情況下返回var中的元素或屬性個數。 2 ...


 

1、<?php echo count(strlen(“http://php.net”)); ?>的執行結果是?

答案:1

講解:count(var)是用來統計數組或對象的元素個數的。當var是null或者空數組時,結果為0。如果var是普通變數,則返回1。正常情況下返回var中的元素或屬性個數。

 

2、請說明php.ini中的safe_mode開啟之後影響了哪些函數?

答案:Safe_mode是php的安全模式。開啟之後,主要會對系統操作、文件、許可權設置等方法產生影響,主要用來應對webshell。以下是受到影響的一些函數:ckdir,move_uploaded_file,chgrp,parse_ini_file,

chown,rmdir,copy,rename,fopen,require,highlight_file,show_source,include,symlink,link,touch,mkdir,unlink,exec,

shell_exec,pasathru,system,popen

需要註意的是:在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了。

 

3、php5中魔術方法有哪幾個?請舉例說明各自的用法。

  • __construct() :構造方法,當一個對象創建時調用此方法,使用此方法的好處是:可以使構造方法有一個獨一無二的名稱,無論它所在的類的名稱是什麼.這樣你在改變類的名稱時,就不需要改變構造方法的名稱
  • __destruct() :析構方法,PHP將在對象被銷毀前(即從記憶體中清除前)調用這個方法。預設情況下,PHP僅僅釋放對象屬性所占用的記憶體並銷毀對象相關的資源。
  1. 析構函數允許你在使用一個對象之後執行任意代碼來清除記憶體。
  2. 當PHP決定你的腳本不再與對象相關時,析構函數將被調用。
  3. 在一個函數的命名空間內,這會發生在函數return的時候。
  4. 對於全局變數,這發生於腳本結束的時候。
  5. 如果你想明確地銷毀一個對象,你可以給指向該對象的變數分配任何其它值。
  6. 通常將變數賦值勤為NULL或者調用unset
  • __call() :調用對象不存在得方法時執行此函數。包括沒有許可權訪問的方法
  • __get() :當調用一個未定義的屬性時訪問此方法
  • __set( $property, $value ) :給一個未定義的屬性賦值時調用
  • __isset() : 當在一個未定義的屬性上調用isset()函數時調用此方法
  • __unset() :當在一個未定義的屬性上調用unset()函數時調用此方法
  • __toString() :toString方法在將一個對象轉化成字元串時自動調用,比如使用echo列印對象時
      如果類沒有實現此方法,則無法通過echo列印對象,否則會顯示:Catchable fatal error: Object of class test could not be converted to string in
      此方法必須返回一個字元串
  • __clone() :克隆對象時執行此函數。PHP5中的對象賦值是使用的引用賦值,如果想複製一個對象則需要使用clone方法,在調用此方法是對象會自動調用__clone魔術方法。如果在對象複製需要執行某些初始化操作,可以在__clone方法實現
  • __autoload() :它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。

註意: 在 __autoload 函數中拋出的異常不能被 catch 語句塊捕獲並導致致命錯誤。

  • __sleep() :serialize之前被調用,可以指定要序列化的對象屬性。
  • __wakeup :unserialize之前被調用,可以執行對象的初始化工作。
  • __set_state() :調用var_export時,被調用。用__set_state的返回值做為var_export的返回值(自PHP 5.1.0起有效)。
  • __invoke() :將對象當作函數來使用時執行此方法,通常不推薦這樣做。
  • __callStatic它的工作方式類似於 __call() 魔術方法,__callStatic() 是為了處理靜態方法調用
  1. PHP5.3.0以上版本有效。
  2. 它必須是公共的,並且必須被聲明為靜態的。
  3. 同樣,__call() 魔術方法必須被定義為公共的,所有其他魔術方法都必須如此。

 

4、說幾個常用的超全局變數。

  • $_GET ----->get傳送方式

  • $_POST ----->post傳送方式

  • $_REQUEST ----->可以接收到get和post兩種方式的值

  • $GLOBALS ----->所有的變數都放在裡面

  • $_FILES ----->上傳文件使用

  • $_SERVER ----->系統環境變數

  • $_SESSION ----->會話控制的時候會用到

  • $_COOKIE ----->會話控制的時候會用到

 

5、說幾個你知道的設計模式。

  • 單例模式: 保證一個類僅有一個實例,並提供一個訪問他的全局訪問點例如框架中的資料庫連接

  • 策略模式: 針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,例如進入個人主頁時,根據瀏覽者的不同,給予不同的顯示與操作。

  • 註冊模式: 提供了在程式中有條理的存放並管理一組全局對象 (object),例如ZF框架中的Zend_Registry::set。

  • 適配器模式: 將不同介面適配成統一的API介面,例如數據操作有mysql、mysqli、pdo等,可利用適配器模式統一介面

  • 觀察者模式: 一個對象通過添加一個方法使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。例如實現實現消息推送

  • 裝飾器模式: 不修改原類代碼和繼承的情況下動態擴展類的功能,例如框架的每個Controller文件會提供before和after方法

  • 迭代器模式: 提供一個方法順序訪問一個聚合對象中各個元素,在PHP中將繼承 Iterator 類

 

6、請寫一個函數驗證電子郵件的格式是否正確。

<?php
    $str = "[email protected]";
    regex="([a−z0−9\.−]+)@([\da−z\.−]+)\.([a−z\.]2,6)" ; //正則
    return preg_match(regex,str);
?>

 

7、isset、empty、is_null的區別。

  • isset 判斷變數是否定義或者是否為空 
  1. 變數存在返回ture,否則返回false
  2. 變數定義不賦值返回false   unset一個變數,返回false
  3. 變數賦值為null,返回false    
  • empty:判斷變數的值是否為空,能轉換為false的都是空,為空返回true,反之返回false。 
  1. "",0,"0",NULL,FALSE都認為為空,返回true
  2. 沒有任何屬性的對象都認為是空,返回true
  • is_null:檢測傳入的值(值、變數、表達式)是否為null 
  1. 定義了,但是賦值為Null,返回true
  2. 定義了,但是沒有賦值,返回reue
  3. 被unset一個變數,返回true

8、 對於關係型資料庫而言,索引是相當重要的概念,請回答有關索引的幾個問題:

a)、索引的目的是什麼?
  1. 快速訪問數據表中的特定信息,提高檢索速度

  2. 創建唯一性索引,保證資料庫表中每一行數據的唯一性。

  3. 加速表和表之間的連接

  4. 使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間

b)、索引對資料庫系統的負面影響是什麼?

負面影響:
創建索引和維護索引需要耗費時間,這個時間隨著數據量的增加而增加;索引需要占用物理空間,不光是表需要占用數據空間,每個索引也需要占用物理空間;當對錶進行增、刪、改、的時候索引也要動態維護,這樣就降低了數據的維護速度。

c)、為數據表建立索引的原則有哪些?
  1. 在最頻繁使用的、用以縮小查詢範圍的欄位上建立索引。

  2. 在頻繁使用的、需要排序的欄位上建立索引

d)、 什麼情況下不宜建立索引?
  1. 對於查詢中很少涉及的列或者重覆值比較多的列,不宜建立索引。
  2. 對於一些特殊的數據類型,不宜建立索引,比如文本欄位(text)等。

 

9、PHP網站的主要攻擊方式有哪些?

  1. 命令註入(Command Injection)
  2. eval 註入(Eval Injection)
  3. 客戶端腳本攻擊(Script Insertion)
  4. 跨網站腳本攻擊(Cross Site Scripting, XSS)
  5. SQL 註入攻擊(SQL injection)
  6. 跨網站請求偽造攻擊(Cross Site Request Forgeries, CSRF)
  7. Session 會話劫持(Session Hijacking)
  8. Session 固定攻擊(Session Fixation)
  9. HTTP 響應拆分攻擊(HTTP Response Splitting)
  10. 文件上傳漏洞(File Upload Attack)
  11. 目錄穿越漏洞(Directory Traversal)
  12. 遠程文件包含攻擊(Remote Inclusion)
  13. 動態函數註入攻擊(Dynamic Variable Evaluation)
  14. URL 攻擊(URL attack)
  15. 表單提交欺騙攻擊(Spoofed Form Submissions)
  16. HTTP 請求欺騙攻擊(Spoofed HTTP Requests)

10、以下語句返回的結果中name列也許會出現 null 的情況,那麼在name欄位上使用什麼函數可以將出現的 null 改為一個預設值。

SELECT a.id,b.name FROM tab1 AS a LEFT JOIN tab2 AS b ON(a.id = p.id) WHERE a.id > 10;

 答: 

SELECT a.id,IFNULL(b.name,'未定義') FROM tab1 AS a LEFT JOIN tab2 AS b ON(a.id = p.id) WHERE a.id > 10;

來看官方手冊的解釋:IFNULL(expr1,expr2) 。如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數字或字元串值,取決於它被使用的上下文環境。

不過經我測試,是有問題的,當 expr1=0而不是null時。他也返回了expr2;官方手冊應改為當expr1為null或者0時,返回expr2。

 

 

好了,第一期先更新這十個吧,願盡綿薄之力,幫助小伙伴們找到心儀的工作。敬請關註“我遇到過的面試題及答案(二)”。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 和 Java的好像有蠻多不同,讓我感覺有點怪,可以確定的是上面的,不能實現單例模式,後面補上補:查了一下,發現好像不對,感覺有問題。找到的python2.*的單例不是這樣的 python2.*類型改,但是會報錯,這個錯誤我就不分析了,複雜 可能用最上面的就好了,我找時間去看一下其他的教程是怎麼樣的。 ...
  • 1.迭代器(Iterator): 可以被next()函數調用並不斷返回下一個值的對象,成為迭代器:Iterator 可以直接用於for 迴圈的對象統稱為可迭代對象:Iterable 迭代,顧名思義就是重覆做一些事很多次(就現在迴圈中做的那樣)。迭代器是實現了__next__()方法的對象(這個方法在 ...
  • Python安裝完成之後,運行cmd(win+R): 在控制臺中輸入Python,若安裝完成,會在控制臺中打開Python: 如果Python未添加至環境變數,則會提示"python不是內部或外部命令,也不是可運行的程式或批處理文件",這種時候就需要將Python添加至環境變數。 1、系統設置添加。 ...
  • 按照【Crossin的編程教室】下好了相關軟體。 1、直接print,出現下麵紅色提示錯誤。(英文渣渣,看不懂,英語也要補) 還有本來打算計算1+2的,結果直接輸出1+2。 解決,去掉單引號,print空格1+2 最後的print,各種都有。話說才第一次嘗試,就有兩個問題了。道路阻且長。總之先按Cr ...
  • 功能簡介:包含上一頁、下一頁、首頁、尾頁、跳轉頁面等功能。 編碼寄語:化繁為簡,則豁然開朗。 運行截圖: 關鍵步驟: $page_banner = "<a href='".$_SERVER['PHP_SELF']."?p=" .($page-1) . "'><上一頁</a>"; $page_bann ...
  • 解決方法: Tomcat,將項目添加到裡面 部署解包的webapp目錄 將Web項目部署到Tomcat中的方法之一,是部署沒有封裝到WAR文件中的Web項目。要使用這一方法部署未打包的webapp目錄,只要把我們的項目(編譯好的發佈項目,非開發項目)放到Tomcat的webapps目錄下就可以了。如 ...
  • package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如果一串字元如"aaaabbc中國1512"要分別統計英文字元的數量,中文字元的數量,和數字字元的數量... ...
  • http://blog.csdn.net/u011475134/article/details/70198533 原出處 在上一篇文章《使用python-aiohttp爬取網易雲音樂》中,我們給自己的微信公眾號添加了線上點歌的功能,這次我們再增加一個新聞瀏覽的功能。由於我平時瀏覽新聞用的是今日頭條, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...