1. 静态属性和方法

静态属性

静态属性是属于类本身的属性,而不是某个实例的属性。它们可以通过类名直接访问,而不需要创建类的实例。

class MyClass {
    public static $myStaticVar = 'Hello, World!';
}

echo MyClass::$myStaticVar; // 输出: Hello, World!

静态方法

静态方法是属于类本身的方法,同样不需要创建类的实例即可调用。静态方法内部不能访问类的非静态属性和非静态方法,只能访问静态属性和静态方法。

class MyClass {
    public static function myStaticFunction() {
        echo 'This is a static method.';
    }
}

MyClass::myStaticFunction(); // 输出: This is a static method.

2. 静态绑定(Late Static Binding)

静态绑定允许在静态上下文中访问调用类(即实际运行时的类)。使用static::关键字来实现。

class ParentClass {
    public static function getCalledClass() {
        echo static::class;
    }
}

class ChildClass extends ParentClass {
}

ChildClass::getCalledClass(); // 输出: ChildClass

3. 静态变量在函数中的作用域

在函数或方法中,可以使用static关键字来定义静态局部变量。静态局部变量的生命周期是整个脚本的生命周期,而不是函数调用期间的生命周期。它们会在函数调用结束后保持其值,并在下次函数调用时继续使用这个值。

function myFunction() {
    static $count = 0;
    $count++;
    echo $count;
}

myFunction(); // 输出: 1
myFunction(); // 输出: 2
myFunction(); // 输出: 3

4. 静态内部类(PHP 5.3.0+)

PHP 5.3.0引入了匿名函数和闭包,可以在匿名函数或闭包中使用static关键字来定义静态变量。

$closure = function() {
    static $count = 0;
    $count++;
    echo $count;
};

$closure(); // 输出: 1
$closure(); // 输出: 2
$closure(); // 输出: 3

总结

  • 静态属性和方法:属于类本身,不需要实例化即可访问。
  • 静态绑定:使用static::在继承环境中访问调用类。
  • 静态局部变量:在函数或方法中定义,生命周期是整个脚本期间。
  • 闭包中的静态变量:在匿名函数或闭包中定义静态变量。