将静态var分配给非静态var,返回不起作用的值的方法

时间:2012-12-20 03:37:01

标签: php static-variables

我是PHP的新手并使用静态变量练习。我决定抓住一个我从C ++学到的例子并重新编写它用于PHP(例如this article的底部)。

有一个类有两个私有变量(一个静态),一个构造函数和一个get-method。构造函数将静态变量的值分配给第二个私有变量,然后递增。

<?php
class Something
{
    private static $s_nIDGenerator = 1;
    private $m_nID;

    public function Something() { 
       $m_nID = self::$s_nIDGenerator++;
       echo "m_nID: " . $m_nID . "</br>"; //for testing, can comment this out
    }
    public function GetID() {
        return $m_nID;
    }

}

// extra question:
// static variable can be assigned a value outside the class in C++, why not in PHP?
// Something::$s_nIDGenerator = 1; 

    $cFirst = new Something();
    $cSecond = new Something();
    $cThird = new Something();

    echo $cFirst->GetID() . "</br>";
    echo $cSecond->GetID() . "</br>";
    echo $cThird->GetID() . "</br>";
?>

使用第9行中的echo测试来查看m_nID是否得到一个我看到的值:

m_nID: 1
m_nID: 2
m_nID: 3

但是这些值由“ - &gt; GetID()”调用返回。有什么想法吗?

编辑:到目前为止这两个回复都解决了这个问题,我希望我能“检查”他们两个,谢谢!对于任何有类似问题的未来人员,我会将原始代码留在问题中

2 个答案:

答案 0 :(得分:9)

你在C ++方面的背景导致了这个问题,这是一个容易犯的错误。在PHP中,所有实例(或对象)变量都使用$this->引用,静态(或类)变量引用self::。根据您的代码:

public function GetID() {
    return $m_nID;
}

对私有变量$m_nID的访问应限定如下:

public function GetID() {
    return $this->m_nID;
}

在构造函数中:

$m_nID = self::$s_nIDGenerator++;

应该是:

$this->m_nID = self::$s_nIDGenerator++;

Q&amp; A

  

使用$

时,为什么在m_nID之前无需放置$this->

以上两种引用实例和类变量的方法都有一种非常不同的语法:

  1. $this是实例引用变量,使用->运算符访问任何属性; $不会对属性名称本身重复,尽管它们出现在声明中(例如private $myprop)。

  2. self::Something::同义(类名本身);它不引用实例变量,因此前面没有$。要区分静态变量与类常量(self::MYCONST)和类方法(self::myMethod()),它的前缀为$

  3. <强>附加

    也就是说,$this->$myvar也被接受并且这样工作:

    private $foo = 'hello world';
    
    function test()
    {
        $myvar = 'foo';
        echo $this->$foo; // echoes 'hello world'
    }
    

答案 1 :(得分:2)

class Something{
    private static $s_nIDGenerator = 1;
    private $m_nID;

    public function Something() { 
       $this->m_nID = self::$s_nIDGenerator++;
    }
    public function GetID() {
        return $this->m_nID;
    }

}

有趣的是要注意在静态变量上使用self::$s_nIDGenerator与在静态变量上使用$this->s_nIDGenerator之间的区别,而$this->不会存储任何内容。