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

Posted

技术标签:

【中文标题】PHP,静态变量或私有变量哪个更好?【英文标题】:Which is better in PHP, Static Variable or Private Variable? 【发布时间】:2011-08-28 11:39:26 【问题描述】:

我注意到 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

【问题讨论】:

在你的第一个例子中它不应该说 $this->_myvar 而不是 $_myvar? “私人”部分没有区别;公共和受保护的类属性也存在相同的行为。 @El Yobo,对,但是拥有公共变量的访问器会很愚蠢。 :) @bumperbox - 我的错 - 错字。谢谢!我会编辑。 这很愚蠢,是的 :) 我只是指出“私人”不会改变这里的行为。例如,有一个受保护变量的访问器是有意义的;但无论是否有意义,行为都是一样的。 【参考方案1】:

这就像说厨房和浴室哪个房间更好,它们都是房间,但功能不同。

一个static变量在多个对象中是相同的。

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

注意private是访问修饰符,static不是,变量可以是两者。

在你有 static 变量的位置,在函数中,它根本不是一个类/对象变量,而是一个传统的函数级 static 变量,它将在所有调用中都是单实例的该函数,使其类似于类级别的static 变量,但只能在定义它的方法内访问。

【讨论】:

我认为您在这里将静态类属性与静态变量混淆了; PHP 使用相同的修饰符,但行为完全不同。 @aharon 我刚试过这个,我很确定静态变量会在多个对象中持续存在。 嗯,你每天都会学到新东西; Sabeen 是正确的,方法 中的静态变量在对象之间共享。这一定是一些真正令人困惑的错误的根源!更有理由不使用它;在一个实例中修改它会神奇地在另一个实例中更改它。 @El Yobo:在类方法中使用静态变量是您在 PHP 4 中使用静态类变量的方式。这有点笨拙,可能还有意想不到的副作用,但它确实有效。 我在 PHP4 中突破了 OO 的界限。 :-) 实例方法具有静态变量是完全合法的,因为它们是使用一种带有隐藏的第一个参数的名称修饰来实现的。如果它从未引用过$this,您可以 静态调用这样的方法 (class::func())。就像我说的,笨重。但它奏效了。【参考方案2】:

两者都不是“更好”。这就像问螺丝刀是否比榫锯更好。

您的第一个示例中的私有变量将仅可用于该类的该实例(尽管仅可用于其方法)。创建一个新实例,该变量可以并且将具有不同的值。

第二个示例中的静态变量将可用于该类的所有实例,不可否认,仅在该方法中。但是设置一个实例,第二个实例将看到相同的值。

【讨论】:

【参考方案3】:

使用类属性(无论是公共的、私有的还是受保护的),类的其他部分都可以访问该变量。

使用静态变量,它只对类的该方法可见。

我建议使用类属性(但可能不是私有的,我通常不会发现它有太多用处;受保护通常是一个更好的主意),因为以后测试更容易;你不能做任何事情来取消、改变或检查静态变量。

我在 static variablesstatic class properties 之间的其他答案中看到了一些可能的混淆。 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()内可见。

【讨论】:

我意识到这是一个奇怪的问题。您必须查看我正在使用的代码才能实现上下文。但是您让我意识到,是的,静态变量只能由类方法访问。实际上,无论如何,只有一个类方法需要访问该变量。在这个项目的代码的另一部分中,我有 - 使用私有(现在受保护)var 是有意义的,因为需要多个类方法来访问它。 另请参阅下面 Orbling 的评论,该评论提供了有关对象方法中静态变量的奇怪(而且在我看来,非常不受欢迎)行为的更多详细信息。

以上是关于PHP,静态变量或私有变量哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

在类中使用私有静态变量是否合适?

js:私有变量和静态私有变量 | 访问私有属性

PHP 安全性:将连接详细信息存储在常量或私有属性中?

PHP使用中的私有方法和变量[重复]

公共静态变量和私有静态变量之间的区别

c++中关于私有静态变量的问题