引用意味着用不一樣的名字訪問同一個內容
定義引用變量:使用&
普通變量的工做原理
$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
遞增/遞減 > ! > 算術運算符 > 大小比較 > (不)相等比較 > 引用 > ^ > | > 邏輯與&& > 邏輯或|| > 三目 > 賦值 > 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);
注意:默認是貪婪模式
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()
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
只能經過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請求數據編碼:application/x-www-form-urlencoded,而POST則除了application/x-www-form-urlencoded編碼,還能夠是multipart/form-data或者application/json或者text/xml 五、GET請求參數是有長度限制的,url最多2048個字節,而POST沒有限制
四種數據編碼html
主要了解 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