Неожиданный 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)) ...