题
我已经在PHP中开发了一段时间了,我还没有完成我必须使用变量变量的任务。任何人都可以举例说明使用它们是个好主意吗?或者只是为了好玩而将它们包含在语言中?
解决方案
我必须使用它们的一种情况是URI处理,虽然这种技术可能已过时,但我承认它很长时间没有使用它。
假设我们想要以 domain.tld / controller / action / parameter / s
格式从脚本中提取URI。我们可以使用以下命令删除脚本名称:
$uri_string = str_replace(我必须使用它们的一种情况是URI处理,虽然这种技术可能已过时,但我承认它很长时间没有使用它。
假设我们想要以 domain.tld / controller / action / parameter / s
格式从脚本中提取URI。我们可以使用以下命令删除脚本名称:
$uri_string = trim($uri_string, '/');
要从中提取控制器,操作和参数值,我们将不得不使用路径分隔符'/'来爆炸字符串。但是,如果我们有前导或尾随分隔符,我们在爆炸时会有空数组值,所以我们应该从字符串的开头和结尾修剪它们:
$uri_data = explode('/', $uri_string);
我们现在可以将路径分解为数组:
$controller_name = $uri_data[0];
$action_name = $uri_data[1];
$ uri_data [0]
现在包含我们的控制器名称, $ uri_data [1]
包含操作名称,除此之外的数组中的值是应该是的参数传递给行动方法。
$controller = new $controller_name();
$controller->{$action_name}(); // Or pass parameters if they exist
所以,既然我们有了这些名字,我们可以将它们用于许多方面。如果将控制器保存在相对于站点根目录的特定目录中,则可以将此信息用于 require_once
控制器类。此时,您可以实例化它并使用变量变量调用它:
<*>
在这种方法中需要注意很多安全问题,但这是我看到使用变量变量的一种方法。
免责声明:我不是建议您实际使用此代码。
SERVER['SCRIPT_NAME'], '', 我必须使用它们的一种情况是URI处理,虽然这种技术可能已过时,但我承认它很长时间没有使用它。
假设我们想要以 domain.tld / controller / action / parameter / s
格式从脚本中提取URI。我们可以使用以下命令删除脚本名称:
<*>
要从中提取控制器,操作和参数值,我们将不得不使用路径分隔符'/'来爆炸字符串。但是,如果我们有前导或尾随分隔符,我们在爆炸时会有空数组值,所以我们应该从字符串的开头和结尾修剪它们:
<*>
我们现在可以将路径分解为数组:
<*>
$ uri_data [0]
现在包含我们的控制器名称, $ uri_data [1]
包含操作名称,除此之外的数组中的值是应该是的参数传递给行动方法。
<*>
所以,既然我们有了这些名字,我们可以将它们用于许多方面。如果将控制器保存在相对于站点根目录的特定目录中,则可以将此信息用于 require_once
控制器类。此时,您可以实例化它并使用变量变量调用它:
<*>
在这种方法中需要注意很多安全问题,但这是我看到使用变量变量的一种方法。
免责声明:我不是建议您实际使用此代码。
SERVER['REQUEST_URI']);
要从中提取控制器,操作和参数值,我们将不得不使用路径分隔符'/'来爆炸字符串。但是,如果我们有前导或尾随分隔符,我们在爆炸时会有空数组值,所以我们应该从字符串的开头和结尾修剪它们:
<*>我们现在可以将路径分解为数组:
<*> $ uri_data [0]
现在包含我们的控制器名称, $ uri_data [1]
包含操作名称,除此之外的数组中的值是应该是的参数传递给行动方法。
所以,既然我们有了这些名字,我们可以将它们用于许多方面。如果将控制器保存在相对于站点根目录的特定目录中,则可以将此信息用于 require_once
控制器类。此时,您可以实例化它并使用变量变量调用它:
在这种方法中需要注意很多安全问题,但这是我看到使用变量变量的一种方法。
免责声明:我不是建议您实际使用此代码。
其他提示
我通常会在代码闻起来不好的地方找到它们。也许引用静态配置变量等...但为什么通常的关联数组不是更好的解决方案。似乎是一个等待发生的安全漏洞。
我想你可以有效地在模板中使用它们。
永远不要使用它们; “阵列”总是一个更好的解决方案。
首先,如果您将用户输出用于这些目的,那将是一个巨大的安全问题。内部是这里唯一有效的用途。
鉴于此,我认为它适用于循环各种变量或将变量作为参数发送。
foreach($name in array('_GET','_POST','_REQUEST')) {
array_map('stripslashes',$name);
}
我发现了一个非常好的..
$php = "templates/php/default.php";
$html = "templates/html/default.php";
$css = "templates/css/default.php";
$js = "templates/js/default.php";
现在我要求用户说出他想要php或/和html的文件..
$userarray = array("php", "css");
foreach($userarray as $file){
var_dump($file);
}
输出:
模板/ PHP /如default.php结果 模板/ CSS /如default.php
在尝试范围静态变量时,我已经克服了这个问题
像这样的 self :: $ file;
然后我记得我可以使用变量变量
self :: $$ file;
,将被解释为 self :: $ php;
语言包含不应该与bargepole接触的功能并不罕见(我甚至一段时间后问了一个关于它的问题),变量变量可能是属于这一类的那些结构之一。仅仅因为语言包含一个功能并不意味着你必须使用它。
在某些情况下,他们可能会解决问题(在所有递归很少在实践中使用但没有人会认为这不是一个必要的构造)但通常任何语言功能都会模糊代码所做的事情和变量变量顽固地属于这一类,应该极其谨慎对待。
除非您正在使用多深度变量(如果您没有做任何想象,您将不需要这些变量),您可能不需要它们。即使这样,你也可以找到另一种方法来记下同样的事情并且仍然得到相同的结果。虽然它可以更短(在某些情况下甚至更容易理解),但我很高兴它是语言的一部分。
我没有找到变量变量的许多用途,但是使用方法的变量可以很方便,只要你正在做的事情是清楚的。例如,在简单的REST服务中,您可以执行以下操作:
$method = $request->getMethod(); // 'post','get','put','delete'
try
{
$response = $resource->$method($request->getInput());
}
catch (BadMethodException $badMethod)
{
$response = $responseFactory->getError($badMethod);
}
有些人认为你可以用 switch
语句(你可以)这样做同样好但这种方式有助于扩展性(如果你决定添加另一种方法类型)并保持抽象在资源上应用方法。