1. 程式人生 > >PHP 面試題 PHP部分(一)

PHP 面試題 PHP部分(一)

list get 一個 目標 span 快速 是把 true sta

1、雙引號和單引號的區別?

  • 雙引號解釋變量,單引號不解釋變量;

  • 雙引號裏插入單引號,其中單引號裏如果有變量的話,變量解釋;

  • 雙引號解釋轉義字符,單引號不解釋轉義字符,但是解釋‘\和\\;

  • 單引號的效率比雙引號要高(因為雙引號要先遍歷一遍,判斷裏面有沒有變量,然後再進行操作,而單引號則不需要判斷);

  • 雙引號的變量名後面必須要有一個非數字、字母、下劃線的特殊字符,或者用講變量括起來,否則會將變量名後面的部分當做一個整體,引起語法錯誤。

2、HTTP中POST、GET、PUT、DELETE方式的區別?

(1)表單中get和post提交方式的區別
  • get是把參數數據隊列加到提交表單的action屬性所指的url中,值和表單內各個字段一一對應,從url中可以看到;post是通過HTTPPOST機制,將表單內各個字段與其內容放在HTML的head中一起傳送到action屬性所指的url地址,用戶看不到這個過程
  • 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據
  • get傳送的數據量較小(受瀏覽器限制,不同的瀏覽器限制長度不一樣),post傳送的數據量較大,一般被默認不受限制,但在理論上,IIS4中最大量為80kb,IIS5中為1000k,get安全性非常低,post安全性較高
(2)post、get、put、delete方式的區別
  • GET請求會向數據庫發索取數據的請求,從而來獲取信息,該請求就像數據庫的select操作一樣,只是用來查詢一下數據,不會修改、增加數據,不會影響資源的內容,即該請求不會產生副作用。無論進行多少次操作,結果都是一樣的。

  • PUT請求是向服務器端發送數據的,從而改變信息,該請求就像數據庫的update操作一樣,用來修改數據的內容,但是不會增加數據的種類等,也就是說無論進行多少次PUT操作,其結果並沒有不同。

  • POST請求同PUT請求類似,都是向服務器端發送數據的,但是該請求會改變數據的種類等資源,就像數據庫的insert操作一樣,會創建新的內容。幾乎目前所有的提交操作都是用POST請求的。

  • DELETE請求顧名思義,就是用來刪除某一個資源的,該請求就像數據庫的delete操作。

(3)get和post的區別
  • get提交的參數在url中可見,相對於post安全性低;

  • get傳輸的數量小(受瀏覽器限制,不用瀏覽器最大長度不同),post傳值大小可以在php.ini中進行設置;

  • get一般用於從服務器獲取數據,post一般用於向服務器提交數據;

  • get的執行效率比post高。

3、echo、print_r()、print、var_dump()之間的區別

(1)echo與print區別

  • echo、print為結構語言,echo()、print()為函數;

  • echo 輸出一個以上的字符串(中間以逗號隔開),print 只能輸出一個字符串;

  • echo 沒有返回值,print有返回值;

  • echo 效率比print高。

(2)echo、print、print_r()、var_dump()區別

  • echo 語言結構,輸出一個或多個字符串,中間以逗號隔開,沒有返回值,不能作為表達式的一部分使用;
  • print也是php的一個關鍵字,有返回值 只能打印出簡單類型變量的值(如int,string),如果字符串顯示成功則返回true,否則返回false;
  • print_r() 可以打印出復雜類型變量的值(如數組、對象)以列表的形式顯示,並以array、object開頭,但print_r輸出布爾值和NULL的結果沒有意義,因為都是打印"\n",因此var_dump()函數更適合調試;
  • var_dump() 判斷一個變量的類型和長度,並輸出變量的數值。

語句include和require的區別是什麽?為避免多次包含同一文件,可以用(?)語句代替他們

  • require是無條件包含,也就是如果一個流程裏加入require,無論條件成立與否都會先執行require,當文件不存在或者無法打開的時候,會提示錯誤,並且會終止程序執行

  • include有返回值,而require沒有(可能因為如此require的速度比include快),如果被包含的文件不存在的化,那麽會提示一個錯誤,但是程序會繼續執行下去

  • 包含文件不存在或者語法錯誤的時候,require是致命的,而include不是

  • require_once、include_once表示了只包含一次,避免了重復包含

4、談談mvc的認識

由模型、視圖、控制器完成的應用程序,由模型發出要實現的功能到控制器,控制器接收組織功能傳遞給視

優點:①可以實現代碼的重用性,避免產生代碼冗余;②M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式

5、HTTP狀態碼

常見的HTTP狀態碼:

  • 200 - 請求成功
  • 203 - 非授權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本
  • 204 - 無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔
  • 205 - 重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可通過此返回碼清除瀏覽器的表單域
  • 206 - 部分內容。服務器成功處理了部分GET請求
  • 301 - 永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替
  • 302 - 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI
  • 305 - 使用代理。所請求的資源必須通過代理訪問
  • 401 - 請求要求用戶的身份認證
  • 403 - 服務器理解請求客戶端的請求,但是拒絕執行此請求
  • 404 - 請求的資源(網頁等)不存在
  • 503 - 由於超載或系統維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中
  • 505 - 服務器不支持請求的HTTP協議的版本,無法完成處理

HTTP狀態碼分類:

  • 1** - 信息,服務器收到的請求,需要請求者繼續執行操作
  • 2** - 成功,操作被成功接收並處理
  • 3** - 重定向,需要進一步的操作以完成請求
  • 4** - 客戶端錯誤,請求包含語法錯誤或者無法完成請求
  • 5** - 服務器錯誤,服務器在處理請求的過程 中發生了錯誤

6、常用的超全局變量(8個)

  • $_GET ----->get傳送方式
  • $_POST ----->post傳送方式
  • $_REQUEST ----->可以接收到get和post兩種方式的值
  • $_FILE ----->上傳文件使用

  • $GLOBALS ----->所有的變量都放在裏面
  • $_SERVER ----->系統環境變量

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

————————————————————————————————————————————————————————————————————————————————

  • $_ENV ------->PHP解析所在服務器環境的有關信息

7、php5的魔術變量與魔術方法?

(1)魔術方法

1、__construct() :實例化對象時自動調用。

2、__destruct() :銷毀對象或腳本執行結束時自動調用。

3、__call() :調用對象不存在得方法時執行此函數。

4、__get() :獲取對象不存在的屬性時執行此函數。

5、__set() :設置對象不存在的屬性時執行此函數。

6、__isset() : 檢測對象的某個屬性是否存在時執行此函數。

7、__unset() :銷毀對象的某個屬性時執行此函數。

8、__toString() :將對象當作字符串輸出時執行此函數。

9、__clone() :克隆對象時執行此函數。

10、__autoload() :實例化對象時,當類不存在時,執行此函數自動加載類。

11、__sleep() serialize之前被調用,可以指定要序列化的對象屬性。

12、__wakeup unserialize之前被調用,可以執行對象的初始化工作。

13、__set_state() :調用var_export時,被調用。用__set_state的返回值做為var_export的返回值。

14、__invoke() :將對象當作函數來使用時執行此方法,通常不推薦這樣做。

(2)魔術常量

1、__line__ :文件中的當前行號。

2、__file__ :文件的完整路徑和文件名。

3、__dir__ :文件所在的目錄。

4、 __function__ :函數名稱(php 4.3.0新加)。自php5起本常量返回該函數被定義時的名字(區分大小寫)。

5、__class__ :類的名字(php 4.3.0新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。

6、__namespace__ :當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。

7、__trait__ :Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被聲明的作用區域(例如 Foo\Bar)。

8、__method__ :類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。

8、如何獲取客戶端的ip(要求取得一個int)和服務器ip的代碼

客戶端:$_SERVER["REMOTE_ADDR"];或者getenv(‘REMOTE_ADDR‘) ip2long進行轉換

服務器端:$_SERVER["SERVER_ADDR"];或者gethostbyname(‘www.baidu.com‘)

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

輸出 1

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

10、使用list()函數需要註意什麽?

list()是一個語法結構。List($array)是用來快速把數組中的元素賦給一些變量。使用時要註意,$array必須為一個索引數組,並且索引值從0開始。

用法:

$arr = array(‘23‘,‘1‘,‘30‘,‘12‘,‘5‘);
list($a,,$b) = $arr;
echo ‘$a:‘.$a.‘;$b:‘.$b;

輸出結果:$a:23;$b:30

11、說明php中傳值與傳引用的區別,並說明什麽時候傳引用?

傳值
是把實參的值賦值給行參
那麽對行參的修改,不會影響實參的值

傳地址
是傳值的一種特殊方式,只是他傳遞的是地址,不是普通的如int
那麽傳地址以後,實參和行參都指向同一個對象

傳引用
真正的以地址的方式傳遞參數
傳遞以後,行參和實參都是同一個對象,只是他們名字不同而已
對行參的修改將影響實參的值  

  $a = "123";
  $b = &$a;//引用賦值(在源變量前加&符號)
  echo $a."-".$b; // 輸出:123-123
  echo "<br/>";
  $b = "456465"; // 輸出:456465-456465
  echo $a."-".$b;

  // 結論 :
  // PHP 傳引用時 形參 發聲改變的時候 實參也發生改變;

傳值,就是僅將對象的值傳遞給目標對象,就相當於copy;系統將為目標對象重新開辟一個完全相同的內存空間。
傳引用,就是將對象在內存中的地址傳遞給目標對象,就相當於使目標對象和原始對象對應同一個內存存儲空間。此時,如果對目標對象進行修改,內存中的數據也會改變。

對象默認是傳引用 對於較大是的數據,傳引用比較好,這樣可以節省內存的開銷

12、如何命令下運行PHP腳本(兩種方式),如何向PHP腳本傳遞參數?

(1)運行PHP腳本

方法一:先進入php安裝目錄,執行 php 路徑/文件名.php

例:php my_script.php php -f "my_script.php"

方法二:php -r “php腳本”;(不需要加php的開始符和結束符)

例:php -r "print_r(get_defined_constants());"

(2)向php腳本傳遞參數:

方法一:使用$argv or $argc參數接收

php腳本:

<?php
echo "接收到{$argc}個參數";
print_r($argv);

執行:

[root@DELL113 lee]# /usr/local/php/bin/php test.php
接收到1個參數Array
(
[0] => test.php
)
[root@DELL113 lee]# /usr/local/php/bin/php test.php a b c d
接收到5個參數Array
(
[0] => test.php
[1] => a
[2] => b
[3] => c
[4] => d
)

方法二:使用getopt函數

php腳本:

<?php
$param_arr = getopt(‘a:b:‘);
print_r($param_arr);

執行:

[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345
Array
(
[a] => 345
)
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3
Array
(
[a] => 345
[b] => 12q3
)
[root@DELL113 lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3 -e 3322ff
Array
(
[a] => 345
[b] => 12q3
)

什麽是魔術引號

waring:本特性已自 PHP 5.3.0 起廢棄並將自 PHP 5.4.0 起移除

魔術引號是一個將自動將進入PHP腳本的數據進行轉義的過程,最好在編碼時不要轉義而在運行時根據需要而轉義

當打開時,所有的 (單引號),"(雙引號),\(反斜線)和 NULL 字符都會被自動加上一個反斜線進行轉義。這和 addslashes() 作用完全相同。

一共有三個魔術引號指令:

  • magic_quotes_gpc 影響到 HTTP 請求數據(GET,POST 和 COOKIE)。不能在運行時改變。在 PHP 中默認值為 on 參見 get_magic_quotes_gpc()。
  • magic_quotes_runtime 如果打開的話,大部份從外部來源取得數據並返回的函數,包括從數據庫和文本文件,所返回的數據都會被反斜線轉義。該選項可在運行的時改變,在 PHP 中的默認值為 off 參見 set_magic_quotes_runtime() 和 get_magic_quotes_runtime()。
  • magic_quotes_sybase 如果打開的話,將會使用單引號對單引號進行轉義而非反斜線。此選項會完全覆蓋 magic_quotes_gpc。如果同時打開兩個選項的話,單引號將會被轉義成 ‘‘。而雙引號、反斜線 和 NULL 字符將不會進行轉義。 如何取得其值參見 ini_get()。

PHP 面試題 PHP部分(一)