Php 为什么静态属性不能通过->;但是静态函数是可访问的吗?

Php 为什么静态属性不能通过->;但是静态函数是可访问的吗?,php,class,oop,static,static-methods,Php,Class,Oop,Static,Static Methods,我有下面的代码 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

我有下面的代码

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

----------------
class-MyClass
{
公共静态$count=0;
公共静态函数plusOne()
{
返回“计数为”。++self::$count。“
”; } } $obj=新的MyClass; $obj->plusOne()//适用于静态功能 回显“
”。MyClass::$count;//计数:1 MyClass::plusOne()//适用于静态功能 回显“
”。MyClass::$count;//计数:2 ----输出------ 1. 2. ----------------
  • 通过创建对象(使用->)和范围解析操作符(使用::)方法,我可以访问静态方法 但当我试图通过作用域解析(使用::)使用静态属性时,它显示通知不起作用。下面是附加代码

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

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

  • 为什么静态属性(仅限:)和方法(按->,:)的访问规则不同


  • 在您的示例中,它看起来很奇怪,但是想象一下如果您也有

    class MyOtherClass
    {
        public $count = 0;
    
        public function plusOne()
        {
            return "The other count is " . ++$this->count . ".<br />";
        }
    }
    
    您可以这样做,无论$obj是MyClass还是MyTherClass,它都会工作。在这一点上,实现细节并不重要,除非您已经知道它们-例如,您可以使用MyClass::plusOne(),而无需实例化它,因为您知道这是一个静态方法


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

    当您将类实例化为对象时,可以使用
    ->
    是您希望通过
    静态调用某个对象的时间。您无法访问
    ->$count
    ,因为它是类成员,您可以在未实例化时通过
    访问。可能重复@lolka\u bolka:谢谢。在第二季度,我使用了不同的方法2(即->,:),但最后计数增加。第一次使用$obj->plusOne(),第二次直接使用MyClass::plusOne(),有什么想法吗?@Darhazer:谢谢。我通过你的链接得到了我的Q1答案。你能帮我解决第二季度的问题吗?正如@lolka_bolka所指出的,使用名称
    ->
    并不意味着它必须是一种非静态方法,它必须是在实例化对象的类中定义的方法。谢谢,但我需要知道为什么访问静态变量和静态函数的区别不是替代代码。当然,代码只是为了说明这一点:当您访问变量的方法时,该变量可能不总是同一个类。它可能有一个类,其中该方法是静态的,也可能有一个类不是静态的。使用->可以在任何情况下调用给定的方法。
    $obj->plusOne();