Получить статическое свойство экземпляра

Если у меня есть экземпляр в PHP, какой самый простой способ получить статическое свойство («переменная класса») этого экземпляра?

Этот

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

Звук действительно преувеличен. я бы ожидал

$thing::property

or

$thing->property

РЕДАКТИРОВАТЬ: это старый вопрос. Есть более очевидные способы сделать это в новом PHP, ищите ниже.


person commonpike    schedule 11.04.2011    source источник


Ответы (7)


Сначала вам нужно найти имя класса:

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

Конечно, $property должно быть определено как static и public.

person halfdan    schedule 11.04.2011
comment
Подтвердил, что работает, php 5.3.0› ... все еще немного перестарался, но я думаю, что это самое короткое. Благодарность ! - person commonpike; 11.04.2011
comment
Нет, начиная с PHP 5.3.0 можно ссылаться на класс с помощью переменной. - person commonpike; 21.04.2011

Изнутри экземпляра класса вы можете просто использовать 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"
person appcropolis    schedule 09.08.2014

Если вы не хотите

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

поскольку вы находите его две строки слишком длинными, у вас есть другие доступные варианты:

1. Напишите геттер

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

Просто и элегантно, но вам придется написать геттер для каждой статической переменной, к которой вы обращаетесь.

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;

Это позволяет вам инстансировать доступ к любой статической переменной, как если бы это была локальная переменная объекта, но это может считаться нечестивой мерзостью.

person Sinus the Tentacular    schedule 25.12.2017
comment
О, и не забудьте использовать static::$$staticname, если вы расширяете этот класс и хотите использовать статику подкласса, а не родителя. - person Sinus the Tentacular; 25.12.2017

classname::property;

Я думаю, это все.

person preinheimer    schedule 11.04.2011

Доступ к ним осуществляется с помощью двойного двоеточия (или T_PAAMAYIM_NEKUDOTAYIM токена, если вы предпочитаете).

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

Здесь также поддерживаются переменные:

$class = 'X';
echo $class::$var;
person soulmerge    schedule 11.04.2011

Вы должны понимать, что означает статическое свойство. Статическое свойство или метод не для объектов. Они непосредственно используются классом.

вы можете получить к ним доступ,

Class_name::static_property_name
person Shakti Singh    schedule 11.04.2011
comment
Статическое свойство является свойством класса и, следовательно, значимой информацией для всех экземпляров.. на всех языках, кроме php :-) - person commonpike; 21.04.2011
comment
@pike: это правда, но они не связаны с каким-либо конкретным экземпляром. - person Shakti Singh; 21.04.2011

В наши дни есть довольно простой и чистый способ сделать это.

<?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
person smcjones    schedule 21.04.2017