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 variables 和 static 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,静态变量或私有变量哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章