php:声明静态属性和方法

php:声明静态属性和方法,php,static,Php,Static,指 将类属性或方法声明为静态使它们可以访问,而不需要类的实例化。声明为静态的属性不能通过实例化的类对象访问(尽管静态方法可以) 为什么示例在打印$foo::$my_static之前实例化类($foo=new foo();)? 仅根据上述声明 print Foo::$my_static 或 这是正确的 示例1.php public function staticValue() { return self::$my_static; } } class Ba

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

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

  print Foo::$my_static

这是正确的

示例1.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

     ?> 
示例2.php

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

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

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


谢谢。

在几乎所有OO编程语言中,您都可以通过类的实例访问静态成员。C++允许这个,java允许这个(虽然它给出警告)。
通过类名而不是通过类的实例访问静态的原因主要是可读性,这就是为什么我建议您也这样做。

在几乎所有OO编程语言中,您都可以通过类的实例访问静态成员。C++允许这个,java允许这个(虽然它给出警告)。
通过类名而不是通过类实例访问静态的原因主要是可读性,这就是为什么我建议您也这样做。

我认为您引用的描述有点不清楚/不明确。它们指的是
$foo->my_static
不可能。这一点稍后将在本声明中重复:

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


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

我认为您引用的描述有点不清楚/模棱两可。它们指的是
$foo->my_static
不可能。这一点稍后将在本声明中重复:

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


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

也许有人应该根据这里的文档提交一份错误报告。我完全不理解php.net语句。我能坚持使用Foo:$my_static吗?因为“静态属性和方法无需实例化类就可以访问”?或者如果stmt不正确,我应该坚持$foo=newfoo(类的实例)$foo::$my_static?哪一个是最好的?@vaan您不需要实例化对象来访问类的静态属性。只需使用
Foo::$my_static
。只有当你已经有了一个对象,你才可以使用
$foo::$my_static
作为(有时)方便的快捷方式。好的,非常感谢。我将坚持你的建议。关于静态方法,使用实例化的类对象访问静态方法(如我的问题的示例2)是否是一种好的做法?也许有人应该根据这里的文档提交一份错误报告。我完全不理解php.net语句。我能坚持使用Foo:$my_static吗?因为“静态属性和方法无需实例化类就可以访问”?或者如果stmt不正确,我应该坚持$foo=newfoo(类的实例)$foo::$my_static?哪一个是最好的?@vaan您不需要实例化对象来访问类的静态属性。只需使用
Foo::$my_static
。只有当你已经有了一个对象,你才可以使用
$foo::$my_static
作为(有时)方便的快捷方式。好的,非常感谢。我将坚持你的建议。关于静态方法,使用实例化的类对象访问静态方法是否是一个好的实践,如我问题的示例2所示?
<?php
   class Foo{
        static $myVar="foo";
        public static function aStaticMethod(){
    return self::$myVar;
}
  }

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