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僅僅釋放對象屬性所占用的記憶體並銷毀對象相關的資源。
- 析構函數允許你在使用一個對象之後執行任意代碼來清除記憶體。
- 當PHP決定你的腳本不再與對象相關時,析構函數將被調用。
- 在一個函數的命名空間內,這會發生在函數return的時候。
- 對於全局變數,這發生於腳本結束的時候。
- 如果你想明確地銷毀一個對象,你可以給指向該對象的變數分配任何其它值。
- 通常將變數賦值勤為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() 是為了處理靜態方法調用
- PHP5.3.0以上版本有效。
- 它必須是公共的,並且必須被聲明為靜態的。
- 同樣,__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 判斷變數是否定義或者是否為空
- 變數存在返回ture,否則返回false
- 變數定義不賦值返回false unset一個變數,返回false
- 變數賦值為null,返回false
- empty:判斷變數的值是否為空,能轉換為false的都是空,為空返回true,反之返回false。
- "",0,"0",NULL,FALSE都認為為空,返回true
- 沒有任何屬性的對象都認為是空,返回true
- is_null:檢測傳入的值(值、變數、表達式)是否為null
- 定義了,但是賦值為Null,返回true
- 定義了,但是沒有賦值,返回reue
- 被unset一個變數,返回true
8、 對於關係型資料庫而言,索引是相當重要的概念,請回答有關索引的幾個問題:
a)、索引的目的是什麼?
-
快速訪問數據表中的特定信息,提高檢索速度
-
創建唯一性索引,保證資料庫表中每一行數據的唯一性。
-
加速表和表之間的連接
-
使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
b)、索引對資料庫系統的負面影響是什麼?
負面影響:
創建索引和維護索引需要耗費時間,這個時間隨著數據量的增加而增加;索引需要占用物理空間,不光是表需要占用數據空間,每個索引也需要占用物理空間;當對錶進行增、刪、改、的時候索引也要動態維護,這樣就降低了數據的維護速度。
c)、為數據表建立索引的原則有哪些?
-
在最頻繁使用的、用以縮小查詢範圍的欄位上建立索引。
-
在頻繁使用的、需要排序的欄位上建立索引
d)、 什麼情況下不宜建立索引?
- 對於查詢中很少涉及的列或者重覆值比較多的列,不宜建立索引。
- 對於一些特殊的數據類型,不宜建立索引,比如文本欄位(text)等。
9、PHP網站的主要攻擊方式有哪些?
- 命令註入(Command Injection)
- eval 註入(Eval Injection)
- 客戶端腳本攻擊(Script Insertion)
- 跨網站腳本攻擊(Cross Site Scripting, XSS)
- SQL 註入攻擊(SQL injection)
- 跨網站請求偽造攻擊(Cross Site Request Forgeries, CSRF)
- Session 會話劫持(Session Hijacking)
- Session 固定攻擊(Session Fixation)
- HTTP 響應拆分攻擊(HTTP Response Splitting)
- 文件上傳漏洞(File Upload Attack)
- 目錄穿越漏洞(Directory Traversal)
- 遠程文件包含攻擊(Remote Inclusion)
- 動態函數註入攻擊(Dynamic Variable Evaluation)
- URL 攻擊(URL attack)
- 表單提交欺騙攻擊(Spoofed Form Submissions)
- 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。
好了,第一期先更新這十個吧,願盡綿薄之力,幫助小伙伴們找到心儀的工作。敬請關註“我遇到過的面試題及答案(二)”。