【问题标题】:php: declaring static properties and methodsphp:声明静态属性和方法
【发布时间】:2011-10-24 19:33:24
【问题描述】:

参考http://php.net/manual/en/language.oop5.static.php

将类属性或方法声明为静态使它们无需实例化即可访问。声明为静态的属性不能用实例化的类对象访问(尽管静态方法可以)。

为什么示例在打印 $foo::$my_static 之前实例化类 ($foo = new Foo();)? 只按上面的说法

  print Foo::$my_static

  $classname = 'Foo';
  print $classname::$my_static 

是正确的。

example1.php

     public function staticValue() {
     return self::$my_static;
     }
 }

  class Bar extends Foo
 {
    public function fooStatic() {
    return parent::$my_static;
  }
}


 print Foo::$my_static . "\n";

 $foo = new Foo();
 print $foo::$my_static . "\n";
 $classname = 'Foo';
 print $classname::$my_static . "\n"; // As of PHP 5.3.0

     ?> 

example2.php

<?php
   class Foo{
        static $myVar="foo";
        public static function aStaticMethod(){
    return self::$myVar;
}
  }

 $foo=new Foo;
 print $foo->aStaticMethod();
?>

上面的例子没有给出任何错误。 使用实例化的类对象访问静态方法是一种好习惯吗?

谢谢。

【问题讨论】:

    标签: php static


    【解决方案1】:

    我认为您引用的描述有点不清楚/模棱两可。他们提到$foo-&gt;my_static 是不可能的。稍后在此声明中重复这一点:

    无法使用箭头运算符-&gt;通过对象访问静态属性。

    $foo::$my_static 是可能的。对象实例只是代表类名,它并没有真正改变静态属性的使用方式,主要是一种方便的快捷方式。

    【讨论】:

    • 也许有人应该针对此处的文档提交错误报告。
    • 我完全对 php.net 的声明感到困惑。我可以坚持使用 Foo::$my_static ,因为“静态属性和方法无需实例化即可访问”?或者如果 stmt 不正确,我应该坚持 $foo=new Foo (类的实例); $foo::$my_static?哪个最好?
    • @vaan 您不需要实例化对象来访问类的静态属性。只需使用Foo::$my_static。只有当你碰巧有一个对象时,你可以使用$foo::$my_static作为(有时)方便的快捷方式。
    • 好的,非常感谢。我会坚持你的建议 deceze。静态方法呢,使用实例化的类对象访问静态方法是否是一种好习惯,如我的问题示例 2 所示?
    【解决方案2】:

    在几乎所有 OO 编程语言中,您都可以通过类的实例访问静态成员。 C++ 允许这样做,Java 允许这样做(尽管它会给出警告)。

    之所以通过类名而不是类的实例来访问静态,主要是因为可读性,这也是我建议你这样做的原因。

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2015-02-24
      • 2017-03-23
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多