【问题标题】:Why does Static member variable inherits the value when instantiatiing object number of times in PHP?为什么静态成员变量在PHP中实例化对象次数时会继承该值?
【发布时间】:2011-06-11 06:19:37
【问题描述】:

我正在测试静态关键字的确切工作原理,但我遇到了这个,我不明白发生了什么。

考虑使用以下代码的两个类ClassNameAClassNameB

没有静态关键字的ClassNameA

class ClassNameA
{
    private $name;

    public function __construct($value) {
        if($value != '') {
            $this->name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo $this->name;
    }
}

ClassNameB 带静态关键字

class ClassNameB
{
    private static $name;

    public function __construct($value) {
        if($value != '') {
            self::$name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo self::$name;
    }
} 

当我使用 ClassNameA 多次实例化对象时

$a = new ClassNameA(12);
echo '<br/>';
$a = new ClassNameA(23);
echo '<br/>';
$a = new ClassNameA(''); //Argument given is Empty here

输出如下

12
23

现在当我使用 ClassNameB 多次实例化对象时

$a = new ClassNameB(12);
echo '<br/>';
$a = new ClassNameB(23);
echo '<br/>';
$a = new ClassNameB(''); //Argument given is Empty here

输出如下

12
23
23

请注意,即使通过的参数为空,它也会占用额外的值 23。这是一个错误吗?还是我错过了什么?

【问题讨论】:

    标签: php oop static


    【解决方案1】:

    这是static 属性的本质。静态属性是类的一种属性,不是对象的属性。

    当你传递空白时,根据条件静态属性的值不会被更新,并且最后一个值仍然存在于静态属性中。

    由于静态属性不与任何对象绑定,因此无需任何对象即可使用。

    $a = new ClassNameB(12); //static property is set to 12
    echo '<br/>';
    $a = new ClassNameB(23); //static property is update to 23
    echo '<br/>';
    $a = new ClassNameB(''); //static property is not updated here it is still 23
    

    编辑

    你可以这样理解:-

    if($value != '') {
        $this->name = $value; //
     }
    

    上面的代码所做的是为当前对象(正在初始化的对象)设置属性值。

    所以当你写的时候

    $a = new ClassNameA(12);
    

    它的作用是将name 属性设置为12 对象a;

    $a = new ClassNameA(23);
    

    它的作用是将name 属性设置为23 对象a;

    但是当属性是static 时,它是针对整个类而不是针对任何对象的。

    所以当你写的时候

    if($value != '') {
        self::$name = $value;
     }
    

    上面的代码是设置静态属性值。请注意,这里您写的是 self 而不是 $this,这使它仅用于此类,而不用于任何对象。

    我试图更好地解释它,但不知道它是如何为你解释的。

    【讨论】:

    • 哦,那是不是意味着静态变量的作用域是全局的?
    • 谢谢你这么好的解释。我确实明白你想说什么。:)
    【解决方案2】:

    静态成员是整个应用程序中的单个实例,而不是每个对象一次。例如

    class Example {
      static public $var;
    
      static public MyFunction() {
        echo "MyFunction\n";
      }
    }
    
    Example::$var = 123;
    echo Example::$var;
    Example::MyFunction();
    

    注意我们不需要创建“Example”的实例,本质上是它的名称间距变量到类。这将是无效的:

    $example = new Example();
    echo $example->var;
    $example->MyFunction();
    

    你也可以在类中引用它

    self::$var
    self::MyFunction();
    

    如果您需要,以后可以安全地重命名该类。但是静态函数不能访问非静态成员或方法。

    【讨论】:

    • 好吧,你的意思是说,一旦我声明它并启动对象,或者如果它已经加载到内存中,它就会变成全局的,我可以在任何地方访问它?
    • 它是全局的,只要它是公共的,就可以在任何地方访问。你也可以有静态方法。
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多