php:声明静态属性和方法

时间:2011-08-11 09:27:32

标签: php static

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

  

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

为什么示例在打印$ foo :: $ my_static之前实例化类($ foo = new Foo();)? 仅根据上述说明

  print Foo::$my_static

OR

  $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();
?>

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

谢谢。

2 个答案:

答案 0 :(得分:3)

我认为你引用的描述有点不清楚/含糊不清。他们提到$foo->my_static是不可能的。稍后将在本声明中重复:

  

无法使用箭头操作符->通过对象访问静态属性。

但是{p> $foo::$my_static是可能的。对象实例只是代表类名,它并没有真正改变静态属性的使用方式,而且主要是方便的捷径。

答案 1 :(得分:1)

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

通过类名而不是通过类的实例访问静态的原因主要是由于可读性,这就是为什么我建议你这样做。