替换PHP变量声明中的$符号

8
我想扩展php语法,以区分可变和不可变的变量。 $a应该被声明为可变(与标准的php相同),而#b应该被声明为不可变。
我阅读了Hacking PHP syntax,但是我无法找到在哪里定义使用#声明的变量也应被解析为T_VARIABLE

这些看起来很有前途:zend_language_parser.y搜索T_Variable - Kobi
6
请记住,在PHP中,#也是一个注释符号…你想要实现这个的原因是什么?在大多数情况下,不可变的变量是否会起到定义的作用? - EJTH
一个不可变的变量并不像 php 中的 define() 那样行为,因为你可以设置它的值多次,但是你不能改变它的值。例如: #a=array(1,2);#a=array(1,3); 是有效的, 而 #a=array(1,2);#a[1]=3; 则不是。 - Uri Goren
了解哪些变量是不可变的(因此,哪些函数是纯函数)可以用于缓存和并行处理。 - Uri Goren
你不能用匈牙利命名法来实现基本相同的功能吗?除非你重写大量的PHP代码并引入一些新类型,否则它实际上没有不可变值,也没有任何东西会利用这些信息。因此,#b只是一种符号约定。你可以使用$_b$immB或其他你想到的约定来实现这个。 - deceze
2个回答

1

我能够解决这个问题,需要执行两个步骤:

使PHP不将'#'解析为注释:

更改为:

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

<ST_IN_SCRIPTING>"//" {

zend_language_scanner.l的第1901行:

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

zend_language_parser.y的1117行。

就是这样

现在这段代码可以工作:

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

-2

我的第一个猜测是看看你是否可以在项目的php.ini文件中更改此选项,但是没有选项允许您更改符号。http://php.net/manual/en/ini.list.php

我最好的猜测是,您需要查看实际的PHP代码库或询问PHP社区是否会为您添加此功能。


1
这就是他所询问的:在PHP代码库中该在哪里更改。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接