2015-06-01 2 views
7

Я хотел бы расширить синтаксис php, чтобы рассказать обо всех изменяемых и неизменяемых переменных.

$a должно быть объявлено изменчивым (как в стандартном php) и #b должно быть объявлено неизменным.

Я прочитал Hacking PHP syntax,

, и я не мог понять, где я могу определить, что переменные, объявленные с # также должны быть лексемы, как T_VARIABLE?

+0

Они кажутся многообещающими: [zend_language_parser.y] (https://github.com/php/php-src/blob/438d17e74e3ed7c4c8356a894057200d3b62f425/Zend/zend_language_parser.y#L1117), [Поиск 'T_Variable'] (https://github.com/php/php-src/search?utf8=%E2%9C%93&q=T_Variable&type=Code) – Kobi

+6

Имейте в виду, что # также является символом комментария в PHP ... Есть ли какая-то причина, по которой вы этого не сделали? Не будет ли в большинстве случаев неизменяемая переменная действовать как определение? – EJTH

+0

Неизменяемая переменная не ведет себя как 'php'' define() ', так как вы можете установить ее значение несколько раз, но вы не можете изменить ее значение. , например '# а = массив (1,2); # а = массив (1,3);' является действительным, в то время как '# а = массив (1,2); # а [1] = 3; ' нет. –

ответ

1

Я был в состоянии решить эту проблему, два шага должны быть приняты:

сделать PHP не разобрать '#' как комментарии:

Изменение:

<ST_IN_SCRIPTING>"#"|"//" { 

К

<ST_IN_SCRIPTING>"//" { 

В строке 1901 в zend_language_scanner.l

разметить #a в качестве переменной:

Изменение:

simple_variable: 
T_VARIABLE { $$ = $1; } 
| '$' '{' expr '}' { $$ = $3; } 
| '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); } 
; 

To:

simple_variable: 
T_VARIABLE { $$ = $1; } 
| '$' '{' expr '}' { $$ = $3; } 
| '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); } 
| '#' '{' expr '}' { $$ = $3; } 
| '#' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); } 
; 

В строке 1117 zend_language_parser.y

Вот оно

Сейчас этот код работает:

#a=1; 
echo (#a);//1 
-2

Моя первая догадка, чтобы увидеть, если вы могли бы изменить это в вашем файле php.ini для вашего проекта, однако не существует вариант, который позволяет изменить знак. http://php.net/manual/en/ini.list.php

Мое лучшее предположение заключалось в том, что вам нужно будет посмотреть в реальной базе PHP-кода или спросить сообщество PHP, если они добавят эту функцию для вас.

+1

Вот о чем он спрашивает: где это изменить в базе кода PHP. – Barmar

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