阶段一:PHP作用域

深度学习计划   2025-07-16 21:50   11   0  

PHP作用域

局部作用域

  • 变量$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服务器/执行环境信息
$_GETget请求参数
$_POSTpost请求参数
$_SESSION会话缓存
$_COOKIEcookies数据
$_FILES文件上传数据
$_REQUESE请求集合 get post cookie 集合

总结

  • 函数内部不能直接访问外部变量

  • 全局变量在函数内需要显式声明(global或者$GLOBALS)

  • 静态变量在函数调用中持久化

  • 类的属性必须通过对象的实例化($this->)或静态调用(self::)访问

  • 超全局变量无视作用域规则

下一篇
没有了
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。