在PHP中使用静态成员是否有最佳实践?

在PHP中使用静态成员是否有最佳实践?,php,static,Php,Static,PHP允许使用静态成员函数和变量,因为5.3包括后期静态绑定: class StaticClass { public static $staticVar; ... } $o = new StaticClass(); 目前,有多种选项可以访问这些静态成员: $o->staticVar; // as instance variable/ function $o::staticVar; // as class variable/ function 存在用于从类内部访问

PHP允许使用静态成员函数和变量,因为5.3包括后期静态绑定:

class StaticClass {
    public static $staticVar;

    ...
}

$o = new StaticClass();
目前,有多种选项可以访问这些静态成员:

$o->staticVar;  // as instance variable/ function
$o::staticVar;  // as class variable/ function
存在用于从类内部访问成员的其他选项:

self::$staticVar;   // explicitly showing static usage of variable/ function
static::$staticVar; // allowing late static binding

重组一些使用静态成员的现有类我问自己,在PHP中使用静态成员是否有最佳实践?

很显然,它们都做不同的事情

$o->staticVar
这是无效的,因为您不能/不应该使用实例属性语法访问静态属性

StaticClass::$staticVar
这非常简单地访问特定类上的特定静态变量

$o::$staticVar
这将访问
$o
是其实例的类上的静态变量。它主要用作前一种方法的简写,在所有方面都是等效的。显然,使用哪个类完全取决于
$o
是的实例

self::$staticVar
这只能在类内部使用,并且将始终引用编写它的类。如果类引用自身,最好在类中使用它,而不是在类中使用
StaticClass::$staticVar
,因为如果以后更改类名,则无需担心任何事情。例如:

class Foo {

    protected static $bar = 42;

    public function baz() {
        self::$bar;  // good
        Foo::$bar    // the same, but should be avoided because it repeats the class name
    }

}
这也只能在类内部使用,基本上与上面的
self
相同,但可以通过后期静态绑定解决,因此可以引用子类

什么是“最佳实践”值得商榷。我想说的是,你应该尽可能具体,但不能再具体了
$o::$staticVar
static::$staticVar
都允许类在子类之间变化,而
self:$staticVar
StaticClass:$staticVar
则不允许。接下来,最好使用前一种更可变的方法来允许扩展

属性,包括静态和非静态属性,也不应该是
公共的
,以免破坏封装


另请参见。

首先,不要使用$this->staticVar。我不确定这是什么时候改变的(我相信PHP5.4),但在最近的版本中,不再可能以这种方式检索静态变量


至于使用后期静态绑定,如果不需要就不要使用它。使用它的原因是,如果您计划使用继承,并希望更改派生类中静态变量的值。

不要使用
$o->staticVar
访问静态属性,因为这些天它会发出警告;使用
StaticClass::staticVar从类外部至少这在PHP中是不允许的,尽管它应该调用成员变量上的静态方法:$this->解释器::staticMethod()
static::$staticVar