我注意到PHP中有两种方法可以做同样的事情。你能告诉我哪种方式更好的编程实践吗?
在第一个例子中,我在类上使用了一个私有变量。在第二个例子中,我在类方法中使用静态变量。
class Test {
private $_myvar;
public function getVar(){
if (!isset($this->_myvar)) {
$this->_myvar = "test\n";
}
return $this->_myvar;
}
}
$oTest = new Test();
echo $oTest->getVar(); // sets var first time and returns it
echo $oTest->getvar(); // pulls from cache
或者:
class Test {
public function getVar(){
static $myvar;
if (!isset($myvar)) {
$myvar = "test\n";
}
return $myvar;
}
}
$oTest = new Test();
echo $oTest->getVar(); // sets var first time and returns it
echo $oTest->getvar(); // pulls from cache
答案 0 :(得分:15)
这就像说厨房或卫生间哪个房间更好,它们都是房间,但它们有不同的功能。
static
变量在多个对象中是相同的。
通过上面private
声明的实例变量特定于给定对象。
请注意,private
是一个访问修饰符,static
不是,变量可以是两者。
在您拥有static
变量的位置,在函数内,它根本不是类/对象变量,而是传统的函数级static
变量,它将是单实例对函数的所有调用,使其类似于类级static
变量,但只能在其定义的方法中访问。
答案 1 :(得分:9)
使用class属性(可以是public,private或protected),该类的其他部分可以访问该变量。
使用静态变量,它只对该类的方法可见。
我建议使用class属性(但可能不是私有的,我通常没有太多用处;受保护通常是一个更好的主意),因为以后测试更容易;你无法做任何事情来取消,改变或检查静态变量。
我在静态变量和静态类属性之间的其他答案中看到了一些可能的混淆。 PHP使用相同的修饰符,但行为完全不同;一个例子如下。
<?php
class Foo {
// Static class property
public static $bar = 'bar';
public function blarg() {
static $bar;
if (empty($bar)) {
$bar = 'blarg';
}
return $bar;
}
}
在上面的示例中,可以使用Foo::$bar
(或类中的self::$bar
和PHP 5.3中的static::$bar
)访问静态类属性;静态变量不能,只能在函数blarg()
内看到。
答案 2 :(得分:4)
两者都不“更好”。这就像询问螺丝刀是否比榫头锯更好。
第一个示例中的私有变量只能用于该类的实例(尽管只适用于其方法)。创建一个新实例,变量可以并且具有不同的值。
第二个示例中的静态变量将可用于该类的所有实例,只能在该方法中使用。但是设置一个实例,第二个实例将看到相同的值。