Get a static property of an instance

2019-06-14 23:50发布

问题:

If I have an instance in PHP, what's the easiest way to get to a static property ('class variable') of that instance ?

This

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

Sound really overdone. I would expect

$thing::property

or

$thing->property

回答1:

You need to lookup the class name first:

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

$property must be defined as static and public of course.



回答2:

From inside a class instance you can simply use 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"


回答3:

classname::property;

I think that's it.



回答4:

You access them using the double colon (or the T_PAAMAYIM_NEKUDOTAYIM token if you prefer)

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

Variable variables are supported here, too:

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


回答5:

You should understand what the static property means. Static property or method is not for the objects. They are directly used by the class.

you can access them by

Class_name::static_property_name


回答6:

These days, there is a pretty simple, clean way to do this.

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

You can also do this with a property in PHP 7.

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

}

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


回答7:

If you'd rather not

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

because you find its two lines too long, you have other options available:

1. Write a getter

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

Simple and elegant, but you'd have to write a getter for every static variable you're accessing.

2. Write a universal static-getter

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

This will let you access any static, though it's still a bit long-winded.

3. Write a magic method

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

This one allows you instanced access to any static variable as if it were a local variable of the object, but it may be considered an unholy abomination.



回答8:

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