Неожиданный T_PAAMAYIM_NEKUDOTAYIM в PHP 5.2.x
Мне сложно понять, почему я получаю ошибку 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);
, кто-нибудь знает, почему?
Существуют ли какие-либо обходные пути для этой проблемы?
Ответы
Ответ 1
Посмотрев на код:
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 и статический).
К сожалению, не дается никаких подробностей о том, что ПОЧЕМУ было иначе в предыдущих версиях, и я не вижу обходного пути, представленного в комментариях.
Поскольку класс статичен, вы должны иметь возможность напрямую изменять свойство:
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;
}
Ответ 2
Причиной ошибки является просто то, что синтаксис не поддерживается в <
5.3.
Однако, если вы пытаетесь просто получить доступ к статической переменной $id, тогда синтаксис будет выглядеть следующим образом:
$result::id
Если вам нужно получить доступ к статической переменной переменной, то обходным путем является использование отражения:
$class = new ReflectionClass($xpto);
echo $class->setStaticPropertyValue ('id', strval($xpto));
ReflectionClass
Ответ 3
PHP версии 5.3.3, я не получаю никаких ошибок в этом коде.
Вывод:
строка (0) "строка (3) строка" dev "(4) строка" prod "(0)" "
Ваша ошибка, вероятно, лежит в другом месте. Пожалуйста, дважды проверьте номера строк.
Ответ 4
Я пришел сюда по ссылке:
Ошибка синтаксиса в 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;
Игнорировать, если вы уже решили. Спасибо вам
Ответ 5
Другой случай:
Это может произойти на некоторых серверах (PHP VERSION??), если вы используете:
if (empty(NAME_OF_A_CONSTANT)) ...