1
請輸出下面代碼執(zhí)行結(jié)果
<?php
echo count(strlen("http://php.net"));
?>
答案:1
復(fù)制
講解:count(var)是用來統(tǒng)計數(shù)組或?qū)ο蟮脑貍€數(shù)的。當(dāng)var是null或者空數(shù)組時,結(jié)果為0。如果var是普通變量,則返回1。正常情況下返回var中的元素或?qū)傩詡€數(shù)。
2
請說明php.ini中的safe_mode開啟之后影響了哪些函數(shù)
答案:Safe_mode是php的安全模式。開啟之后,主要會對系統(tǒng)操作、文件、權(quán)限設(shè)置等方法產(chǎn)生 影響,主要用來應(yīng)對webshell。以下是受到影響的一些函數(shù):
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
復(fù)制
需要注意的是:在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了。
3
php5中魔術(shù)方法有哪幾個?請舉例說明各自的用法
- __construct() :構(gòu)造方法,當(dāng)一個對象創(chuàng)建時調(diào)用此方法,使用此方法的好處是:可以使構(gòu)造方法有一個獨一無二的名稱,無論它所在的類的名稱是什么.這樣你在改變類的名稱時,就不需要改變構(gòu)造方法的名稱
- __destruct() :析構(gòu)方法,PHP將在對象被銷毀前(即從內(nèi)存中清除前)調(diào)用這個方法。默認(rèn)情況下,PHP僅僅釋放對象屬性所占用的內(nèi)存并銷毀對象相關(guān)的資源。
- 析構(gòu)函數(shù)允許你在使用一個對象之后執(zhí)行任意代碼來清除內(nèi)存。
- 當(dāng)PHP決定你的腳本不再與對象相關(guān)時,析構(gòu)函數(shù)將被調(diào)用。
- 在一個函數(shù)的命名空間內(nèi),這會發(fā)生在函數(shù)return的時候。
- 對于全局變量,這發(fā)生于腳本結(jié)束的時候。
- 如果你想明確地銷毀一個對象,你可以給指向該對象的變量分配任何其它值。
- 通常將變量賦值勤為NULL或者調(diào)用unset
- __call() :調(diào)用對象不存在得方法時執(zhí)行此函數(shù)。包括沒有權(quán)限訪問的方法
- __get() :當(dāng)調(diào)用一個未定義的屬性時訪問此方法
- __set( property,value ) :給一個未定義的屬性賦值時調(diào)用
- __isset() : 當(dāng)在一個未定義的屬性上調(diào)用isset()函數(shù)時調(diào)用此方法
- __unset() :當(dāng)在一個未定義的屬性上調(diào)用unset()函數(shù)時調(diào)用此方法
- __toString() :toString方法在將一個對象轉(zhuǎn)化成字符串時自動調(diào)用,比如使用echo打印對象時 如果類沒有實現(xiàn)此方法,則無法通過echo打印對象,否則會顯示:Catchable fatal error: Object of class test could not be converted to string in 此方法必須返回一個字符串
- __clone() :克隆對象時執(zhí)行此函數(shù)。PHP5中的對象賦值是使用的引用賦值,如果想復(fù)制一個對象則需要使用clone方法,在調(diào)用此方法是對象會自動調(diào)用__clone魔術(shù)方法。如果在對象復(fù)制需要執(zhí)行某些初始化操作,可以在__clone方法實現(xiàn)
- __autoload() :它會在試圖使用尚未被定義的類時自動調(diào)用。通過調(diào)用此函數(shù),腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。 注意: 在 __autoload 函數(shù)中拋出的異常不能被 catch 語句塊捕獲并導(dǎo)致致命錯誤。
- __sleep() :serialize之前被調(diào)用,可以指定要序列化的對象屬性。
- __wakeup :unserialize之前被調(diào)用,可以執(zhí)行對象的初始化工作。
- __set_state() :調(diào)用var_export時,被調(diào)用。用__set_state的返回值做為var_export的返回值(自PHP 5.1.0起有效)。
- __invoke() :將對象當(dāng)作函數(shù)來使用時執(zhí)行此方法,通常不推薦這樣做。
- __callStatic它的工作方式類似于 __call() 魔術(shù)方法,__callStatic() 是為了處理靜態(tài)方法調(diào)用
- PHP5.3.0以上版本有效。
- 它必須是公共的,并且必須被聲明為靜態(tài)的。
- 同樣,__call() 魔術(shù)方法必須被定義為公共的,所有其他魔術(shù)方法都必須如此。
4
說幾個常用的超全局變量
- $_GET ----->get傳送方式
- $_POST ----->post傳送方式
- $_REQUEST ----->可以接收到get和post兩種方式的值
- $GLOBALS ----->所有的變量都放在里面
- $_FILES ----->上傳文件使用
- $_SERVER ----->系統(tǒng)環(huán)境變量
- $_SESSION ----->會話控制的時候會用到
- $_COOKIE ----->會話控制的時候會用到
5
說幾個你知道的設(shè)計模式
- 單例模式: 保證一個類僅有一個實例,并提供一個訪問他的全局訪問點例如框架中的數(shù)據(jù)庫連接
- 策略模式: 針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,例如進入個人主頁時,根據(jù)瀏覽者的不同,給予不同的顯示與操作。
- 注冊模式: 提供了在程序中有條理的存放并管理一組全局對象 (object),例如ZF框架中的Zend_Registry::set。
- 適配器模式: 將不同接口適配成統(tǒng)一的API接口,例如數(shù)據(jù)操作有mysql、mysqli、pdo等,可利用適配器模式統(tǒng)一接口
- 觀察者模式: 一個對象通過添加一個方法使本身變得可觀察。當(dāng)可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。例如實現(xiàn)實現(xiàn)消息推送
- 裝飾器模式: 不修改原類代碼和繼承的情況下動態(tài)擴展類的功能,例如框架的每個Controller文件會提供before和after方法
- 迭代器模式: 提供一個方法順序訪問一個聚合對象中各個元素,在PHP中將繼承 Iterator 類
6
請寫一個函數(shù)驗證電子郵件的格式是否正確
<?php
$str = "jianfeng@126.com";
regex="([a?z0?9\.?]+)@([\da?z\.?]+)\.([a?z\.]2,6)" ; //正則
return preg_match(regex,str);
?>
復(fù)制
7
isset、empty、is_null的區(qū)別
- isset 判斷變量是否定義或者是否為空
- 變量存在返回ture,否則返回false
- 變量定義不賦值返回false unset一個變量,返回false
- 變量賦值為null,返回false
- empty:判斷變量的值是否為空,能轉(zhuǎn)換為false的都是空,為空返回true,反之返回false。
- "",0,"0",NULL,F(xiàn)ALSE都認(rèn)為為空,返回true
- 沒有任何屬性的對象都認(rèn)為是空,返回true
- is_null:檢測傳入的值(值、變量、表達式)是否為null
- 定義了,但是賦值為Null,返回true
- 定義了,但是沒有賦值,返回reue
- 被unset一個變量,返回true
8
對于關(guān)系型數(shù)據(jù)庫而言,索引是相當(dāng)重要的概念,請回答有關(guān)索引的幾個問題:
- 索引的目的是什么?
- 快速訪問數(shù)據(jù)表中的特定信息,提高檢索速度
- 創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
- 加速表和表之間的連接
- 使用分組和排序子句進行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間
- 索引對數(shù)據(jù)庫系統(tǒng)的負(fù)面影響是什么? 負(fù)面影響: 創(chuàng)建索引和維護索引需要耗費時間,這個時間隨著數(shù)據(jù)量的增加而增加;索引需要占用物理空間,不光是表需要占用數(shù)據(jù)空間,每個索引也需要占用物理空間;當(dāng)對表進行增、刪、改、的時候索引也要動態(tài)維護,這樣就降低了數(shù)據(jù)的維護速度。
- 為數(shù)據(jù)表建立索引的原則有哪些?
- 在最頻繁使用的、用以縮小查詢范圍的字段上建立索引。
- 在頻繁使用的、需要排序的字段上建立索引
- 什么情況下不宜建立索引?
- 對于查詢中很少涉及的列或者重復(fù)值比較多的列,不宜建立索引。
- 對于一些特殊的數(shù)據(jù)類型,不宜建立索引,比如文本字段(text)等。
9
PHP網(wǎng)站的主要攻擊方式有哪些? 1. 命令注入(Command Injection) 2. eval 注入(Eval Injection) 3. 客戶端腳本攻擊(Script Insertion) 4. 跨網(wǎng)站腳本攻擊(Cross Site Scripting, XSS) 5. SQL 注入攻擊(SQL injection) 6. 跨網(wǎng)站請求偽造攻擊(Cross Site Request Forgeries, CSRF) 7. Session 會話劫持(Session Hijacking) 8. Session 固定攻擊(Session Fixation) 9. HTTP 響應(yīng)拆分攻擊(HTTP Response Splitting) 10. 文件上傳漏洞(File Upload Attack) 11. 目錄穿越漏洞(Directory Traversal) 12. 遠程文件包含攻擊(Remote Inclusion) 13. 動態(tài)函數(shù)注入攻擊(Dynamic Variable Evaluation) 14. URL 攻擊(URL attack) 15. 表單提交欺騙攻擊(Spoofed Form Submissions) 16. HTTP 請求欺騙攻擊(Spoofed HTTP Requests)
10
以下語句返回的結(jié)果中name列也許會出現(xiàn) null 的情況,那么在name字段上使用什么函數(shù)可以將出現(xiàn)的 null 改為一個默認(rèn)值。
SELECT a.id,b.name FROM tab1 AS a LEFT JOIN tab2 AS b ON(a.id = p.id) WHERE a.id > 10;
復(fù)制
答案:
SELECT a.id,IFNULL(b.name,'未定義') FROM tab1 AS a LEFT JOIN tab2 AS b ON(a.id = p.id) WHERE a.id > 10;
復(fù)制
來看官方手冊的解釋:IFNULL(expr1,expr2) 。如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數(shù)字或字符串值,取決于它被使用的上下文環(huán)境。文章來源:http://www.zghlxwxcb.cn/news/detail-510759.html
不過經(jīng)我測試,是有問題的,當(dāng) expr1=0而不是null時。他也返回了expr2;官方手冊應(yīng)改為當(dāng)expr1為null或者0時,返回expr2。文章來源地址http://www.zghlxwxcb.cn/news/detail-510759.html
到了這里,關(guān)于php面試題及答案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!