# 變量作用域
[TOC]
>[success] 變量作用的范圍(可以被使用的范圍)稱為變量作用域,按作用域,可以將PHP變量分為超全局變量、全局變量和局部變量
局部變量:在函數內部聲明的變量,就是局部變量,當函數執行完畢,**局部變量就消失了**。局部變量,**只能在函數內部使用**。
全局變量:在函數外部聲明的變量,就是全局變量。在PHP中全局變量,**在函數中不能使用**,網頁執行完畢,全局變量消失。
超全局數組變量:系統定義的變量,就是超全局變量。**該變量可以在任何地方直接使用**。
>[info] static靜態變量:使用static修飾符修飾的變量就稱之為靜態變量,在我們變量作用域當中,函數執行完成函數體內的變量自動銷毀,使用了static修飾符,可以把函數執行完成后的變量保留起來,在外部還可以繼續的使用
>[danger] 注意:PHP變量作用域,與JS變量作用不一樣。JS的全局變量可以直接在函數內部使用;而PHP的全局變量在函數內部不能直接使用
## global關鍵字
在變量作用域的情況下,我們在函數體的內部想使用函數體外部的全局變量怎么辦呢?
PHP為我們提供了global關鍵字解決函數內部作用域的問題,從而讓我們可以使用函數體外部的全局變量。
global關鍵字需要注意的事項:
* [ ] global關鍵字,**只能在函數內部申明變量**
* [ ] global關鍵字,**申明時不能賦值,必須申明之后才可以進行賦值操作**
* [ ] global的作用,是引用傳遞地址,將全局變量的地址,傳遞到函數內部
* [ ] global關鍵字,**在函數內部,使用unset()刪除 global引用的變量時,將不會影響到全局變量**
```
<?php
$a = 100;
function get()
{
global $a; # 正確操作
global $a = 200; # 報錯,必須先聲明在賦值
unset($a);# 刪除是引用的值,不會影響函數外部變量
echo $a;# 如果直接使用那么就會報錯,刪除變量后函數體內部打印會報錯
}
get();
```
## 超全局數組變量$GLOBALS
$GLOBALS可以引用全局作用域中可用的全部變量
* [ ] 如果在函數內部,使用unset可以刪除一個全局變量,會影響到全局變量
* [ ] 通過$GLOBALS可以添加一個全局變量
```
<?php
$a = 100;
function get()
{
$GLOBALS['age'] = 22;# 通過GLOBALS可以添加一個全局變量,且在函數體外部可以使用
unset($GLOBALS['a']); # 通過GLOBALS刪除全局變量,會影響到全局變量
$GLOBALS['a'] = 500; # 通過GLOBALS直接申明并賦值不會報錯,是正確的使用
}
get();
echo $age; # 結果為22,GLOBAL可以添加一個全局變量
echo $a; # 結果為500,因為我雖然刪除了開始的a但是又聲明定義了一個全新的a全局變量
```
## global與$GLOBALS的區別
* [ ] global unset變量不會影響全局的變量,而$GLOBALS會影響
* [ ] global 必須先申明再賦值,而$GLOBALS可以直接申明并賦值
>[danger] 以上就是換個寫法都可以做到相同,下面是我百度結果,但是我還是沒太看明白
> 很多人都認為global和$GLOBALS\[\]只是寫法上面的差別,其實不然(我就是這其中的一員),具體的區分我也不太懂,在我的理解里面他們除了寫法上的差別就沒啥區別了。但是這肯定錯誤的,不然網上不會那么人說區別很大。有好的理解歡迎您的留言。
- 基礎
- 安裝PHP
- 語言基礎
- 變量
- 變量操作
- 超全局數組變量
- 變量作用域
- 變量傳值方式
- 常量
- 數據類型
- 運算符
- 流程控制
- 文件包含
- 錯誤處理
- 字符串操作
- 數組
- 函數
- 進階
- 面向對象
- 提高
- TP
- 安裝項目
- 框架基礎知識
- 命令創建模塊
- URL生命周期
- 路由操作
- Request請求類
- 參數綁定
- 依賴注入
- 模板操作
- 查詢操作
- 添加操作
- laravel
- ☆目錄結構
- CSRF攻擊
- ☆路由
- ☆控制器
- ☆請求類
- ☆視圖
- ☆模板繼承
- ☆表單驗證
- ☆DB類
- ☆模型
- ☆數據庫遷移
- 類型、修飾、索引
- ☆數據填充
- ☆數據分頁
- ☆session處理
- ☆中間件
- ☆緩存操作
- ☆文件上傳
- ☆接口操作
- ☆擴展插件
- restful
- 工作
- 工作記錄
- QQ登錄
- 新浪登錄
- 微信登錄
- sphinx搜索
- 數據庫
- MySQL
- ☆數據庫操作
- ☆數據表操作
- ☆數據的操作
- 待修改
- 優化
- 存儲引擎選擇
- 列表類型選擇
- 范式
- 慢日志查詢
- 精準時間記錄查詢
- 計劃任務 explain
- 索引
- 索與事務
- 查詢緩存
- 存儲過程
- 觸發器
- 分區
- 分表
- sphinx
- 讀寫分離
- 搜索優化
- 網站靜態化
- Memcache
- Mongodb
- Readis
- php使用redis
- 服務器
- Linux
- 目錄結構
- 常用命令
- VIM編輯器
- 用戶與用戶組
- 權限管理
- 運行級別
- 網絡模式
- ssh
- 軟件安裝
- 計劃任務
- Ubuntu
- 編譯PHP7.3
- 編譯MySQL
- 編譯Nginx
- apache虛擬機配置
- 安裝composer
- Nginx
- Git