sjo*_*obe 5 php variable-variables
我已经用PHP开发了一段时间了,而且我还没有完成我必须使用变量变量的任务.任何人都可以举例说明使用它们是个好主意吗?或者他们被包含在语言中只是为了好玩?
我通常会在代码闻起来不好的地方找到它们.也许引用静态配置变量等...但为什么通常的关联数组不是更好的解决方案.似乎是一个等待发生的安全漏洞.
我想你可以有效地在模板中使用它们.
首先,如果您将用户输出用于这些目的,那将是一个巨大的安全问题.内部是这里唯一有效的用途.
鉴于此,我想这是为了循环各种变量,或者将变量作为参数发送.
foreach($name in array('_GET','_POST','_REQUEST')) {
array_map('stripslashes',$$name);
}
Run Code Online (Sandbox Code Playgroud)
我必须使用它们的一种情况是URI处理,虽然这种技术可能已经过时了,但我肯定没有在很长一段时间内使用它.
假设我们想以格式从脚本中提取URI domain.tld/controller/action/parameter/s.我们可以使用以下命令删除脚本名称:
$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)
要从中提取控制器,操作和参数值,我们将不得不使用路径分隔符'/'来爆炸字符串.但是,如果我们有前导或尾随分隔符,我们在爆炸时会有空数组值,所以我们应该从字符串的开头和结尾修剪它们:
$uri_string = trim($uri_string, '/');
Run Code Online (Sandbox Code Playgroud)
我们现在可以将路径分解为数组:
$uri_data = explode('/', $uri_string);
Run Code Online (Sandbox Code Playgroud)
$uri_data[0]现在包含我们的控制器名称,$uri_data[1]包含操作名称,除此之外的数组中的值是应该传递给action方法的参数.
$controller_name = $uri_data[0];
$action_name = $uri_data[1];
Run Code Online (Sandbox Code Playgroud)
所以,既然我们有了这些名字,我们可以将它们用于许多方面.如果将控制器保存在相对于站点根目录的特定目录中,则可以将此信息用于require_once控制器类.此时,您可以实例化它并使用变量变量调用它:
$controller = new $controller_name();
$controller->{$action_name}(); // Or pass parameters if they exist
Run Code Online (Sandbox Code Playgroud)
在这种方法中需要注意很多安全问题,但这是我看到使用变量变量的一种方法.
免责声明:我不是建议您实际使用此代码.