Подтвердить что ты не робот

Как получить доступ к статическому члену класса?

Я пытаюсь получить доступ к статическому члену класса.

мой класс:

class A
{
    public static $strName = 'A is my name'
    public function xyz()
    {
        ..
    }
    ..
}
//Since I have bunch of classes stored in an array
$x = array('A');
echo $x::$strName;

Во время печати появляется ошибка. Как напечатать "A - мое имя"

4b9b3361

Ответ 1

Если A - это класс, вы можете получить к нему доступ непосредственно через A::$strName.

class A {
    public static $strName = 'A is my name';
}

echo A::$strName; // outputs "A is my name"

Обновление:

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

$objClasses = array(new A(), new B()); // class objects
$myClasses = array('A','B');           // class literals

Если вы подходите к классу литературного подхода, то с помощью цикла foreach с PHP5.2.8 мне присваивается синтаксическая ошибка при использовании оператора scope resolution.

foreach ($myClasses as $class) {
     echo $class::$strName;
  //syntax error, unexpected '::', expecting ',' or ';'
}

Итак, я подумал об использовании подхода к объектам класса, но единственный способ, с помощью которого я мог бы вывести статическую переменную, был с экземпляром объекта и с использованием ключевого слова self, например,

class A {
    public static $strName = 'A is my name';

    function getStatic() {
        return self::$strName;
    }
}

class B {
    public static $strName = 'B is my name';

    function getStatic() {
        return self::$strName;
    }
}

И затем вызывается этот метод при итерации,

foreach($objClasses as $obj) {
    echo $obj->getStatic();
}

Что в этой ситуации зачем вообще объявлять переменную static? Он побеждает всю идею доступа к переменной без необходимости создания экземпляра объекта.

Короче говоря, как только у нас будет больше информации о том, что вы хотели бы сделать, мы можем продолжить и предоставить лучшие ответы.

Ответ 2

Если вам нужна рабочая версия для PHP5.2, вы можете использовать reflection для доступа к статическому свойству класса.

class A {
    static $strName= '123';
}

$lstClass = array('A');

foreach ($lstClass as $value) {
    $c = new ReflectionClass($value);
    echo $c->getStaticPropertyValue('strName');
}

Демо: http://ideone.com/HFJCW

Ответ 3

У вас есть синтаксическая ошибка с отсутствующей точкой с запятой, и поскольку это массив, вам нужно получить доступ к индексу 0, иначе он будет пытаться вызвать класс 'Array'.

class A
{
    public static $strName = 'A is my name';

    public function xyz()
    {
        // left blank and removed syntax error
    }
}
$x = array('A');
echo $x[0]::$strName;

Должен его исправить.

UPDATE

Если вы хотите перебрать массив, чтобы вызвать переменную класса:

$x = array('A', 'B');
foreach ($x as $class) {
     echo $class::$strName;
}

Не уверен, зачем вам это нужно, но там вы идете. И это было проверено, ошибок не было, был получен действительный ответ A is my name.

ИЗМЕНИТЬ

По-видимому, это работает только в PHP 5.3

Ответ 4

Я нахожу следующее одно простое решение, но не знаю, является его хорошим или нет.

Мой soln:

eval('return '.$x[0].'::$strName;');

Ответ 5

Изнутри класса и вы хотите получить доступ к самому статическому элементу данных, вы также можете использовать Статическая:: вместо само::