【问题标题】:PHP - when to use private static properties in the classPHP - 何时在类中使用私有静态属性
【发布时间】:2017-08-24 04:08:45
【问题描述】:

我正在学习 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,我们会这样做,因为我认为我们将它们设为静态以便在类之外访问它们并将它们设为私有将使这成为不可能。如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 你如何访问静态属性?
  • 如果您需要一个属性只能在类中访问,但也可以从类中的静态上下文访问(例如从静态函数中),那么您可以将其设为private static $variable跨度>
  • 类::$aStaticProp; //按类名
  • @Leff 在 PHP 和许多其他语言中,一个类以两种形式存在。它作为用于制作对象的蓝图存在,也作为单独的对象存在。该单例对象是类“静态上下文”(忽略特定于语言的优化)总是被创建并可供程序使用。

标签: php


【解决方案1】:

当您声明一个普通属性时,对于您为该类创建的每个实例(您使用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++;
    }
}

【讨论】:

  • 私有静态使用的非常好的例子:)
  • 感谢您提供这个很好的例子!让事情更清楚!
  • 如果使用每次实例化类时增加的私有 $counter 有什么区别?
  • @Salam.Msaif 如果 $counter 不是静态的,那么每次实例化类时它不会增加,因为每个实例都有自己的变量并且不知道关于其他人的任何事情。
  • private static $bar = new Bar(); 怎么样?你能不能用同样的方法,例如对所有Foo()s 只使用一个数据库实例?
【解决方案2】:

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 确实设法实现的静态继承,则适用。

【讨论】:

  • private static 只能通过编写self::$bar 在课堂内访问?
  • @Leff 仅在班级内使用,但使用的是 selfstaticA 都没有关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2010-11-27
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多