Как мне получить доступ к статическому члену класса? - PullRequest
37 голосов
/ 29 сентября 2010

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

Мой класс:

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;

Я получаю ошибку при печати.Как мне напечатать «А меня зовут»

Ответы [ 5 ]

93 голосов
/ 29 сентября 2010

Если 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 мне выдается синтаксическая ошибка при использовании оператора разрешения области действия .

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? Он отрицает всю идею доступа к переменной без необходимости создания экземпляра объекта.

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

10 голосов
/ 29 сентября 2010

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

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

$lstClass = array('A');

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

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

2 голосов
/ 29 сентября 2010

У вас есть синтаксическая ошибка с отсутствующей точкой с запятой и, поскольку это массив, вам необходим доступ к индексу 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 был получен.

EDIT

Видимо, это работает только под PHP 5.3

0 голосов
/ 02 апреля 2017

Внутри класса и для доступа к своему статическому члену данных вы также можете использовать static :: вместо self ::

0 голосов
/ 29 сентября 2010

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

Мой код:

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