Smarty 中可用的变量一般有三种:1、来自PHP页面,通过assign()方法传递的变量;2、保留变量,即相当于PHP中预定义的变量;3、从配置文件中读取的变量。引用方法很简单,我就不详细说明了,具体可见:这里。不过,我遇到一个问题,就是在模板中引用保留变量时,其值为空(null )。开始感觉比较奇怪,后发现是其引用于PHP的php.ini中register_long_arrays设置、Smarty对象的request_use_auto_globals 属性有关。
一、保量变量值为空(null )
例如,在模板中使用下面的方式获取一个保留变量:
我原来的想法是,它应该返回一个相当于下面PHP的变量:
但是,在测试环境中,发现其值为空(null),与预期不相符。
后查看编译后的页面:
上面的语句被转换成如下的语句:
二、处理方法
从上面可知,Smarty的保留变量会转换为$GLOBALS[‘HTTP_SERVER_VARS’]数组的元素。而该数组是否生效,与PHP配置文件/etc/php.ini的设定有关:
只有当register_long_arrays为打开状态时,$HTTP_*_VARS 变量才有效。而测试环境中,该值为Off,所以,当Smarty的保留变量为空值(null )。可见,这会对GET、POST、SERVER等保留变量都有影响。
三、注意事项
1、建议关闭register_long_arrays
PHP手册中,有如下一段话:
Tells PHP whether or not to register the deprecated long $HTTP_*_VARS type predefined variables. When On (default), long predefined PHP variables like $HTTP_GET_VARS will be defined. If you’re not using them, it’s recommended to turn them off, for performance reasons. Instead, use the superglobal arrays, like $_GET. This directive became available in PHP 5.0.0.
Warning
This feature has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
也就是说,建议关闭该设定值,并且在PHP 5.3.0后该设定将会被取消。
2、更好的方法
实际上,Smarty也考虑到了该问题,并且提供了解决办法。就是在创建Smarty对象时,把其request_use_auto_globals值设置为true:
Smarty手册的说明如下:
可见,该值默认为false,即使用$HTTP_*_VARS[]数组变量。修改为true后,上面的保留变量会转换为:
这时,即可把PHP设置中的register_long_arrays 关闭。
※ 注意:修改request_use_auto_globals 后,建议把templates_c/目录下的文件都清空,待Smarty重建。
PHP设计模式——策略模式
PHP设计模式——命令模式
PHP设计模式——观察者模式
PHP设计模式——单元素模式
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/104523.html