PHP面試之一:PHP基礎知識點

PHP引用變量

  • 什麼是引用變量?如何定義引用變量?
引用意味着用不一樣的名字訪問同一個內容
定義引用變量:使用&
  • 引用變量的工做原理
普通變量的工做原理
$a = range(0,10000);
var_dump(memory_get_usage()); //int(742072)
$b = $a;
var_dump(memory_get_usage()); //int(742096)
$a = range(0,30000);
var_dump(memory_get_usage()); //int(1532648)

圖片描述

引用變量的工做原理
$a = range(0,10000);
var_dump(memory_get_usage()); //int(742072)
$b = &$a;
var_dump(memory_get_usage()); //int(742096)
$a = range(0,30000);
var_dump(memory_get_usage()); //int(1135312)

圖片描述

注意:
一、引用變量一旦定義,此變量永遠是引用變量,不可能再變回普通變量
二、引用變量能夠修改引用的值,例如:
$a = 'a';
$c = 'c';
$b = &$a;
$b = &$c; //修改引用

常量及數據類型

  • 字符串的定義方式及各自區別
單引號、雙引號、heredoc、newdoc
單引號:不能解析變量,只能解析單引號(\')和反斜線(\\)轉義字符,比雙引號效率高
雙引號:解析變量(可以使用{}括起來),能解析全部轉義字符
heredoc:功能相似雙引號(用於大字符串)
newdoc: 功能相似單引號
//heredoc定義
$str = <<<EOT
xxxxxxxxxxxx
EOT;

//newdoc定義
$str = <<<'EOT'
xxxxxxxxxxxxxxxx
EOT;
  • 數據類型
浮點數: 不能用於運算/比較運算,由於浮點數不是精確的
FALSE七種狀況: 0、0.0、'0'、''、NULL、false、array()
超全局數組(九種):
$GLOBALS、$_GET、$_POST、$_SERVER、$_SESSION、$_COOKIE、$_FILES、$_ENV、$_REQUEST

//$GLOBALS包含其餘8種
//$_REQUEST包含$_GET、$_POST和$_COOKIE

$_SERVER['REQUESR_URI']與$_SERVER['PATH_INFO']區別

http://localhost/aaa/index.php/foo/bar.html?p=222&q=333
$_SERVER['QUERY_STRING'] = "p=222&q=333";
$_SERVER['REQUEST_URI']  = "/aaa/index.php/foo/bar.html?p=222&q=333";
$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";
$_SERVER['PHP_SELF']     = "/aaa/index.php";
$_SERVER['PATH_INFO'] = ‘/foo/bar.html’
  • 常量
2種定義方式:define()與const
define()函數
const是語言結構
區別
define()不能夠定義類常量
預約義常量
__FILE__、__LINE__

運算符

  • PHP錯誤運算符@
當將其放置在一個PHP表達式以前,該表達式可能產生的任何錯誤信息都將被忽略掉
  • 運算符的優先級

運算符優先級php

遞增/遞減 > ! > 算術運算符 > 大小比較 > (不)相等比較 > 引用 > ^ > | > 邏輯與&& > 邏輯或|| > 三目 > 賦值 > and > xor > or
<?php
    if($a = 3 > 0 && $b = 3 > 0){
        echo 'true';
    }else{
        echo 'false';
    }
?>

// 至關於
if($a = ((3 > 0) && ($b = 3 > 0)))
  • 比較運算符
==與===區別
等值判斷(FALSE七種狀況)
  • 邏輯運算符
短路做用: 邏輯與&& > 邏輯或|| > 三目 > 賦值 > and > xor > or
  • 遞增/遞減運算符
一、遞增/遞減不影響布爾值
二、遞減NULL值沒有效果
三、遞增NULL值爲1
四、遞增/遞減位置不一樣效果不一樣

流程控制

  • PHP遍歷數組的三種方式及各自區別
1.for循環(while/do...while)
2.foreach循環
3.while、each()、list()組合
區別:
for循環:只能遍歷索引數組
foreach循環:能遍歷關聯數組和索引數組
while、each()、list()組合:能遍歷關聯數組和索引數組

foreach循環遍歷數組前,會對數組進行reset()操做
while、each()、list()組合則不會進行reset()操做
  • PHP分支結構
if...elseif... 原則: 可能性大的放在前面
switch...case... 與 if 區別: 判斷參數的數據類型只能是整形、浮點、字符串
switch...case...中,若是使用continue與break等價
若是switch...case...外層還有for,那麼使用continue2才能夠跳出循環
通常switch要比if性能高

自定義函數及內部函數

  • 變量做用域
大部分變量只有一個單獨的範圍,這個單獨範圍跨度包含了include與requires的文件
若是在非類中引入文件,該文件內部能夠使用全局變量和函數
若是在類中引入文件,該文件內部能夠使用函數、類的方法、類的屬性
  • 函數/方法傳參
傳參分2種:
一、值傳遞
二、引用傳遞(函數修改該值,傳遞的參數必須是 變量
//引用傳遞函數定義
$a = 1;
function fn(&$a){
    return ++$a;
}
echo fn($a); //2
  • 函數返回值
能夠返回任意數據類型的值
省略return 默認返回NULL,若是要返回多個值請使用數組
函數2種方式返回
一、普通返回
二、引用返回
function &fn(){
    $a = 5;
    return $a;
}
$b = &fn();
函數內部修改外部變量的值,使用引用傳參
外部變量修改函數內部變量的值,使用引用返回
  • 引入外部文件
引入的代碼將繼承引入位置的做用域,即 使用include或require位置能夠使用的變量
include與require區別
  • 系統內置函數
時間日期函數
date()、strtotime()、mktime()、time()、microtime()、date_default_timezone_set()
IP處理函數
ip2long()、long2ip()
打印處理函數
print()、printf()、print_r()、echo、sprintf()、var_dump()、var_export()
序列化及反序列化函數
serialize()、unserialize()
字符串處理函數
trim()、
數組處理函數
array_rande()、

正則表達式

  • 正則表達式做用(四種)
分割、查找、匹配、替換 做用對象: 字符串、字符串、字符串(重要的事情記3遍)
  • 正則表達式的組成部分
分隔符:正斜線(/)、hash符(#)、取反符號(~)
通用原子:\d(匹配數字)、\D、\w(匹配數字、字母、下劃線)、\W、\s(匹配空格)、\S
元字符:
    量詞 ?、+、*、{n}、{n,}、{n,m}
    通配符 .
    範圍匹配 []、[-]、[^]
模式修正符:i、m、u、U
  • 向後引用
題目:把字符串 '<b>abc</b>' 替換爲 'abc' 如何使用正則作到?
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>/';
preg_replace($pattern, '\\1', $str);
  • 貪婪模式
題目:把字符串 '<b>abc</b><b>def</b>' 替換爲 'abcdef' 如何使用正則作到?
$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>(.*?)<\/b>/';
$pattern = '/<b>(.*)<\/b>/U';
preg_replace($pattern, '\\1', $str);
注意:默認是貪婪模式
  • 正則表達式PHP函數
preg_match()、preg_match_all()、preg_replace()、preg_split()
  • 中文匹配問題
中文分utf-8與gbk兩種編碼,他們正則表達式不一樣
utf-8: 0x4e00 - 0x9fa5 
模式修正符須要使用u

文件及目錄處理

  • 打開文件函數:fopen()
用於打開一個文件,打開時須要指定一個打開模式
打開模式:r/r+、w/w+、x/x+、a/a+、b、t
r+ 追加寫 w 覆蓋寫
  • 讀取文件函數:fread()/fgets()/fgetc()
fgets() 讀取一行
fgetc() 讀取字符
  • 寫入文件函數:fwrite()/fputs()
  • 關閉文件函數:fclose()
  • 不須要fopen()都能操做文件
file_put_contents()
file_get_contents()
  • 訪問遠程文件(不推薦開啓)
開啓allow_url_fopen() , http協議只能使用只讀,ftp協議能夠只能只讀或只寫
  • 目錄操做函數
目錄名稱:basename()dirname()pathinfo()
目錄讀取:opendir()readdir()closedir()rewinddir()
目錄刪除:rmdir()
目錄建立:mkdir()
  • 目錄遍歷
//遍歷

function loopDir($dir){

    if(is_dir($dir)){
        if($handle = opendir($dir)){
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    echo $file.'\n';
                    if(filetype($dir.DIRECTORY_SEPARATOR.$file === 'dir')){
                        loopDir($dir.DIRECTORY_SEPARATOR.$file);
                    }
                }
            }
        }
        
    }else{
        echo basename($file).'\n';
    }
}

會話控制

  • 會話控制的三種實現
一、使用URL帶參數的方式(不安全,不推薦)
二、cookie
三、session
  • 若是禁用cookie後,該如何實現會話控制?
只能經過URL把SessionID傳過去
<a href="next.php?<?php echo session_name().'='.session_id(); ?>">下一頁</a>
簡化:
<a href="next.php?<?php echo SID; ?>">下一頁</a>

面向對象

  • 訪問控制符
public、protected、private

網絡協議

  • GET與POST區別
一、GET能夠收藏成瀏覽器書籤,而POST不行
二、GET能夠保存在瀏覽器歷史記錄裏,而POST不行
三、GET安全性相比POST差
四、GET請求數據編碼:application/x-www-form-urlencoded,而POST則除了application/x-www-form-urlencoded編碼,還能夠是multipart/form-data或者application/json或者text/xml
五、GET請求參數是有長度限制的,url最多2048個字節,而POST沒有限制

四種數據編碼html

開發環境及PHP配置

  • 版本控制軟件

圖片描述

  • PHP運行原理
主要了解 CGI、FastCGI、PHP-FPM
CGI:是一種通信協議(已通過時,性能低下)
FastCGI:也是一種通信協議,是CGI的升級版(如今推薦使用)
PHP-FPM:是FastCGI進程管理器
php-cgi.exe:是PHP腳本解析器,不是FastCGI進程管理器
PHP 有5種PHP運行模式連接
一、以CGI模式運行PHP

LoadModule cgi_module modules/mod_cgi.so //要加載apache自帶模塊

<Files ~ "\.php$">
    Options FollowSymLinks ExecCGI
    AddHandler cgi-script .php
    FcgidWrapper "D:/BtSoft/WebSoft/php/7.1/php-cgi.exe" .php
</Files>

//若是同時打開多個則會有不少php-cgi.exe,而且在執行完成以後消失:

圖片描述

二、以FastCGI模式運行PHP

FastCGI模式根據進程管理器的不一樣能夠分爲:Apache內置進程管理器,PHP-FPM進程管理器

Apache內置進程管理器:
LoadModule fcgid_module modules/mod_fcgid.so //要加載apache模塊,該模塊要單獨下載
<IfModule fastcgi_module>
   FastCgiServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -processes 20
   AddType application/x-httpd-php .php
   AddHandler php-fastcgi .php
   Action php-fastcgi /cgi-bin/php-cgi
</IfModule>

PHP-FPM進程管理器:
LoadModule fastcgi_module modules/mod_fcgid.so
<IfModule fastcgi_module>
    FastCgiExternalServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000
    AddType application/x-httpd-php .php
    AddHandler php-fastcgi .php
    Action php-fastcgi /cgi-bin/php-cgi
</IfModule>

圖片描述

php54是以前是一種關係,php54以後另外一種關係。
php54以前,php-fpm(第三方編譯)是管理器,php-cgi是解釋器
php54以後,php-fpm(官方自帶),master 與 pool 模式。php-fpm 和 php-cgi 沒有關係了。php-fpm又是解釋器,又是管理器
三、以Apache模塊模式運行PHP

LoadModule php5_module "C:/php5/php5apache2_2.dll" 
AddType application/x-httpd-php .php
  • PHP常見配置

PHP 數組排序

圖片描述

相關文章
相關標籤/搜索