【问题标题】:Why static properties not accessible by -> but static function accessiable?为什么静态属性无法通过 -> 访问但静态函数可访问?
【发布时间】:2015-01-13 13:22:56
【问题描述】:

我有以下代码

class MyClass
{
    public static $count = 0;

    public static function plusOne()
    {
        return "The count is " . ++self::$count . ".<br />";
    }
}

$obj = new MyClass;
$obj->plusOne(); //Works proper for static function

echo '<br/>'.MyClass::$count; // count: 1

MyClass::plusOne(); //Works proper for static function
echo '<br/>'.MyClass::$count; // count: 2

----OUTPUT------
1
2

----------------
  1. 我可以通过创建对象(使用 ->)和范围解析运算符(使用 ::)访问静态方法 方法正常工作 但是当我尝试通过范围分辨率使用静态属性时(使用 :: )它显示通知不起作用。下面是附加代码。

    $obj->计数; // 注意:未定义的属性:MyClass::$count

  2. 我可以通过创建对象(使用 ->)和范围解析运算符(使用 ::)访问静态方法,但静态属性计数仍然增加,为什么?

  3. 为什么静态属性(仅 :: )和方法(by ->, ::)的访问规则不同?

【问题讨论】:

  • 当您将类实例化为对象时,您可以使用-&gt;:: 是当您想通过 static 调用某些东西时。你不能访问-&gt;$count,因为那是一个类成员,当你没有实例化的时候你可以通过::访问。
  • @lolka_bolka:谢谢。在第二季度,我使用了不同的方法 2(即 ->、 :: ),但最后计数增加了。我第一次使用 $obj->plusOne() 和第二次直接使用 MyClass::plusOne() 有什么想法吗?
  • @Darhazer:谢谢。我通过你的链接得到了我的 Q1 答案。您能否帮我解决 Q2 如何/为什么会发生?
  • 正如@lolka_bolka 指出的那样,使用名称-&gt; 并不意味着它必须是一个非静态方法,它必须是一个在类中定义的方法从中实例化一个对象。

标签: php class oop static static-methods


【解决方案1】:

在你的例子中看起来很奇怪,但想象一下如果你也有

class MyOtherClass
{
    public $count = 0;

    public function plusOne()
    {
        return "The other count is " . ++$this->count . ".<br />";
    }
}

现在如果你想做

$obj->plusOne();

您可以这样做,并且无论 $obj 是 MyClass 还是 MyOtherClass,它都会起作用。在这一点上,实现细节并不重要,除非你已经知道它们——例如。您可以使用 MyClass::plusOne() 而不实例化它,因为您知道这是一个静态方法。

静态变量在声明时始终是静态的。实例上没有数据 - 因此,无论您在更新它时使用什么范围,它都会更新静态计数。

【讨论】:

  • 谢谢 但是我需要知道为什么访问静态变量和静态函数的区别不是替代代码。
  • 当然,代码只是为了说明这一点:当您访问变量上的方法时,该变量可能并不总是同一个类。它可能有一个该方法是静态的类,或者它可能有一个不是静态方法的类。使用 -> 您可以在任何一种情况下调用给定的方法。
猜你喜欢
  • 2012-03-30
  • 2013-02-13
  • 2021-08-29
  • 1970-01-01
  • 2018-04-18
  • 2016-01-28
  • 1970-01-01
  • 2017-09-18
  • 2012-10-30
相关资源
最近更新 更多