2011-02-14 4 views
5

Я с трудом понять, почему я получаю Unexpected T_PAAMAYIM_NEKUDOTAYIM ошибку в следующем коде, который, кажется perfecly действует до меня ...Неожиданное T_PAAMAYIM_NEKUDOTAYIM в PHP 5.2.x

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 

В prior versions однако, я не могу сделать $result::$id = strval($xpto);, кто-нибудь знает почему?

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

+0

копировать/вставить код в файл PHP, и он работает без ошибок , –

+0

@ Крис: Какую версию PHP вы используете? Также проверьте эту ссылку: http://codepad.org/wpT0g3VH. –

+0

Извините, неверно истолковал ваш вопрос. Добавлено ответ ниже. –

ответ

1

Посмотрев на codepad:

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

... должно быть

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

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

EDIT

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

As of PHP 5.3.0, it's possible to reference the class using a variable. The variable's value can not be a keyword (e.g. self, parent and 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; 
} 
+1

Вы проверили этот код? – Gumbo

+0

Упс, это было опечаткой! Тем не менее получение ошибки (http://codepad.org/wpT0g3VH). –

+1

Интересно, что мой dev-сервер (php 5.2.7) вызывает исходную ошибку «Ошибка анализа: ошибка разбора», вместо того, чтобы вытащить старый каштан T_PAAMAYIM_NEKUDOTAYIM. –

0

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

Выход:

string(0) "" string(3) "dev" string(4) "prod" string(0) ""

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

+0

PHP 5.3 отлично работает, как я сказал в своем ответе , проблема существует только в предыдущих версиях PHP. Проверьте пример Codepad. –

+0

Мои извинения, я думал, вы сказали, что это сработало в предыдущих версиях, но в 5.3 оно не срабатывало. –

+0

Нет проблем, я должен был сделать свой вопрос более ясным. Спасибо. –

4

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

Однако, если вы пытаетесь просто получить доступ к статической переменной $ ID, то синтаксис будет:

$result::id

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

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

ReflectionClass

+0

Auch, то есть PITA ... '$ id' в этом случае не является переменной. Вы знаете, где я могу больше узнать о поддержке этого синтаксиса? Я заметил, что нестатические свойства также не работают (http://codepad.org/Fb1mQOvx), это также потому, что синтаксис не поддерживается? –

+0

Вы получаете новую ошибку, потому что используете $ this в статической функции. http://php.net/manual/en/language.oop5.static.php – webbiedave

+0

О да, забыл об этом! Спасибо. –

0

Я пришел сюда по ссылке: Syntax error in PHP 5.2 где Chandresh упомянул вашу ссылку: как-то работать для PHP 5.2 is:

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; 

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

0

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

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

Смежные вопросы