PHP - 何时在类中使用私有静态属性

时间:2017-03-30 09:54:37

标签: php

我正在学习php,而且语言中还有很多不清楚的地方。我想知道我们何时以及为什么要在课堂上使用private static properties。根据我的理解,私有属性只能由定义它的类访问。因此,私有部分很清楚,但静态仍然不清楚。在文档中它说:

  

将类属性或方法声明为静态可使它们可访问   无需实例化类。声明为的财产   无法使用实例化的类对象访问static(尽管是   静态方法可以)。

这是否意味着我可以在不实例化类的情况下访问静态属性。所以,例如:

class Foo{

    static $bar;

    public function __construct($bar){
        $this->bar = $bar;
    }

那么,我可以这样访问该类的$ bar属性吗?

Foo::$bar

但是,如果我这样做,它就不会起作用了吗?

$foo = new Foo();
$foo::$bar

然后,如果确实创建了一个属性private static,我们会这样做,因为我认为我们将它们设置为静态以便在类之外访问它们并将它们设为私有将使这变得不可能。如果有人能清楚这一点,我将非常感激。

2 个答案:

答案 0 :(得分:9)

当您声明普通属性时,您为该类创建的每个实例(使用new Foo创建的每个对象)都有该属性的不同值。对于静态属性,整个类都有一个该变量的副本。

这与该变量的可见性是分开的 - 每个类都有一个公共静态属性,可以从任何地方访问;每个类只存在一次私有静态属性,但只能从该类的定义中访问。

作为一个简单的例子,你可以有一个计数器,给每个类的实例一个唯一的数字。您不需要在类外部查看或更改此计数器的代码,因此您将其标记为私有,但需要在所有实例之间共享,因此您将其标记为静态。

class Foo {
    // Static counter; shared with every instance
    private static $nextID=0;

    // Normal instance property: each instance will have its own value
    private $myID;

    public function __construct() {
        // Set the ID for this instance to the next ID
        $this->myID = self::$nextID;
        // Increment the shared counter
        self::$nextID++;
    }
}

答案 1 :(得分:1)

PHP类中的静态上下文(但在函数外部)是静态存在的上下文,不需要对象的后备实例。

示例:

class A {
     public $a = 1;
     public static $b = 2;

     public function instanceFunction() {
           A::$a; //Wrong way
           $this->a //Right way
           A::$b; //Works
           self::$b; // Also works
           static::$b; // Also also works
     }
     public static function staticFunction() {
           A::$a; //Does not work
           $this->a //Error $this within static context 
           A::$b; //Works
           self::$b; // Also works
           static::$b; // Also also works
     }

}

A::$a; // Error $a is not static so it needs an instance of an object
A::$b; // Works
$Aobject=new A();
$Aobject->a; //Works 
$Aobject->b // Does not work 

使用self表示"请参阅我在"中写过的课程。例如在这种情况下,它总是A。使用static表示"请参阅我称之为"的课程。如果涉及静态继承,PHP确实可以实现这一点,则适用。