PHP中静态类与静态变量的区别及用法详解

蓝鲸
蓝鲸
发布时间:2026-10-14| 4人浏览过
原创

本文深入解析PHP中 static 关键字在类和变量中的不同应用。通过具体代码示例,阐明静态属性与方法无需实例化即可访问的特性,详细说明 self、parent 和类名:: 在不同作用域下的调用规则,并演示静态变量如何在函数递归计数等场景中发挥作用。

结果或目标

理解 PHP 中静态(Static)成员与普通成员的本质区别,掌握如何在不创建对象实例的情况下直接调用类的方法或读取属性,以及利用静态变量实现跨函数调用的状态保持。

准备条件

环境:任何支持 PHP 的执行环境(如本地搭建的 Apache/Nginx + PHP 服务器,或在线 PHP 运行环境)。 工具:文本编辑器或 IDE,用于编写和测试 PHP 代码片段。

真实操作顺序

第1步:定义包含静态成员的类

目的:创建一个基类和一个继承类,其中包含静态属性和静态方法,以便演示访问权限和继承关系。 动作:声明一个 Person 类,定义公共静态属性 $country 和公共静态方法 myCountry()。接着定义子类 Student 继承自 Person。 参数示例:

<?php
class Person {
    // 定义静态成员属性
    public static $country = "中国";

    // 定义静态成员方法
    public static function myCountry() {
        // 内部访问静态成员属性
        echo "我是" . self::$country . "人<br />";
    }
}

class Student extends Person {
    // 非静态方法中访问父类静态成员
    function study() {
        echo "我是" . parent::$country . "人<br />";
    }
}

第2步:通过类名直接访问静态成员

目的:验证静态成员不属于任何特定对象实例,而是属于类本身,可直接通过类名调用。 入口:脚本执行开始处。 动作:使用 类名::属性名 或 类名::方法名() 格式进行访问。 重要参数:确保属性/方法可见性为 public(否则需考虑保护/私有逻辑,此处以公开为例)。

// 输出成员属性值
echo Person::$country . "<br />"; // 输出:中国

// 访问静态成员方法
Person::myCountry();   // 输出:我是中国人

// 子类同样可以访问继承的静态属性
echo Student::$country . "<br />"; // 输出:中国

第3步:通过对象实例访问静态方法

目的:明确虽然推荐用类名调用静态成员,但 PHP 允许通过已实例化的对象间接调用静态方法(不推荐,易混淆意图)。 动作:实例化 Person 后,使用 > 运算符调用其静态方法。 注意:不能通过对象访问静态属性,以下写法是错误的:

$p1 = new Person();
// echo $p1->country; // 错误!静态属性不能通过对象访问
$p1->myCountry();     // 合法但语义不佳,输出:我是中国人

第4步:区分 self、parent 和类名的使用场景

目的:理清在类内部、子类内部和外部访问静态成员的正确语法标识。 动作:根据上下文选择正确的作用域解析操作符。 关键点:

  • 类内部访问自身:使用 self::(不是 $self)。
  • 子类访问父类:使用 parent::(不是 $parent)。
  • 外部全局访问:直接使用 ClassName::。

示例代码结构如下:

// 内部自我引用
self::$country 
self::myCountry()

// 子引用父
class Student extends Person {
    function study() {
        parent::$country;
        parent::myCountry();
    }
}

// 外部引用
Person::$country
Person::myCountry()
Student::$country

第5步:理解静态变量的作用域与生命周期

目的:掌握普通函数中 static 变量的特性——仅初始化一次,且在整个脚本执行期间保留数值。 动作:在函数内部声明 static 变量,观察多次调用时的累积效果。 限制:静态变量只能被赋予标量值或常量,不能使用表达式(如 1+2 或函数返回值)作为初始值。

<?php
function foo() {
    static $int = 0; // 正确
    // static $int = 1+2; // 错误,解析器不支持表达式
    // static $int = sqrt(121); // 错误

    $int++;
    echo $int;
}
?>

第6步:利用静态变量处理递归函数

目的:展示静态变量如何在递归调用中充当计数器,避免无限递归或状态丢失。 动作:在递归函数中使用 static 变量记录深度或次数,并在适当时机递减以恢复状态(如需)。

<?php
function Test() {
    static $count = 0;

    $count++;
    echo $count;

    if ($count < 10) {
        Test(); // 递归调用
    }

    $count--; // 回溯时减少计数
}
?>

每次调用 Test(),$count 都会从上次停止的值继续增加,直到满足终止条件。这证明了静态变量在非对象上下文中也能保持持久状态。

完成判断

当能够通过 类名:: 成功访问类的静态属性和方法,且在子类中使用 parent:: 正确引用父类静态成员时,即表示理解了静态类的用法。 当能够正确在函数内部使用 static 声明变量,并观察到其在多次函数调用中保留上一次的值时,即掌握了静态变量的核心特性。

简要总结

静态类与静态变量是 PHP 面向对象编程中的重要概念。静态成员属于类而非对象,因此无需实例化即可访问,这提高了代码效率并简化了设计模式(如单例、工厂)。在使用时,务必分清 self::(当前类)、parent::(父类)和 类名::(外部类)的区别。此外,静态变量在函数内提供了一种独特的内存共享机制,特别适用于需要跨调用保持状态的递归或计数器场景。以上就是PHP中静态类与静态变量用法区别分析的详细内容,更多关于PHP面向对象编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。