[TOC]
## 什么是引用變量?在PHP當中,用什么符號定義引用變量?
1. PHP的引用變量的概念及定義方式
**概念**: 在PHP中引用意味著用不同的名字訪問同一個變量內容。
**定義方式**: 使用&符號
2. 延伸:PHP引用變量的原理
普通賦值
```
//定義一個變量
$a= range(8,1988)
//定義變量b,將a變量的值賦值給b
// COW機制 Copy On Write
$b=$a; //此時, $b和$a指向同一個內存地址,只有當$a改變時,$b才指向新的地址
//對a進行修改
$a= range(8,1999)
```
引用賦值
```
$b=&$a
```
$a和$b永遠指向一個變量地址
## 回話控制
### cookie
保存本地中
```
//賦值
setcookie($name, $value, $expire, $path, $domain, $seure);
//取值
$_COOKIE($name);
//刪除
setcookie("TestCookie", "", time() - 10000 );
//設置數組
setcookie("user[three]", "cookiethree");
setcookie("user[two]", "cookietwo");
setcookie("user[one]", "cookieone");
```
### session
保存在服務器中
```
//開始
session_start();
//賦值
$_SESSION['favcolor'] = 'green';
//清空session
$_SESSION=[];
//刪除sesion及cookie中的session_id
session_destroy();
//刪除
unset($_SESSION["newsession"]);
//以下設置表示,在超過1440的sesison,有百分之一的概率刪除session,
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
ini_set('session.gc_maxlifetime', 1440); //設置過期時間
```
### 傳遞session id
可在cookie被禁用時,也可以使用session_id
常量SID 如果開啟了 cookie SID 就為空 如果沒開啟 SID 等價于 - PHPSESSIONID=session_id()的值,
[如何傳遞 session_id 參考]( https://segmentfault.com/q/1010000007715137)
```
< a href="1.php?<? php echo SID ;?>">下個頁面</a>
//等價
< a href="1.php?<?php echo session_name() ;?>= <?php session_id() ;?>">下個頁</a>
```
### Session存儲方式
如果有部署了多個服務器,那么 session_id 不能存在文件中,而是通過`session_set_save_handler`設置 存入`MYSQL、 Memcache、 Redis` 中
[php 官網有存儲在sql 中的類實現方法](http://php.net/manual/zh/function.session-set-save-handler.php)
## 常用設計模式
常見設計模式:工廠模式、單例模式、注冊樹模式、適配器模式
觀察者模式和策略模式
## 字符串的定義方式
1. 單引號
2. 雙引號
3. heredoc 類似雙引號
```
$str = <<<EoT
...
EoT
```
5. newdoc 類似單引號
```
$str = <<<'EoT'
...
'EoT'
```
## 知識點延伸
### 浮點數不能進行比較運算
浮點轉為 cpu 會損耗,
```
$a=0.8;
$b=0.1;
if ($a+$b==0.8){
echo $a+$b;
}
```
### 布爾類型
FALSE的七種情況
整型0、浮點00、布爾 false、空字符串、0字符串、空數組、NULL
### 數組類型
### 超全局數組
`$GLOBALS、$_GET、$_POST、$_REQUEST、$_SESSION、
$_COOKIE、$_SERVER、$_FILES、$_ENV`
$GLOBALS:包含所有已上所有元素
```
$_SERVER['SERVER_ADDR′] //獲取服務器的 ip
$_SERVER['REMOTE_ADDR'] //用戶 ip
$_SERVER['SERVER_NAME'] //獲取服務器的域名 www.example.com
$_SERVER[ REQUEST_TIME'] //請求時間
$_SERVER['QUERY_STRING'] //?后的參數 $_GET 參數
$_SERVER['HTTP_REFERER'] //從哪一頁進來
$_SERVER['HTTP_USER_AGENT'] //瀏覽器信息
$_SERVER['REQUEST_URI'] // 域名后的所有信息 /demo/index.php?name=cpj&age=12
$_SERVER['PATH_INFO'] // 網址路徑信息 ,一般用于路由
```
### 三種情況 為NULL
直接賦值為NULL、未定義的變量、 unset銷毀的變量
### 常量
const、 define
const更快,是語言結構, define是函數
const 可以在類中定義常量,define 不行
### 優先級
`遞增減 > ! > 算數運算符 > 大小比較 > (不)相等比較 > 引用 > 位運算符(^) > 位運算符(|) > 邏輯與 > 邏輯或 > 三目運算 > 賦值 > and > xor > or
`
短路作用:|| 和 && 與 and 和 or 的優先級不同;
```
//短路作用
$a = true || $b == 3; // $b 不會執行; 相當于$a =( true || $b == 3);
$b = false && $a == 1; // $b 為false 此表達式不會執行
//優先級問題:
$a = false || true; // $a = true;
$b = false or true; // $b = false,整體是true;
```
真題
```php
$a = 0;
$b = 0;
if($a = 3 > 0 || $b = 3 > 0){ //短路 $a=((3>0)||$b=3>0) 執行3>0后就短路,所以$ a=true
$a++;
$b++;
echo $a; //$a = 1 (true);
echo $b; //$b = 1;
}
```
## 流程控制
### if與 elseif
把 if 范圍小的放前面
### switch ...case
控制表達式只能是 整型,浮點型和字符串
continue語句作用到 switch的作用類似于 break
### break
break 的數字代表跳出幾次循環
```
for ($i = 0; $i < 3; $i++){
echo '外層循環'.$i.' 開始'."\n";
for ($j = 0; $j < 2; $j++){
if ($i == 1){
break 2; //使用break 2直接跳出2層循環
}
echo '內層循環'.$i.'-'.$j."\n";
}
echo '外層循環'.$i.' 結束'."\n";
}
```
## 函數
## 函數引用
從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用引用運算符`&`
```
function myFunc(){
static $b= 10;
return $b;
}
$a = myFunc();
$a = & myFunc(); //$a 與$ b 互為應用
$a = 100;
echo myFunc(); //100
```
### 打印函數
```
//打印一個字符串
print()
//打印一個或多個字符串
echo()
//格式化輸出
$num = 2.12;
$d='123a';
printf("%.1f---%d",$num,$d); //2.1---123
//返回格式化值
$num = 2.12;
$d='123a';
echo sprintf("%.1f---%d",$num,$d); //2.1---123
```
## 正則
```
正則表達式的作用:分割、查找、匹配、替換字符串
分隔符:正斜線(/)、hash符號(#) 以及取反符號(~)
通用原子:\d、\D、\w、\W、\s、\S
元字符: * ? A $ + {n } {n,} {n,m} [] () [^]| [-]
模式修正符: i m e s U x A D u
```
后向引用
```php
$str='<b>abc</b>';
Pattern= '/<b>(.*)<\/b>/';
preg_replace($pattern, '\\1', $str);
```
貪婪模式

用`.*?` 取消貪婪模式

用 `U`取消貪婪
`$pattern = '/<b>.*</b>/U'`
常用函數
```
preg_match(),
preg_match_all(),
Preg_replace(),
preg_split()
```
中文匹配
UTF-8漢字編碼范圍是`0x4e00-0x9fa5`,
ANSI(gb2312)環境下,`0xb0-0xf7`,`0xa1-0xfe`
UTF-8要使用u模式修正符使模式字符串被當成UTF-8,
ANSI(gb2312)環境下,要使用chr將Asc碼轉換為字符
```
$str='中文'
Pattern ='/[\xt{4e001-\x{t9fa5}]+/u';
```
匹配 img 的 src 值
```php
$str='<img alt="測試" id="aaa" src="aaa.jpg" />';
$pattern='/<img. *?src="(.*?).*?\/?>/i' // .*? 為取消貪婪
Preg_match( $Pattern, $str, $match);
```
## 文件操作
### 文件讀取,寫入
```
模式 描述
r 打開文件為只讀。文件指針在文件的開頭開始。
w 打開文件為只寫。刪除文件的內容或創建一個新的文件,如果它不存在。文件指針在文件的開頭開始。
a 打開文件為只寫。文件中的現有數據會被保留。文件指針在文件結尾開始。創建新的文件,如果文件不存在。
x 創建新文件為只寫。返回 FALSE 和錯誤,如果文件已存在。
r+ 打開文件為讀/寫、文件指針在文件開頭開始。
w+ 打開文件為讀/寫。刪除文件內容或創建新文件,如果它不存在。文件指針在文件開頭開始。
a+ 打開文件為讀/寫。文件中已有的數據會被保留。文件指針在文件結尾開始。創建新文件,如果它不存在。
x+ 創建新文件為讀/寫。返回 FALSE 和錯誤,如果文件已存在。
```
打開
`fopen("webdictionary.txt", "r")`
讀取
```
fread() 讀取文件
fgets() 讀取一行
fgetc() 讀取一個字符
```
關閉
`fclose()`
file_get_content() 與 file_put_content() 性能更好
其他
```
file() 以數組形式讀取字符串
```
### 目錄操作函數
```
名稱相關: basename()、 dirname()、 patino()
目錄讀取: opendir()、 readdir()、 closedir()、 rewinder()
目錄刪除: rmdir() //只有目錄中沒有文件,才可以刪除
目錄創建: mkdir()
```
### 其他函數
```
文件大小: filesize() //目錄文件大小,需要遍歷每個文件
目錄大小: disk_free_space() //磁盤可用空間、 disk_total_space() //總磁盤空間
文件拷貝:copy()
刪除文件: unlink()
文件類型: filetype()
重命名文件或者目錄: rename()
文件截取: truncate()
文件屬性: file_exists()、 is_readable()、 is_writable()、
is_executable()、 filectime()、 fileatime()、 fillemtime()
```
考題范圍
文件操作模式,目錄的遍歷,目錄的刪除
```
//在文件開頭寫入 hello word
$path = 'demo.txt';
$handle = fopen($path, 'r');
$content = fread($handle, filesize($path));
$content = "hello word" . $content;
fclose($handle);
//寫入
$handle = fopen($path, 'w');
fwrite($handle, $content);
fclose($handle);
```
目錄的遍歷
```
function loopdir($dir){
$handle = opendir($dir);
while(false!==($file=readdir($handle))){
if ($file !=='.' && $file!=='.'){
echo $file."\n";
if (filetype($dir.'/'.$file)=='dir'){
loopdir($dir.'.'.$file);
}
}
}
}
loopdir($dir);
```