变量$local声明在test类中,仅test内部函数可以访问
每次调用都会创建新的变量
function test() {
$local = "局部变量";
echo $local; // 正常输出}test();
}
test();
echo $local; // 报错:未定义变量
创建者:PHP 解释器(函数栈帧)
创建时机:函数调用时
存储位置:函数调用栈
销毁时机:函数执行结束
底层结构:zend_execute_data.locals
在函数外声明的变量
函数内无法直接访问,需用 global 或 $GLOBALS
$global = "全局变量";
function showGlobal() {
global $global; // 方法1:global声明
echo $global; // 输出:全局变量
echo $GLOBALS['global']; // 方法2:超全局数组
}
创建者:PHP 解释器(全局符号表)
创建时机:执行到声明语句时
存储位置:请求级全局内存
销毁时机:脚本执行结束
底层结构:EG(symbol_table)
用 static 声明,函数执行后保留值
常用于计数器/缓存
function counter() {
static $count = 0;
$count++;
echo $count;
}
counter(); // 1
counter(); // 2(保留上次值)
创建者:使用static关键字去修饰类属性、类方法或者函数内部的变量时,就会创建静态作用域
创建时机:函数第一次被调用时初始化(且只初始化一次)
存储位置:函数结构体内部的静态变量哈希表(`static_variables`)中
销毁时机:脚本执行结束
底层结构:zval 结构体(带 IS_STATIC 标志)存储在函数结构的静态变量表中
类属性通过 $this-> 或 self:: 访问
受访问修饰符控制:
public:全局可访问
protected:类及子类内
private:仅当前类内
class MyClass {
public $public = '公共属性';
private $private = '私有属性';
public function show() {
echo $this->public; // ✓
echo $this->private; // ✓(类内可访问)
}
}
$obj = new MyClass();
echo $obj->public; // ✓echo $obj->private; // ✗ 报错
创建者:对象实例化过程(分配对象内存空间=>初始化属性默认值=>调用构造函数)
$obj = new MyClass(); // ▼ 创建者:new 操作符触发对象实例化
创建时机:对象实例化时
class User {
public $id; // 声明时未创建
private $name; // 声明时未创建
public function __construct($id, $name) {
$this->id = $id; // 实际创建时机
$this->name = $name;
}}
// 实际创建点 $
user = new User(1, "John");
存储位置:对象内存空间
销毁时机:对象销毁时
底层结构:zend_object
| 变量名 | 用途 |
| $GLOBALS | 引入全局作用域变量 |
| $_SERVER | 服务器/执行环境信息 |
| $_GET | get请求参数 |
| $_POST | post请求参数 |
| $_SESSION | 会话缓存 |
| $_COOKIE | cookies数据 |
| $_FILES | 文件上传数据 |
| $_REQUESE | 请求集合 get post cookie 集合 |
函数内部不能直接访问外部变量
全局变量在函数内需要显式声明(global或者$GLOBALS)
静态变量在函数调用中持久化
类的属性必须通过对象的实例化($this->)或静态调用(self::)访问
超全局变量无视作用域规则