参考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();
?>
上面的例子没有给出任何错误。 使用实例化的类对象访问静态方法是一个好习惯吗?
谢谢。答案 0 :(得分:3)
我认为你引用的描述有点不清楚/含糊不清。他们提到$foo->my_static
是不可能的。稍后将在本声明中重复:
但是{p>无法使用箭头操作符
->
通过对象访问静态属性。
$foo::$my_static
是可能的。对象实例只是代表类名,它并没有真正改变静态属性的使用方式,而且主要是方便的捷径。
答案 1 :(得分:1)
在几乎所有OO编程语言中,您都可以通过类的实例访问静态成员。 C ++允许这样,Java允许这样做(虽然它给出了警告)。
通过类名而不是通过类的实例访问静态的原因主要是由于可读性,这就是为什么我建议你这样做。