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

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

мой класс это:

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;

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

 deceze29 сент. 2010 г., 04:26
Зачемarray('A')?
 Jacob29 сент. 2010 г., 04:28
Я думаю, что вы хотите экземпляр класса A в массиве, а не символ 'A' (который не имеет статического члена с именем strName)
 KoolKabin29 сент. 2010 г., 04:29
ну у меня есть список класса в массиве, который я должен перебирать
 KoolKabin04 окт. 2010 г., 04:39
Статический вызов члена через метод был выбран лучше, чем отражение.

Ответы на вопрос(5)

и, поскольку это массив, вам необходим доступ к индексу 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;

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

ОБНОВИТЬ

Если вы хотите перебрать массив для вызова переменной класса:

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

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

РЕДАКТИРОВАТЬ

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

 HoLyVieR29 сент. 2010 г., 04:38
Nevermind ideone.com использует PHP5.2 и прекрасно работает под PHP5.3
 HoLyVieR29 сент. 2010 г., 04:46
@KoolKabin см. Мой ответ для рабочей версии для PHP5.2.
 Brad F Jacobs29 сент. 2010 г., 04:36
Это было направлено @ удаленный комментарий как к сведению: я проверил его черезphp -a Cli Tool. Это работало отлично. Я изменил код, чтобы удалить... поскольку они должны быть удалены, чтобы не вызывать синтаксические ошибки. ИB класс должен быть создан дляОБНОВИТЬ раздел для правильной работы.
 KoolKabin29 сент. 2010 г., 04:38
это не работает на моем PHP версии 5.2 :( что может быть моим решением

Мой Soln это:

eval('return '.$x[0].'::$strName;');
 Anthony Forloney29 сент. 2010 г., 14:45
Я бы не стал полагаться наeval много, это может быть злом.
 KoolKabin29 сент. 2010 г., 15:39
можно ли считать это злом, если мы собираемся использовать только фиксированные предопределенные команды
 KoolKabin30 сент. 2010 г., 10:19
Спасибо за предложение. так что метод отражения лучше, чем другие. это?
 Anthony Forloney29 сент. 2010 г., 17:14
Честно говоря, в качестве личного предпочтения я бы даже не использовал его с предопределенными командами. Нет не должно бытьзлой делать это так, как вы, но я знаю, что есть лучшие решения.
 HoLyVieR29 сент. 2010 г., 17:27
да, это крайне проблематично использовать. Например, если класс не найден, это просто создаст фатальную ошибку, которая остановит скрипт отверстия без какой-либо возможности перехватить ошибку. Если вы использовали отражение, оно запустит исключение, которое может быть перехвачено.
Решение Вопроса

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

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

 KoolKabin29 сент. 2010 г., 04:29
ну, у меня есть список классов в массиве, который я должен перебрать через так, чтобы получить доступ с помощью массива
 Anthony Forloney29 сент. 2010 г., 04:31
Я не совсем понимаю, что вы пытаетесь сделать?
 James McLeod29 сент. 2010 г., 04:32
Выглядит правильно. Увидетьphp.net/manual/en/language.oop5.static.php, Это то, что я пытался вспомнить.
 KoolKabin29 сент. 2010 г., 04:36
Я даже попробовал приведенный пример, но он дал мне ошибку. Я получил версию PHP 5.2
 Anthony Forloney29 сент. 2010 г., 04:39
@KoolKabin Я использую PHP 5.2.8, и он нормально работает в моем браузере. Можете ли вы опубликовать то, что вы пытаетесь сделать? Кажется, что вы пытаетесь сделать, это немного грязно, и с некоторой дополнительной информацией можно немного почистить. У вас есть массив классов?array(new A(), new B())

нных, вы также можете использоватьстатическая :: вместосамостоятельно ::

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

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

$lstClass = array('A');

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

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

 Rav31 авг. 2015 г., 20:44
Очень полезно, спасибо!

Ваш ответ на вопрос