参考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();
?>
上面的例子没有给出任何错误。用实例化的类对象访问静态方法是一种好的做法吗?
谢谢。
我认为你引用的描述有点不清楚/模棱两可。它们指的是$foo->my_static
是不可能的。这在后面的语句中重复:
静态属性不能通过对象使用箭头操作符
->
访问。
$foo::$my_static
是可能的。对象实例只是代表类名,它并不真正改变静态属性的使用方式,主要是一个方便的快捷方式。
在几乎所有的OO编程语言中,您都可以通过类的实例访问静态成员。c++允许这样做,Java也允许这样做(尽管会给出警告)。
通过类名而不是通过类的实例访问静态数据的原因主要是由于可读性,这就是为什么我建议您也这样做。