我是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()”调用返回。有什么想法吗?
编辑:到目前为止这两个回复都解决了这个问题,我希望我能“检查”他们两个,谢谢!对于任何有类似问题的未来人员,我会将原始代码留在问题中
答案 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->
以上两种引用实例和类变量的方法都有一种非常不同的语法:
$this
是实例引用变量,使用->
运算符访问任何属性; $
不会对属性名称本身重复,尽管它们出现在声明中(例如private $myprop
)。
self::
与Something::
同义(类名本身);它不引用实例变量,因此前面没有$
。要区分静态变量与类常量(self::MYCONST
)和类方法(self::myMethod()
),它的前缀为$
。
<强>附加强>
也就是说,$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->
不会存储任何内容。