Мне трудно понять, почему я получаю 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)) ...