【问题标题】:Protected static member variables受保护的静态成员变量
【发布时间】:2011-05-15 20:46:53
【问题描述】:

我最近一直在处理一些类文件,我注意到成员变量已设置为受保护的静态模式,例如受保护的静态 $_someVar,并像静态::$_someVar 一样访问。

我了解可见性的概念,并且将某些内容设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但我只能在静态方法中访问受保护的静态变量吗?

谢谢

【问题讨论】:

    标签: php static protected static-members


    【解决方案1】:

    如果我理解正确,您所指的是late-static bindings。如果你有这个:

    class A {
       protected static $_foo = 'bar';
    
       protected static function test() {
          echo self::$_foo;
       }
    }
    
    class B extends A {
       protected static $_foo = 'baz';
    }
    
    B::test(); // outputs 'bar'
    

    如果您将self 位更改为:

    echo static::$_foo;
    

    然后做:

    B::test(); // outputs 'baz'
    

    因为self 引用了定义$_foo 的类(A),而static 引用了在运行时调用它的类(B)。

    当然,是的,您可以在静态方法(即:对象上下文)之外访问静态受保护成员,尽管可见性和范围仍然很重要。

    【讨论】:

    • 我认为在这个例子中B类应该是“B类扩展A”。
    • @Nathan:很好的电话(甚至几周后)。固定的。谢谢!
    【解决方案2】:

    静态变量存在于类上,而不是类的实例上。您可以从非静态方法访问它们,调用它们如下:

    self::$_someVar
    

    之所以如此,是因为self 是对当前类的引用,而不是对当前实例的引用(如$this)。

    通过演示的方式:

    <?
    class A {
      protected static $foo = "bar";
    
      public function bar() {
        echo self::$foo;
      }
    }
    
    class B extends A { }
    
    $a = new A();
    $a->bar();
    
    $b = new B();
    $b->bar();
    ?>
    

    输出为barbar。但是,如果您尝试直接访问它:

    echo A::$foo;
    

    那么 PHP 会正确地抱怨你试图访问受保护的成员。

    【讨论】:

    • 好吧,为什么要使用 self 而不是 static?例如。 self::$foo 或 static::$foo
    • 哦,是的,在课堂外尝试时,但我说的是在类方法中访问它时。
    • 如果你定义了 A->foo(),并且它调用了self::$foo,那将返回在 A 中定义的静态 $foo。如果你将 A 子类化为 B 的一部分,那么调用继承 foo(),它会使用来自 A 的 $foo,即使你在 B 上定义它。使用 static::$foo 将使用在 B 上定义的 $foo,如果你这样做了。
    猜你喜欢
    • 2011-09-27
    • 2014-01-30
    • 2016-03-08
    • 2013-11-30
    • 2015-06-30
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多