You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8.1静态类作用域是否变更?get_class_vars行为异常求解

PHP 8.1+与旧版本中get_class_vars()行为差异原因解析

这段代码在PHP 8.1及以上版本和旧版本(如8.0.11)的运行结果存在明显差异,核心原因是PHP 8.1对get_class_vars()函数的行为做了关键调整。

测试代码

<?php

class test {

    /**
     * 类中的私有静态测试变量
     * @var int $var
     */
    private static int $var;

    /**
     * 为私有静态变量赋值的方法
     * @param int $var
     */
    public static function setVar(int $var): void
    {
        self::$var = $var;
    }

    public static function getVar()
    {
        $vars = get_class_vars(__CLASS__);
        echo '<pre>' . print_r($vars, 1) . '</pre>';
    }

}

test::setVar(2);
test::getVar();
test::setVar(3);
test::getVar();

不同版本运行结果

PHP 8.0.11 运行结果

Array
(
    [var] => 2
)

Array
(
    [var] => 3
)

PHP 8.1.6 运行结果

Array
(
    [var] => 
)

Array
(
    [var] => 
)

差异原因

  • 在PHP 8.0及更早版本中,get_class_vars()会返回类中所有静态属性(包括私有属性)的当前实际值,哪怕是私有属性,在类内部调用该函数也能正确获取赋值后的结果。
  • 从PHP 8.1开始,get_class_vars()的行为被修改为仅返回属性的默认初始化值,而非当前运行时的实际值。你的代码中private static int $var没有显式设置默认值,虽然有int类型声明,但未初始化的类型化静态属性在PHP 8.1+中会被视为默认值未设置,所以输出为空。

如果要在PHP 8.1+中获取私有静态属性的当前值,直接访问属性本身即可,无需使用get_class_vars(),比如修改getVar()方法:

public static function getVar()
{
    echo '<pre>' . print_r(['var' => self::$var], 1) . '</pre>';
}

内容的提问来源于stack exchange,提问作者Morteza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:45:28