Я пытаюсь получить доступ к статическому члену класса.
мой класс:
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 – мое имя»,
Если 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
? Он побеждает всю идею доступа к переменной без необходимости создания экземпляра объекта.
Короче говоря, как только у нас будет больше информации о том, что вы хотели бы сделать, мы можем продолжить и предоставить более качественные ответы.
Если вам нужна рабочая версия для 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
У вас есть синтаксическая ошибка с отсутствующей точкой с запятой, и поскольку это массив, вам нужно получить доступ к индексу 0, иначе он будет пытаться вызвать класс «Массив».
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
получил A is my name
.
РЕДАКТИРОВАТЬ
По-видимому, это работает только в PHP 5.3
Я нахожу следующее одно простое решение, но не знаю, является его хорошим или нет.
Мой soln:
eval('return '.$x[0].'::$strName;');
Изнутри класса и хотите получить доступ к статическому собственному члену данных, вы также можете использовать static :: вместо self ::