获取实例的静态属性

20
如果我在PHP中有一个实例,那么最简单的方法是什么来访问该实例的静态属性('类变量')?

这个

$classvars=get_class_vars(get_class($thing));
$property=$classvars['property'];

听起来过于繁琐。我会期望

$thing::property
或。
$thing->property

编辑:这是一个旧问题。在新版本的 PHP 中,有更明显的方法来实现这一点,请查看下面。

8个回答

23

首先需要查找类的名称:

$class = get_class($thing);
$class::$property

$property 必须定义为staticpublic


确认,这个可行,PHP 5.3.0以上版本...还是有点过度,但我想这是最短的。谢谢! - commonpike
2
不,"自 PHP 5.3.0 起,可以使用变量引用类"。 - commonpike

10

在类实例内部,你可以简单地使用 self::...

class Person {
  public static $name = 'Joe';
  public function iam() {
    echo 'My name is ' . self::$name;
  }
}

$me = new Person();
$me->iam(); // displays "My name is Joe"

2

如果您不愿意

$class = get_class($instance);
$var = $class::$staticvar;

因为您觉得这两行代码太长了,所以您有其他可选项:

1. 编写一个getter

<?php
class C {
  static $staticvar = "STATIC";
  function getTheStaticVar() {
    return self::$staticvar;
  }
}
$instance = new C();
echo $instance->getTheStaticVar();

这个方案简单而优雅,但你需要为每个静态变量写一个getter函数以便访问。

2. 编写一个通用的静态获取器

<?php
class C {
  static $staticvar = "STATIC";
  function getStatic($staticname) {
    return self::$$staticname;
  }
}
$instance = new C();
echo $instance->getStatic('staticvar');

这将让您访问任何静态内容,但仍然有点冗长。

3. 编写一个魔法方法

class C {
  static $staticvar = "STATIC";
  function __get($staticname) {
    return self::$$staticname;
  }
}
$instance = new C();
echo $instance->staticvar;

这个方法允许你像访问对象的本地变量一样访问任何静态变量,但有人可能认为它是不道德的行为。

哦,还记得如果你继承了这个类并且想要使用子类的静态变量而不是父类的,就要使用 static::$$staticname - Sinus the Tentacular

1
classname::property;

我想这就是了。


1
你应该了解静态属性的含义。静态属性或方法不是针对对象的,它们直接由类使用。
你可以通过以下方式访问它们:
Class_name::static_property_name

4
静态属性是类的属性,因此对于所有实例来说都是有意义的,除了 PHP 这种语言。 - commonpike
@pike:这是真的,但它们没有与任何特定实例绑定。 - Shakti Singh

1

你可以使用双冒号(或者T_PAAMAYIM_NEKUDOTAYIM token,如果你更喜欢的话)来访问它们。

class X {
    public static $var = 13;
}
echo X::$var;

这里也支持变量变量

$class = 'X';
echo $class::$var;

1
这些天,有一种相当简单、干净的方法来实现这个。
<?php
namespace Foo;
class Bar
{
    public static $baz=1;
    //...

    public function __toString()
    {
        return self::class;
    }

}

echo Bar::$baz; // returns 1
$bar = new Bar();
echo $bar::$baz; // returns 1

你也可以通过PHP 7中的一个属性来完成这个操作。

<?php
namespace Foo;
class Bar
{
    public static $baz=1;
    public $class=self::class;
    //...

}

$bar = new Bar();
echo $bar->class::$baz; // returns 1

0
class testClass {
    public static $property = "property value";
    public static $property2 = "property value 2";
}
echo testClass::$property;
echo testClass::property2;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接