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

时间:2014-06-16 08:57:05

标签: 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

存在从班级内部访问成员的其他选项:

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

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

2 个答案:

答案 0 :(得分:1)

很明显,他们都做了不同的事情。

$o->staticVar

这是无效,因为您不能/不应该使用实例属性语法访问 static 属性。

StaticClass::$staticVar

这非常简单地访问特定类的特定静态变量。

$o::$staticVar

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

self::$staticVar

这只能在一个类中使用,并且总是引用它所写的类。如果类引用它,那么在类中使用它而不是StaticClass::$staticVar是个好主意,因为你如果稍后更改类名,不需要担心任何事情。 E.g:

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
    }

}
static::$staticVar

这也只能在一个类中使用,并且与上面的self基本相同,但是使用后期静态绑定解析,因此可能引用子类。

“最佳实践”是有争议的。我会说你应该总是尽可能具体,但不能更多。 $o::$staticVarstatic::$staticVar都允许通过子类改变类,而self::$staticVarStaticClass::$staticVar则不允许。在open/closed principle之后,最好使用前一个更可变的方法来允许扩展。

静态和非静态属性也不应该public不能破坏封装。

另见How Not To Kill Your Testability Using Statics

答案 1 :(得分:0)

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

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