1. PHP執行的時候有如下執行過程:Scanning(Lexing) - Compilation - Execution - Parsing,其含義分別為(C)
A、將PHP代碼轉換為語言片段(Tokens)、將Tokens轉換成簡單而有意義的表達式、順次執行Opcodes、將表達式編譯成Opocdes
B、將PHP代碼轉換為語言片段(Tokens)、將表達式編譯成Opocdes、順次執行Opcodes、將Tokens轉換成簡單而有意義的表達式
C、將PHP代碼轉換為語言片段(Tokens)、將Tokens轉換成簡單而有意義的表達式、將表達式編譯成Opocdes、順次執行Opcodes
D、將PHP代碼轉換為語言片段(Tokens)、將表達式編譯成Opocdes、將Tokens轉換成簡單而有意義的表達式、順次執行Opcodes
2.不是php魔術常量的是(B)
A、_TRAIT_
B、_CALL_
C、_CLASS_
D、_FUNCTION_
3.php選項/信息函數作用錯誤的是(D)
A、phpinfo() 輸出關于 PHP 配置的信息
B、php_sapi_name() 返回 web 服務器和 PHP 之間的接口類型
C、ini_set() 為一個配置選項設置值
D、ini_get() 獲取所有配置選項
4.下列代碼的輸出是 (A)
$father=" mother";
$mother="son";
echo $$father;
A、son
B、mother
C、motherson
D、error
5.下列對shell 變量FRUIT 操作,正確的是(C)
A、為變量賦值:$FRUIT=apple
B、顯示變量的值:fruit=apple
C、顯示變量的值:echo $FRUIT
D、判斷變量是否有值:[ -f ―$FRUIT ]
6.以下不是線性表是(B)
A、數組
B、二叉樹
C、隊列
D、棧
7.以下哪個函數不是PHP的文件指針操作(C)
A、ftell()
B、fseek()
C、file()
D、feof()
8.關于線程的,說法錯誤的是(C)
A、線程是進程的一個實體,是CPU調度和分派的基本單位
B、它是比進程更小的能獨立運行的基本單位
C、線程和進程一樣擁有系統資源
D、線程自己基本上不擁有系統資源
9.GoAccess雖然很強大但是他不能做以下哪項工作(C)
A、生成統計數據帶寬統計
B、可生成HTML報告
C、可發送HTTP請求
D、各HTTP狀態碼統計
10.PHP的三個模塊不包括哪個(D)
A、內核
B、zend引擎
C、擴展層
D、解析層
11.CSRF攻擊描述錯誤的是(A)
A、CSRF需要有JavaScript代碼
B、CSRF攻擊惡意代碼位于第三方站點上
C、過濾用戶的輸入可以防止惡意代碼注入到某個站點,但是它無阻止法惡意代碼在第三方站點上運行
D、CSRF符合同源策略
12.關于PHP數組在C語言中是哪種存儲結構(B)
A、單鏈表
B、雙鏈表
C、循環鏈表
D、二叉樹
13.關于組合模式,說法錯誤的是(B)
A、它在我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內部結構解耦
B、定義了一種一對多的依賴關系,讓多個觀察者對象同時 監聽某一個主題對象。這個主題對象在狀態 發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己
C、樹枝和葉子實現統一接口,樹枝內部組合該接口
D、將對象組合成樹形結構以表示"部分-整體"的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性
14.數據結構的儲存方式描述錯誤的是(D)
A、順序存儲用數據元素在存儲器中的相對位置來表示數據元素之間的邏輯結構
B、鏈式存儲在每一個數據元素中增加一個存放另一個元素地址的指針,用該指針來表示數據元素之間的邏輯結構
C、順序結構數據元素存放的地址是連續的
D、數據算法的實現依賴于所采用的邏輯結構
15.下面Http協議請求方式中不包括(D)
A、OPTIONS
B、HEAD
C、DELETE
D、SET
16.下邊不是php的偽類型的是(D)
A、mixed
B、void
C、array|object
D、callable
E、以上都是
17.文本文件和二進制文件的存取,錯誤的是(C)
A、用記事本打開二進制文件時, 出現亂碼是很必然了
B、二進制文件還是文本文件, 在存儲時都是一連串的0和1
C、打開方式是一樣的
D、二進制文件最小單位則是位
18.不是PHP加密函數的是?(B)
A、openssl_encrypt
B、json_encode
C、mcrypt_encrypt
D、md5
19.什么是PHP的多維數組(B)
A、PHP的值是多種數據類型
B、PHP的值也是數組類型
C、PHP的索引有數字和字母
D、以上都是
20.下面哪一個正則表達式用來驗證電子郵件(如: zhang.san_123@scse.com.cn )的格式最正確(C)
A、[.0-9a-z]@([0-9a-z]+.)+[0-9a-z.-]{2,6}
B、[.09az-]*@([09az-]+.)+[09az.]+
C、[.0-9a-z-]+@([0-9a-z-]+.)+[0-9a-z.]+
D、[.09az-]+@([09az-]+.)+[09az]{2,6}
21.(C)是一種客戶端腳本語言,它采用解釋方式在計算機上執行。
A、Python
B、Java
C、PHP
D、JavaScript
22.以下關于結構型模式說法錯誤的是(B)
A、結構型模式可以在不破壞類封裝性的基礎上,實現新的功能
B、結構型模式主要用于創建一組對象
C、結構型模式可以創建一組類的統一訪問接口
D、結構型模式可以在不破壞類封裝性的基礎上,使得類可以同不曾估計到的系統進行交互
23.用PHP打印出前一天的時間格式是2006-5-10 22:21:21(AB)
A、echo date('Y-m-d H:i:s', strtotime('-1 days'));
B、echo date('Y-m-d H:i:s', strtotime('-1 day'));
C、echo date('Y-m-d H:i:s', strttime('-1 days'));
D、echo date('Y-n-d H:i:s', strtotime('-1 days'));
24.下面關于數組和數據結構的說法錯誤的是(D)
A、棧 是 后進先出的線性表,可以隨意寫入和讀取數據
B、隊列 是先進先出的線性表,只允許后端插入,前端進行刪除操作
C、php中可以用 array_push 入棧,arrar_pop 實現出棧
D、php中用array_push入列,array_shift 出列
25.以下關于引用說法錯誤的是(B)
A、引用不是C的指針
B、引用不允許用兩個變量來指向同一個內容
C、用引用可以傳遞變量
D、可以將一個變量通過引用傳遞給函數,這樣該函數就可以修改其參數的值。
26.數組的遍歷方式,下列錯誤的是(C)
A、foreach
B、each
C、for
D、list
27.PHP運行模式哪個不適合做http服務(D)
A、cgi模式
B、fastcgi模式
C、isapi模式
D、cli模式
28.在 Linux 中,文件(A)用于解析主機域名。
A、etc/hosts
B、etc/host.conf
C、etc/hostname
D、etc/bind
29. 字符串"\r","\n","\t","\x20"分別代表什么
- "\r"代表的含義是: 在Linux、unix 中表示返回到當行的最開始位置,在Mac OS 中表示換行且 返回到下一行的最開始位置,相當于Windows 里的 \n 的效果。
- "\n"代表的含義是: 在Windows 中表示換行且回到下一行的最開始位置。相當于Mac OS 里的 \r 的效果,在Linux、unix 中只表示換行,但不會回到下一行的開始位置。
- "\t"所代表的含義是: 鍵盤上的"TAB"鍵,跳格(移至下一列)。
- "\x20"所代表的含義是:是32在ASCII表中16進制的表示。
30. 以下語句輸出的結果是什么
$a = 3;
echo "$a",'$a',"\\\$a","${a}","$a"."$a","$a"+"$a";
//得到的結果是: 3$a\$a3336
31. 以下語句輸出的結果是什么
setcookie("a","value");
print $_COOKIE['a'];
//得到的結果是:value(若只是這兩段編碼運行,則會提示PHP Notice: Undefined index: a)
32. php中將當前頁面重定向到另一個頁面怎么寫?
header("Location:www.xxx.php");
33. 什么是魔術引號(magic_quotes_gpc)?
魔術引號(Magic Quotes)是一個自動將進入 PHP 腳本的數據進行轉義的 過程。提示:最好在編碼時不要轉義而在運行時根據需要而轉義。
34. 在類的方法中,如何調用其父類的同名方法?
parent::方法名
35. php中如何取得get,post參數,和上傳的文件
$_GET,$_POST,$_FILES
36. 如何取得客戶端的ip(要求取得一個int)
$_SERVER["REMOTE_ADDR"];//ip2long進行轉換
37 .include和require的區別
require:出現錯誤后直接終止退出,程序不再執行
include:包含一個不存在的文件,會提示警告程序會繼續執行
38. extends的作用是什么
類的繼承
39.@test()和&test()的區別
@test()的作用是屏蔽test()方法中警告的作用
&test()引用test()方法
40. array+array與array_merge()的區別
二者之間的區別是:
⑴鍵名為數字時,array_merge()不會覆蓋掉原來的值,但+合并數組則會
把最先出現的值作為最終結果返回,而把后面的數組擁有相同鍵名的那些值"拋棄"掉(不是覆蓋)
$arr1 = [1,2,3];
$arr2 = [4,5,6];
$arr3 = $arr1 + $arr2;
print_r($arr3);
//輸出
Array
(
[0] => 1
[1] => 2
[2] => 3
)
⑵鍵名為字符時,+仍然把最先出現的值作為最終結果返回,而把后面的數
組擁有相同鍵名的那些值"拋棄"掉,但array_merge()此時會覆蓋掉前面相同鍵名的值
$arr1 = [1,2,3];
$arr2 = [4,5,6];
$arr3 = array_merge($arr1,$arr2);
print_r($arr3);
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)
41. 請列舉最少3個php對象的魔術方法和說明它們的用途
__construct() 構造方法
__destruct() 析構方法
__get() 控制私有的、受保護的、未定義的成員屬性的訪問
__set() 對私有的、受保護的、未定義的成員屬性進行賦值控制
__isset() 對私有的、受保護的、未定義成員屬性進行isset和empty的判斷控制
42. 什么是fpm
FastCGI Process Manager:FastCGI進程管理器
43. 描述一下php開發中常見的幾種攻擊以及解決方案
- SQL注入:
解決這個問題的辦法是,將 PHP 的內置 mysql_real_escape_string() 函
數用作任何用戶輸入的包裝器。這個函數對字符串中的字符進行轉義,
使字符串不可能傳遞撇號等特殊字符并讓 MySQL 根據特殊字符進行操作。
進行數據庫操作的時候使用預處理語句。 - XSS跨站點腳本攻擊:
strip_tags() 函數,這個函數可以清除任何包圍在 HTML 標記中的內容
或者使用htmlspecialchars() 函數。 - CSRF跨站點請求偽造:
驗證 HTTP Referer 字段;在請求地址中添加 token 并驗證;在 HTTP 頭中自定義屬性并驗證。
44. echo intval(0.58*100) 輸出的結果是57,試分析這是為什么?
原因就是浮點數精度的問題。簡單的十進制分數如同 0.1 或 0.7 不能在不丟失一點點精度的情況下轉換為內部二進制的格式。
這就會造成混亂的結果:例如,floor((0.1+0.7) *10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999…...
這和一個事實有關,那就是不可能精確的用有限位數表達某些十進制分數。
例如,十進制的 1/3 變成了 0.3333333…...
所以永遠不 要相信浮點數結果精確到了最后一位,也永遠不要比較兩個浮點數是否相等 。如果確實需要更高的精度,應該使用任意精度數學函數或者 gmp 函數(GMP是一個開源的數學運算庫,它可以用于任意精度的數學運算,包括有符號整數、有理數和浮點數。它本身并沒有精度限制,只取決于機器的硬件情況。)
45.請用最簡單的語言告訴我PHP是什么?
是一種用來開發動態網站的服務器腳本語言。
46.什么是MVC?
MVC由Model(模型), View(視圖)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個不同層的PHP代碼。
Model:數據信息存取層。
View:view層負責將應用的數據以特定的方式展現在界面上。
Controller:通??刂破髫撠煆囊晥D讀取數據,控制用戶輸入,并向模型發送數據。
47.在頁面中引用CSS有幾種方式?
引用外部CSS文件
內部定義Style樣式
內聯樣式
48.PHP支持多繼承嗎?
在PHP的面向對象中,接口可以繼承接口。PHP類只能繼承一個父類(單繼承),但是接口可以實現多繼承,可以繼承一個或者多個接口。當然接口的繼承也是和類的繼承一樣使用extends關鍵字,要多個繼承的話只要用逗號把繼承的接口隔開即可。
class testA
{
function speaking($fans);
}
class testB
{
function dancing($name);
}
class testC extends testB,testA
{
function singing($nickname);
}
//類testC不可以繼承類testB和類testA,實例化類testC直接會報語法錯誤
interface testA
{
function speaking($viewer);
}
interface testB
{
function dancing($name);
}
interface testC extends testA,testB
{
function singing($nickname);
}
class testD implements testC
{
function speaking($viewer){
echo $viewer."正在講話!";
echo "\n";
}
function dancing($name){
echo $name."正在跳舞!";
echo "\n";
}
function singing($nickname){
echo $nickname."正在唱歌!";
echo "\n";
}
}
$testD = new testD();
$testD->speaking('粉絲');
$testD->dancing('助跳');
$testD->singing("周杰倫");
//接口testC可以繼承接口testB和接口testA
49.echo(),print(),print_r()的區別
echo是PHP語句, print和print_r是函數,語句沒有返回值,函數可以有返回值(即便沒有用)
print() 只能打印出簡單類型變量的值(如int,string)
print_r() 可以打印出復雜類型變量的值(如數組,對象)
echo 輸出一個或者多個字符串
50.請問GET和POST方法有什么區別?
get是發送請求HTTP協議通過url參數傳遞進行接收;
post是實體數據,可以通過表單提交大量信息.
51.PHP中獲取圖像尺寸大小的方法是什么?
getimagesize () 獲取圖片的尺寸
$size = getimagesize('1.jpg');
print_r($size);
//輸出
Array
(
[0] => 75
[1] => 75
[2] => 3
[3] => width="75" height="75"
[bits] => 8
[mime] => image/png
)
Imagesx () 獲取圖片的寬度
Imagesy () 獲取圖片的高度
$size = getimagesize('1.png');
$img = imagecreatefrompng('1.png');
echo imagesx($img).PHP_EOL;
echo imagesx($img);
//輸出
200
100
52.PHP中的PEAR是什么?
PEAR 是"PHP Extension and Application Repository"的縮寫,即PHP擴展和應用倉庫。
PEAR 將PHP程序開發過程中常用的功能編寫成類庫,涵蓋了頁面呈現、數據庫訪問、文件操作、數據結構、緩存操作、網絡協議、WebService 等許多方面,用戶可以通過下載這些類庫并適當的作一些定制以實現自己需要的功能。避免重復發明"車輪"。PEAR 的出現大大提高了PHP 程序的開發效率和開發質量。
53.如何用PHP和MySQL上傳視頻?
可以在數據庫中存放視頻的地址,而不需要將真正的視頻數據存在數據庫中。將視頻數據存放在服務器的指定文件夾下,上傳的默認大小是2MB,但是我們也可以在php.ini文件中修改max_file_size選項來改變。
54.PHP中的錯誤類型有哪些?
PHP中遇到的錯誤類型大致有3類。
- 提示:這都是一些非常正常的信息,而非重大的錯誤,有些甚至不會展示給用戶。比如訪問不存在的變量。
- 警告:這是有點嚴重的錯誤,將會把警告信息展示給用戶,但不會影響代碼的輸出,比如包含一些不存在的文件。
- 錯誤:這是真正的嚴重錯誤,比如訪問不存在的PHP類。
55.如何在PHP中定義常量?
PHP中使用Define () 來定義常量。
define('GREETING', 'Hello World');
56.如何不使用submit按鈕來提交表單?
可以用超鏈接來提交:
<a href="javascript: document.myform.submit();">Submit Me</a>
57.表單中 get與post提交方法的區別?
get是發送請求HTTP協議通過url參數傳遞進行接收;
post是實體數據,可以通過表單提交大量信息.
58.session與cookie的區別?
session:儲存用戶訪問的全局唯一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對于Cookie來說是存儲在用戶本地,兩者都可通過時間來設置時間長短
59.數據庫中的事務是什么?
事務(transaction)是作為一個單元的一組有序的數據庫操作。
組中的所有操作都成功,則認為事務成功,最終進行提交;
即使一個操作失敗,則認為事物失敗,最終進行回滾。
60、用PHP打印出前一天的時間格式是2006-5-10 22:21:21
echo date('Y-m-d H:i:s', strtotime('-1 day'));
61、echo(),print(),print_r()的區別
echo是PHP語句, print和print_r是函數,語句沒有返回值,函數可以有返回值(即便沒有用)
print() 只能打印出簡單類型變量的值(如int,string)
print_r() 可以打印出復雜類型變量的值(如數組,對象)
echo 輸出一個或者多個字符串
62、能夠使HTML和PHP分離開使用的模板
Smarty:PHP的一個引擎模板,可以進行更好的進行邏輯與顯示的分離,即我們常說的MVC,這個引擎的作用就是將C分離出來。其中的MVC分別指的是M模型(moder),V視圖(view),C控制器(controller)。簡單來說就是將html代碼與php代碼分離開,使速度更快,減少代碼量,方便程序的修改與維護。
Dwoo:一個PHP5模板引擎。兼容Smarty模板,它在Smarty語法的基礎上完全進行重寫。支持通過插件擴展其功能。
TinyButStrong:這個模板引擎確實很小,只有一個文件和一個PHP類!但它有一些顯著特性。它可以與MySQL、SQLite和PostgreSQL結合使用,并且它不局限于與HTML文件結合使用:它可以與XML、RTF和WML文件一起使用,也可以與OpenOffice和Microsoft Office的文檔文件一起使用。
Template Lite:Template Lite是一個非常快而且很小HTML模板引擎。該引擎支持Smarty模板引擎所具有的大部分功能和過濾器。
Savant:是一個強大但輕量級的面向對象PHP模板引擎。不象其模板系統,Savant默認沒有把模板編譯成PHP,而是使用PHP本身來作為它的模板語言所以你不需要學習一套新的標記系統。Savant有一個面向對象的模板插件系統和輸出過濾器,可以讓你快速為它新增新的行為。
phemplate:是一個簡單而且快速的PHP模板引擎。它允許在模板中加入變量和一些動態程序塊包括循環。該模板引擎能夠可以實現表現與邏輯相分離,也就是說你可以從PHP腳本中抽出所有HTML內容。設計人員可以隨意更改HTML而不用擔心弄亂你的PHP腳本。
XTemplate:是一個適用于PHP的模板引擎。它允許把HTML代碼與PHP代碼分開存儲。XTemplate包含了許多有用的功能比如嵌套的程序塊,各種類型的插值變量。其代碼非常簡潔并且是最優化的。
63、使用哪些工具進行版本控制?
svn,優點:各平臺(windows、unix、mac)都能使用。
64、如何實現字符串翻轉?
echo strrev($a);
65、優化MYSQL數據庫的方法。(4分,多寫多得)
①、選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設置NOT NULL,例如'省份,性別',最好設置為ENUM(枚舉類型)
②、使用連接(JOIN)來代替子查詢:
③、使用聯合(UNION)來代替手動創建的臨時表
④、事務處理,保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗
⑥、使用外鍵,優化表結構:
On Delete屬性:
- 當取值為No Action或者Restrict時,則當在外鍵的表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不刪除。
- 當取值為Cascade時,則當在外鍵的表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則刪除。
- 當取值為Set Null時,則當在即外鍵的表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
On Update屬性:
- 當取值為No Action或者Restrict時,則當在外鍵的表中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不更新。
- 當取值為Cascade時,則當在外鍵的表中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則更新。
- 當取值為Set Null時,則當在即外鍵的表中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
⑦、建立索引:普通索引/唯一索引/主鍵/聯合索引
⑧、優化查詢語句
a.最好在相同字段進行比較操作,在建立好的索引字段上盡量減少函數操作
// 例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
// 例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
// 例子3:
SELECT * FROM order WHERE title like "%good%";(慢)
SELECT * FROM order WHERE title>="good" and name<"good";(快)
66、請用最簡單的語言告訴我PHP是什么?
是一種用來開發動態網站的服務器腳本語言。
67、MYSQL取得當前時間的函數是?,格式化日期的函數是
now(),date()
68、實現中文字串截取無亂碼的方法。
使用mbstring擴展庫的mb_substr截取就不會出現亂碼了。
// mb_substr是按字來切分字符,
echo mb_substr('PHP是最好的語言^_^', 0, 7, 'utf-8');
// mb_strcut是按字節來切分字符
echo mb_strcut('PHP是最好的語言^_^', 0, 10, 'utf-8');
69、您是否用過版本控制軟件? 如果有您用的版本控制軟件的名字是?
是,git
70、您是否用過模板引擎? 如果有您用的模板引擎的名字是?
用過,smarty
71、請簡單闡述您最得意的開發之作
禮業社交小程序(集購物支付、信息查詢、微博功能、積分系統、社交功能的B2B2B平臺)
72、對于大流量的網站,您采用什么樣的方法來解決訪問量問題?
確認服務器硬件是否足夠支持當前的流量,數據庫讀寫分離,優化數據表,
程序功能規則,禁止外部的盜鏈,控制大文件的下載,使用不同主機分流主要流量
73、用PHP寫出顯示客戶端IP與服務器IP的代碼
// 打印客戶端IP(不能在CLI模式下執行):
// echo $_SERVER['REMOTE_ADDR'].PHP_EOL;
// 或者:
echo getenv('REMOTE_ADDR').PHP_EOL;
// 打印服務器IP:
echo gethostbyname("www.yuhal.com").PHP_EOL;
74、語句include和require的區別是什么?為避免多次包含同一文件,可用什么語句代替它們?
require:出現錯誤后直接終止退出,程序不再執行
include:包含一個不存在的文件,會提示警告程序會繼續執行
require_once或者include_once
75、如何修改SESSION的生存時間.
// 方法1:
將php.ini中的session.gc_maxlifetime設置為9999重啟apache或/nginx
// 方法2:
$savePath = "./session_save_dir/";
$lifeTime = 小時 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
// 方法3:
setcookie() and session_set_cookie_params($lifeTime);
76、有一個網頁地址, 比如58同城首頁: https://sh.58.com,如何得到它的內容?
// 方法1(對于PHP5及更高版本):
$readcontents = fopen("https://sh.58.com", "rb");
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
// 方法2:
echo file_get_contents("https://sh.58.com");
77、在HTTP 1.0中,狀態碼401的含義是是什么;如果返回"找不到文件"的提示,則可用 header 函數,其語句為?;
狀態401代表未被授權,header("Location:www.xxx.php");
78、在PHP中,heredoc的語法是什么?
heredoc的語法是用"<<<"加上自己定義成對的標簽,在標簽范圍內的文字視為一個字符串
$str = <<< EOT
my name is HaI!
EOT;
79、請描述盡可能多的HTTP狀態碼及含義
- 200 請求成功
- 301 資源(網頁等)被永久轉移到其它URL
- 302 資源(網頁等)被臨時轉移,客戶端繼續使用原有URI
- 400 客戶端請求的語法錯誤,服務器無法理解
- 400 未授權,請求要求用戶的身份認證
- 404 請求的資源(網頁等)不存在
- 500 內部服務器錯誤
80、什么是MVC?
MVC由Model(模型), View(視圖)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個不同層的PHP代碼。
Model:數據信息存取層。
View:view層負責將應用的數據以特定的方式展現在界面上。
Controller:通??刂破髫撠煆囊晥D讀取數據,控制用戶輸入,并向模型發送數據。
81、寫出發貼數最多的十個人名字的SQL,利用下表:
CREATE TABLE `members` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`username` varchar(255) NOT NULL COMMENT '用戶名稱',
`posts` varchar(255) DEFAULT '0' COMMENT '發帖數量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SELECT username FROM members ORDER BY posts DESC limit 0,10;
82. 請說明php中傳值與傳引用的區別。什么時候傳值什么時候傳引用?
按值傳遞:函數內對值的任何改變在函數外部都會被忽略。
引用傳遞:函數內對值的任何改變在函數外部也能反映出這些修改。
應用場景:按值傳遞時,php必須復制值,而按引用傳遞則不需要復制值,故引用傳遞一般用于大字符串或對象。
83. 在PHP中error_reporting這個函數有什么作用?
設置錯誤級別與錯誤信息回報
84. 請寫一個函數驗證電子郵件的格式是否正確
function checkEmail($email){
$pregEmail = "/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/";
return preg_match($pregEmail,$email);
}
print_r(checkEmail('AA1573+6736889@1ss63.com')).PHP_EOL;
85. http和https有什么區別?
- http是超文本傳輸協議,信息是明文傳輸,https是具有安全性的ssl加密傳輸協議
- http和https使用的是完全不一樣的連接方式,端口也不一樣,前者默認是80端口,后者則是443端口
- http是無狀態的協議,而https是由ssl+http構建的可進行加密傳輸、身份認證的網絡協議。
- https比http慢,因為http在TCP/IP基礎上傳輸的,TCP只需要三次握手。而https需要在TCP/IP基礎上再加TLS的四次握手。所以一定慢。
- https可以進行加密傳輸,相對而言比http安全很多,是現在網站的大趨勢
- https解決的三大風險:竊聽風險、篡改風險、冒充風險。會話密鑰解決了盜聽風險,數字簽名解決了篡改風險,數字證書(CA認證)解決了冒充風險
86、JS表單彈出對話框函數是?獲得輸入焦點函數是?
彈出對話框: alert(),prompt(),confirm()
獲得輸入焦點 focus()
87、JS的轉向函數是?怎么引入一個外部JS文件?
window.location.href
<script type="text/javascript"src="JS文件路徑"></script>
88、foo()和@foo()之間有什么區別?
@foo()控制錯誤輸出
foo()是調用該函數
89、如何聲明一個名為"myclass"的沒有方法和屬性的類?
class myclass{}
90、如何實例化一個名為"myclass"的對象?
new myclass()
91、你如何訪問和設置一個類的屬性?
class myclass
{
public $test;
}
$object = new myclass();
$newstr = $object->test;
$object->test = "info";
echo $object->test.PHP_EOL;
92、mysql_fetch_row() 和mysql_fetch_array之間有什么區別?
mysql_fetch_row是從結果集取出一行數組,作為枚舉
mysql_fetch_array是從結果集取出一行數組作為關聯數組,或數字數組,兩者兼得
93、GD庫是做什么用的?
GD庫提供了一系列用來處理圖片的API使用,GD庫可以處理圖片或者生成圖片。
在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。
94、指出一些在PHP輸入一段HTML代碼的辦法。
echo "<span>hello</span>";
95、下面哪個函數可以打開一個文件,以對文件進行讀和寫操作? C
A.fget()
B.file_open()
C.fopen()
D.open_file()
96、下面哪個選項沒有將 john 添加到users 數組中? BD
A. $users[] = 'john';
B. array_add($users,'john');
C. array_push($users,'john');
D. $users ||= 'john';
97、下面的程序的輸出結果?
<?php
$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
?>
//輸出:10
98、使用php寫一段簡單查詢,查出所有姓名為"John"的內容并打印出來
表名User
Name Tel Content Date
Marry 13333663366 CET4 2006-10-11
John 13612312331 CET6 2006-10-15
Peter 021-55665566 CET3 2006-10-15
請根據上面的題目完成代碼:
// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("連接失敗: " . $conn->connect_error);
}
$sql = "SELECT * FROM tbl_user WHERE name='John'";
$result = $conn->query($sql);
// 輸出數據
while($row = $result->fetch_assoc()) {
echo "name: " . $row["name"].PHP_EOL."tel: " . $row["tel"].PHP_EOL."content: " . $row["content"].PHP_EOL."date: " . $row["date"].PHP_EOL;
}
99、瀏覽器訪問網頁過程中發生了什么?
- 第一步,解析域名,找到主機IP
- 第二步,瀏覽器與網站建立TCP連接
- 第三步,瀏覽器發起GET請求
- 第四步,顯示頁面或返回其他
100、寫出 SQL語句的格式 : 插入 ,更新 ,刪除
表名User
Name Tel Content Date
Marry 13333663366 CET6 2006-10-11
John 13612312331 CET4 2006-10-15
Peter 021-55665566 CET4 2006-10-15
(a) 有一新記錄(Pack 13254748547 CET6 2007-05-06)請用SQL語句新增至表中
(b) 請用sql語句把John的時間更新成為當前系統時間
(c) 請寫出刪除名為Peter的全部記錄
a. mysql_query("INSERT INTO `user` (name,tel,content,date) VALUES
('Pack','13254748547','CET6','2007-05-06')")
b. $nowDate = date("Ymd");
mysql_query("UPDATE `user`SET date='".$nowDate."'WHERE name='John'");
c.mysql_query("DELETE FROM `user` WHERE name='Peter'");
101、請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char有什么區別
- int是數字類型
- char固定長度字符串
- varchar實際長度字符串
- datetime日期時間型
- text文本字符串
char的場地固定為創建表設置的長度,varchar為可變長度的字符
102、寫出以下程序的輸出結果
<?php
$b = 201;
$c = 40;
$a = $b>$c?4:5;
echo $a;
?>
//輸出 4
103、檢測一個變量是否有設置的函數是否?是否為空的函數是?
isset();
empty();
104、取得查詢結果集總數的函數是?
mysql_num_rows();
105、$arr = array('james', 'tom', 'symfony'); 請打印出第一個元素的值
echo $array[0];
106、請將數組的值用','號分隔并合并成字串輸出
echo rtrim(implode(',',$array));
107、PHP二維數組去重
function assoc_unique($arr, $key) {
$tmp_arr = array();
foreach ($arr as $k => $v) {
//搜索$v[$key]是否在$tmp_arr數組中存在,若存在返回true
if (in_array($v[$key], $tmp_arr)) {
unset($arr[$k]);
} else {
$tmp_arr[] = $v[$key];
}
}
//sort函數對數組進行排序
sort($arr);
return $arr;
}
$aa = array(
array('id' => 123, 'name' => '張三'),
array('id' => 123, 'name' => '李四'),
array('id' => 124, 'name' => '王五'),
array('id' => 125, 'name' => '趙六'),
array('id' => 126, 'name' => '趙六')
);
$key = 'id';
$arr = assoc_unique($aa, $key);
print_r($arr);
//輸出
Array
(
[0] => Array
(
[id] => 123
[name] => 張三
)
[1] => Array
(
[id] => 124
[name] => 王五
)
[2] => Array
(
[id] => 125
[name] => 趙六
)
[3] => Array
(
[id] => 126
[name] => 趙六
)
)
108、$a='abcdef'; 請取出$a的值并打印出第一個字母
echo $a{0};
//或
echo substr($a,0,1)
109、PHP可以和sql server/oracle等數據庫連接嗎?
當然可以
110、請寫出PHP5權限控制修飾符
public(公共),private(私用),protected(繼承)
111、請寫出php5的構造函數和析構函數
__construct , __destruct
112、完成以下:
(一)創建新聞發布系統,表名為message有如下字段
id 文章id
title 文章標題
content 文章內容
category_id 文章分類id
hits 點擊量
CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章id',
`title` char(30) NOT NULL COMMENT '文章標題',
`content` varchar(255) NOT NULL COMMENT '文章內容',
`category_id` int(11) NOT NULL COMMENT '文章分類id',
`hits` int(11) NOT NULL COMMENT '點擊量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
(二)同樣上述新聞發布系統:表comment記錄用戶回復內容,字段如下
comment_id 回復id
id 文章id,關聯message表中的id
comment_content 回復內容
CREATE TABLE `comment` (
`comment_id` int(11) NOT NULL COMMENT '回復id',
`id` int(11) DEFAULT NULL COMMENT '文章id,關聯message表中的id',
`comment_content` varchar(255) DEFAULT NULL COMMENT '回復內容',
PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
現通過查詢數據庫需要得到以下格式的文章標題列表,并按照回復數量排序,回復最高的排在最前面
文章id 文章標題 點擊量 回復數量
用一個SQL語句完成上述查詢,如果文章沒有回復則回復數量顯示為0
SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits,IF(comment.`id` is NULL,0,count(*))number FROM message LEFT JOIN comment ON message.id=comment.id GROUP BY message.`id`;
(三)上述內容管理系統,表category保存分類信息,字段如下
category_id 分類id
categroy_name 分類名稱
CREATE TABLE `category` (
`category_id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '分類id',
`category_name` varchar(40) NOT NULL COMMENT '分類名稱',
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
用戶輸入文章時,通過選擇下拉菜單選定文章分類
寫出如何實現這個下拉菜單
$sql = "SELECT * FROM category";
$result = $conn->query($sql);
print("<select>");
while($row = $result->fetch_assoc()) {
print("<option>".$row['category_name']."</option>");
}
print("</select>");
113. 寫一個函數,盡可能高效的,從一個標準 url 里取出文件的擴展名
例如: https://yuhal.com/index.php?id=1 需要取出 php 或 .php
方案1:
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(".",$file);
return $ext[1];
}
方案2:
function getExt($url) {
$url = basename($url);
$pos1 = strpos($url,".");
$pos2 = strpos($url,"?");
if(strstr($url,"?")){
return substr($url,$pos1 + 1,$pos2 - $pos1 - 1);
} else {
return substr($url,$pos1);
}
}
114.寫一個函數,算出兩個文件的相對路徑
//計算出 $b 相對于 $a 的相對路徑
$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode('/', $a);
$arrB = explode('/', $returnPath[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++) {
if ($arrA[$n] != $arrB[$n]) {
break;
}
}
if ($len - $n > 0) {
$returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));
}
$returnPath = array_merge($returnPath, array_slice($arrA,$n));
return implode('/', $returnPath);
}
echo getRelativePath($a, $b);
115.寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ) {
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".." && $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
116.簡述論壇中無限分類的實現原理。
CREATE TABLE category(
cat_id smallint unsigned not null auto_increment primary key comment'類別ID',
cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'類別名稱',
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'類別父ID'
)engine=MyISAM charset=utf8;
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是頂級分類,則將其存到$list中,并以此節點為根節點,遍歷其子節點
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
117.PEAR中的數據庫連接字符串格式是?
$dsn = pgsql://postgres:123@tcp+192.168.0.1:8848/testdb。
118.寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把scrīpt標記及其內容都去掉):
$script = '123<script> alert(123) </script>';
$str = preg_replace("/<script>.*?<\/script>/i", "", $script);
print_r($str);
//輸出
111
119.數組函數 arsort 的作用是?
對數組進行逆向排序并保持索引關系
$arr = [1,2,3,4];
arsort($arr);
print_r($arr);
//輸出
Array
(
[3] => 4
[2] => 3
[1] => 2
[0] => 1
)
120.mysql存儲引擎Innode和MyISAM的區別。
Innode | MyISAM | |
---|---|---|
事務處理方面 | 支持事務 | 不支持事務 |
鎖 | 行級鎖 | 表級鎖 |
增刪改查性能 | 大量的增刪改 | 大量的查詢 |
自增類型字段 | 可以和其他字段一起建立聯合索引 | 必須包含只有該字段的索引 |
121. Yii 2 Framework的最新版本是什么?
最新版本的Yii 2是2.0.15,發布于2018年3月20日。
122. 在Yii2中如何獲取當前URL?
//獲取Yii框架中的當前url。
Yii::app()->request->getUrl()
123. Yii中“render”和“renderpartial”有什么區別?
render函數用于使用指定的布局渲染Yii中的視圖,而renderpartial用于渲染,視圖中不包含視圖布局。
當必須通過AJAX更新頁面的一部分時,基本上使用Renderpartial。
用法:
render('yourviewname');
renderpartial('yourviewpartial');
124. yii中的Active Record(AR)是什么?
Active Record提供了一個面向對象的接口,用于訪問和操作存儲在數據庫中的數據。 Active Record類與數據庫表相關聯,Active Record實例對應于該表的一行,Active Record實例的屬性表示該行中特定列的值。 可以訪問Active Record屬性并調用Active Record方法來訪問和操作存儲在數據庫表中的數據,而不是編寫原始SQL語句。
125.Yii CModel類是什么?
Yii CModel是提供數據模型對象所需的通用功能的基類。CModel定義了需要驗證的數據模型的基本框架。Yii中的所有模型都擴展了CModel類。
126.類的屬性可以序列化后保存到 session 中,從而以后可以恢復整個類,這要用到的函數是?
unserialize()
127.SQL中LEFT JOIN的含義是什么?
自然左外鏈接
128.根據下列表信息,查詢各個學生姓名及對應的的各科總成績。
CREATE TABLE `tbl_member` (
`id` int(11) NOT NULL COMMENT '用戶ID',
`name` char(10) DEFAULT NULL COMMENT '用戶名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='學生表'
CREATE TABLE `tbl_score` (
`member_id` int(11) NOT NULL COMMENT '用戶id',
`subject` varchar(255) DEFAULT NULL COMMENT '學科',
`score` int(11) DEFAULT NULL COMMENT '分數',
PRIMARY KEY (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分數表'
select * from tbl_member left join tbl_score on tbl_member.id=tbl_score.member_id
129.下面的程序的輸出結果?
echo 8%(-2);
//輸出 0
130.PHP7 和 PHP5 的區別,具體多了哪些新特性?
- 性能提升了兩倍
- 結合比較運算符 (<=>)
- 標量類型聲明
- 返回類型聲明
- try...catch 增加多條件判斷,更多 Error 錯誤可以進行異常處理
131.為什么 PHP7 比 PHP5 性能提升了?
- 變量存儲字節減小,減少內存占用,提升變量操作速度
- 改善數組結構,數組元素和 hash 映射表被分配在同一塊內存里,降低了內存占用、提升了 cpu 緩存命中率
- 改進了函數的調用機制,通過優化參數傳遞的環節,減少了一些指令,提高執行效率
132.laravel中服務提供者是什么?
服務提供者是所有 Laravel 應用程序引導啟動的中心, Laravel 的核心服務器、注冊服務容器綁定、事件監聽、中間件、路由注冊以及我們的應用程序都是由服務提供者引導啟動的。
133.laravel中IoC 容器是什么?
IoC(Inversion of Control)譯為 「控制反轉」,也被叫做「依賴注入」(DI)。什么是「控制反轉」?對象 A 功能依賴于對象 B,但是控制權由對象 A 來控制,控制權被顛倒,所以叫做「控制反轉」,而「依賴注入」是實現 IoC 的方法,就是由 IoC 容器在運行期間,動態地將某種依賴關系注入到對象之中。
其作用簡單來講就是利用依賴關系注入的方式,把復雜的應用程序分解為互相合作的對象,從而降低解決問題的復雜度,實現應用程序代碼的低耦合、高擴展。
Laravel 中的服務容器是用于管理類的依賴和執行依賴注入的工具。
134.laravel中Facades 是什么?
Facades(一種設計模式,通常翻譯為外觀模式)提供了一個"static"(靜態)接口去訪問注冊到 IoC 容器中的類。提供了簡單、易記的語法,而無需記住必須手動注入或配置的長長的類名。此外,由于對 PHP 動態方法的獨特用法,也使測試起來非常容易。
135.laravel中Contract 是什么?
Contract(契約)是 laravel 定義框架提供的核心服務的接口。Contract 和 Facades 并沒有本質意義上的區別,其作用就是使接口低耦合、更簡單。
136.laravel中依賴注入的原理?
依賴注入原理其實就是利用類方法反射,取得參數類型,然后利用容器構造好實例。然后再使用回調函數調起。
注入對象構造函數不能有參數。否則會報錯。Missing argument 1
依賴注入故然好,但它必須要由 Router 類調起,否則直接用 new方式是無法實現注入的。所以這就為什么只有 Controller 、Job 類才能用這個特性了。
137.laravel的生命周期以及簡單描述下laravel路由
Laravel 的生命周期從pu訪問入口開始,再從訪問入口結束結束。路由由注冊到啟動來實現
138.Mysql中like查詢字符串的索引使用區別
field like"str%"會使用索引,like"%str%"不使用索引
139.什么是 Composer, 工作原理是什么?
Composer 是 PHP 的一個依賴管理工具。工作原理就是將已開發好的擴展包從 packagist.org composer 倉庫下載到我們的應用程序中,并聲明依賴關系和版本控制。
140.composer autoload的原理
使用php自帶的spl_autoload_register函數,注冊處理__autoload的方法
141.Redis、Memecached 這兩者有什么區別?
- Redis 支持更加豐富的數據存儲類型,String、Hash、List、Set 和 Sorted Set。- - -
- Memcached 僅支持簡單的 key-value 結構。-
- Memcached key-value存儲比 Redis 采用 hash 結構來做 key-value 存儲的內存利用率更高。
- Redis 提供了事務的功能,可以保證一系列命令的原子性
- Redis 支持數據的持久化,可以將內存中的數據保持在磁盤中
- Redis 只使用單核,而 Memcached 可以使用多核,所以平均每一個核上 Redis 在存儲小數據時比 Memcached 性能更高。
142.Redis 如何實現持久化?
- RDB 持久化,將 redis 在內存中的的狀態保存到硬盤中,相當于備份數據庫狀態。
- AOF 持久化(Append-Only-File),AOF 持久化是通過保存 Redis 服務器鎖執行的寫狀態來記錄數據庫的。相當于備份數據庫接收到的命令,所有被寫入 AOF 的命令都是以 redis 的協議格式來保存的。
143.什么是索引,作用是什么?常見索引類型有那些?
索引是一種特殊的文件,它們包含著對數據表里所有記錄的引用指針,相當于書本的目錄。其作用就是加快數據的檢索效率。常見索引類型有主鍵、唯一索引、聯合索引、普通索引索引。
144.Mysql 建立索引的原則?
- 最左前綴原理
- 選擇區分度高的列作為索引
- 盡量的擴展索引,不要新建索引
145.高并發如何處理?
- 使用緩存
- 優化數據庫,提升數據庫使用效率
- 負載均衡
146.寫出以下程序的輸出結果
$arr = [1,2,3,4];
foreach ($arr as $v) {
echo $v.PHP_EOL;
$v = 5;
}
print_r($arr);
//輸出
1
2
3
4
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)