2015-06-01 22 views
7

Tôi muốn mở rộng cú pháp php, để phân biệt các biến có thể thay đổi và bất biến.

$a nên được khai báo có thể thay đổi (như trong php chuẩn) và #b phải được khai báo không thay đổi.

Tôi đã đọc Hacking PHP syntax,

và tôi không thể tìm ra nơi tôi có thể xác định rằng các biến khai báo với # cũng nên được tokenized như T_VARIABLE?

+0

Những vẻ đầy hứa hẹn: [zend_language_parser.y] (https://github.com/php/php-src/blob/438d17e74e3ed7c4c8356a894057200d3b62f425/Zend/zend_language_parser.y#L1117), [Tìm kiếm 'T_Variable'] (https://github.com/php/php-src/search?utf8=%E2%9C%93&q=T_Variable&type=Code) – Kobi

+6

Hãy nhớ rằng # cũng là một ký tự nhận xét trong PHP ... Có lý do nào khiến bạn không thực hiện điều này? Sẽ không phải là một hành động biến không thay đổi như một định nghĩa trong hầu hết các trường hợp? – EJTH

+0

Biến không thay đổi không hoạt động giống như 'php''s' define() ', vì bạn có thể đặt giá trị của nó nhiều lần, nhưng bạn không thể thay đổi giá trị của nó. ví dụ '# a = array (1,2); # a = array (1,3);' là hợp lệ, trong khi '# a = array (1,2); # a [1] = 3; ' thì không. –

Trả lời

1

tôi đã có thể giải quyết vấn đề này, Hai bước cần phải được thực hiện:

Hãy PHP không phân tích '#' như nhận xét:

Thay đổi:

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

Để

<ST_IN_SCRIPTING>"//" { 

Trong dòng 1901 trong zend_language_scanner.l

tokenize #a như là một biến:

Thay đổi:

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

Để:

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); } 
; 

Trong dòng 1117 của zend_language_parser.y

Vậy đó

Bây giờ mã này hoạt động:

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

Dự đoán đầu tiên của tôi là xem bạn có thể thay đổi điều này trong tệp php.ini cho dự án của mình hay không, tuy nhiên không có tùy chọn cho phép bạn thay đổi biển báo. http://php.net/manual/en/ini.list.php

Dự đoán tốt nhất của tôi là bạn cần phải tìm trong cơ sở mã PHP thực tế hoặc hỏi cộng đồng PHP nếu họ thêm tính năng này cho bạn.

+1

Đó là những gì anh ta hỏi: nơi thay đổi điều này trong cơ sở mã PHP. – Barmar