哪个在PHP,静态变量或私有变量中更好?

Vol*_*ike 14 php variables static private class

我注意到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
Run Code Online (Sandbox Code Playgroud)

要么:

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
Run Code Online (Sandbox Code Playgroud)

Orb*_*ing 15

这就像说哪个房间更好的厨房或浴室,它们都是房间,但它们有不同的功能.

static变量是在多个对象是相同的.

通过private上面声明的实例变量特定于给定对象.

注意,这private是一个访问修饰符,static不是,变量可以是两者.

在您拥有static变量的位置,在函数内,它根本不是类/对象变量,而是传统的函数级static变量,它将在函数的所有调用中单实例化,使其类似于类-level static变量,但只能在其定义的方法中访问.

  • @aharon我刚试过这个,我很确定静态var在多个对象中持续存在. (2认同)
  • 好吧,你每天都学到新东西; Sabeen是正确的,方法*中的静态变量是*跨对象共享的.这必须是一些真正令人困惑的错误的来源!更有理由不使用它; 在一个实例中修改它会神奇地将其更改为另一个实例. (2认同)
  • @El Yobo:在类方法中使用静态变量就是如何在PHP 4中执行静态类变量.它有点笨重,可能是一个意想不到的副作用,但它有效. (2认同)

El *_*obo 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,可以使用Foo::$bar(或self::$bar在类和static::$barPHP 5.3中)访问静态类属性; 静态变量不能并且仅在函数内可见blarg().