变量$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::)访问
超全局变量无视作用域规则