19

如果我在 PHP 中有一个实例,那么获取该实例的静态属性(“类变量”)的最简单方法是什么?

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

听起来真的过分了。我希望

$thing::property

或者

$thing->property

编辑:这是一个老问题。在较新的 PHP 中有更明显的方法可以做到这一点,请在下面搜索。

4

8 回答 8

22

您需要先查找类名:

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

$property 必须定义为static当然public

于 2011-04-11T15:46:07.617 回答
8

从类实例内部,您可以简单地使用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"
于 2014-08-09T02:17:27.783 回答
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.写一个通用的静态getter

<?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;

这允许您对任何静态变量进行实例化访问,就好像它是对象的局部变量一样,但它可能被认为是一种邪恶的可憎之物。

于 2017-12-25T15:13:46.210 回答
1
classname::property;

我想就是这样。

于 2011-04-11T15:45:02.373 回答
1

您可以使用双冒号(如果您愿意,也可以使用T_PAAMAYIM_NEKUDOTAYIM令牌)访问它们

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

这里也支持变量变量:

$class = 'X';
echo $class::$var;
于 2011-04-11T15:45:14.477 回答
1

您应该了解静态属性的含义。静态属性或方法不适用于对象。它们被类直接使用。

您可以通过以下方式访问它们

Class_name::static_property_name
于 2011-04-11T15:46:53.313 回答
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
于 2017-04-21T19:31:38.363 回答
0
class testClass {
    public static $property = "property value";
    public static $property2 = "property value 2";
}
echo testClass::$property;
echo testClass::property2;
于 2011-04-11T15:47:34.177 回答