Получить статическое свойство экземпляра - PullRequest
17 голосов
/ 11 апреля 2011

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

Это

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

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

$thing::property

или

$thing->property

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

Ответы [ 8 ]

20 голосов
/ 11 апреля 2011

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

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

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

7 голосов
/ 09 августа 2014

Внутри экземпляра класса вы можете просто использовать 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"
1 голос
/ 25 декабря 2017

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

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

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

1 голос
/ 21 апреля 2017

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

<?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
1 голос
/ 11 апреля 2011

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

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

Class_name::static_property_name
1 голос
/ 11 апреля 2011

Вы получаете к ним доступ, используя двойное двоеточие (или T_PAAMAYIM_NEKUDOTAYIM токен , если хотите)

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

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

$class = 'X';
echo $class::$var;
1 голос
/ 11 апреля 2011
classname::property;

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

0 голосов
/ 11 апреля 2011
class testClass {
    public static $property = "property value";
    public static $property2 = "property value 2";
}
echo testClass::$property;
echo testClass::property2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...