Неожиданный T_PAAMAYIM_NEKUDOTAYIM в PHP 5.2.x

Мне трудно понять, почему я получаю Unexpected T_PAAMAYIM_NEKUDOTAYIM ошибку Unexpected T_PAAMAYIM_NEKUDOTAYIM в следующем коде, который кажется мне совершенно правдоподобным …

 class xpto { public static $id = null; public function __construct() { } public static function getMyID() { return self::$id; } } function instance($xpto = null) { static $result = null; if (is_null($result) === true) { $result = new xpto(); } if (is_object($result) === true) { $result::$id = strval($xpto); } return $result; } 

Вывод в PHP 5.3+:

 echo var_dump(instance()->getMyID()) . "\n"; // null echo var_dump(instance('dev')->getMyID()) . "\n"; // dev echo var_dump(instance('prod')->getMyID()) . "\n"; // prod echo var_dump(instance()->getMyID()) . "\n"; // null 

Однако в предыдущих версиях я не могу выполнить $result::$id = strval($xpto); , кто-нибудь знает почему?

Есть ли какие-либо обходные пути для этой проблемы?

Посмотрев на код:

 if (is_object($result) === true) { $result::id = strval($xpto); } 

… должно быть

 if (is_object($result) === true) { $result::$id = strval($xpto); } 

Я исправил это в новой пасте, и ошибка все еще существует … просто давая вам знать о проблеме в демо-коде.

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

На странице документации PHP по static ключевому слову,

Начиная с PHP 5.3.0, можно ссылаться на класс, используя переменную. Значение переменной не может быть ключевым словом (например, self, parent и static).

К сожалению, нет никаких подробностей о том, что ПОЧЕМУ было иначе в предыдущих версиях, и я не вижу обходного пути, представленного в комментариях.

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

 function instance($xpto = null) { static $result = null; if (is_null($result) === true) { $result = new xpto(); } if (is_object($result) === true) { xpto::$id = strval($xpto) } return $result; } 

Причиной ошибки является просто то, что синтаксис не поддерживается в < 5.3.

Однако, если вы пытаетесь просто получить доступ к статической переменной $ id, тогда синтаксис будет выглядеть следующим образом:

$result::id

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

 $class = new ReflectionClass($xpto); echo $class->setStaticPropertyValue ('id', strval($xpto)); 

ReflectionClass

PHP версии 5.3.3, я не получаю никаких ошибок в этом коде.

Вывод:

строка (0) "" строка (3) строка "dev" (4) строка "prod" (0) ""

Вероятно, ваша ошибка находится в другом месте. Пожалуйста, дважды проверьте номера строк.

Я пришел сюда по ссылке: Ошибка синтаксиса в PHP 5.2, где Chandresh упомянул вашу ссылку: как-то одно работает для PHP 5.2:

 class Sample{ public static $name; public function __construct(){ self::$name = "User 1"; } } $sample = new Sample(); $class = 'Sample'; $name = 'name'; $val_name = ""; $str = '$class::$$name'; eval("\$val_name = \"$str\";"); //echo $val_name."<br>"; eval("\$name = $val_name;"); echo $name; 

Игнорируйте, если вы уже решили. спасибо

Другой случай:

Это может произойти на некоторых серверах (PHP VERSION ??), если вы используете: if (empty(NAME_OF_A_CONSTANT)) ...