我一直在PHP现在发展了一段时间,我仍然还没有在那里我不得不使用可变变量的任务。 谁能给我例子,其中使用它们是一个好主意吗? 还是他们包含在语言只是为了好玩?
Answer 1:
这里我不得不使用它们的一种情况是URI处理,虽然这种技术可能会过时,我承认没有在很长一段时间使用它。
比方说,我们希望从格式脚本拉URI domain.tld/controller/action/parameter/s
。 我们可以使用下面的删除脚本名称:
$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
要提取控制器,动作和参数,从这个我们将不得不使用爆炸的路径分隔符“/”的字符串值。 然而,如果我们开头或结尾的分隔符,我们将不得不在爆炸空数组值,所以我们应该修剪那些从一开始就和字符串的结尾:
$uri_string = trim($uri_string, '/');
现在,我们可以爆炸的路径到一个数组:
$uri_data = explode('/', $uri_string);
$uri_data[0]
现在包含了我们控制器的名称, $uri_data[1]
包含动作名,并在阵列中的值超出是应当传递给动作方法参数。
$controller_name = $uri_data[0];
$action_name = $uri_data[1];
所以,现在我们有这些名字,我们可以利用它们为一些事情。 如果你把你的控制器在非常特殊的相对于站点根目录,你可以使用这些信息来require_once
控制器类。 在这一点上,你可以实例,并使用可变的变量调用它:
$controller = new $controller_name();
$controller->{$action_name}(); // Or pass parameters if they exist
有很多安全陷阱的看出来在这种方法中,但是这是我见过利用可变变量的一种方式。
免责声明 :我不是暗示你的实际使用此代码。
Answer 2:
总的来说,我发现他们在代码气味不好的地方。 也许引用了一个静态配置变量等等......但是,为什么不是一般的关联数组是一个更好的解决方案。 似乎是一个安全漏洞等待发生。
我想你也许可以在模板中有效地使用它们。
Answer 3:
不要使用他们。 “阵列”始终是一个更好的解决方案。
Answer 4:
首先,它会是一个巨大的安全问题是你使用的用户输出这些目的。 内幕是这里的唯一有效的使用。
鉴于这种情况,我想这对喜欢的东西通过各种变量的循环,或发送变量作为参数。
foreach($name in array('_GET','_POST','_REQUEST')) {
array_map('stripslashes',$$name);
}
Answer 5:
我已经找到了一个相当不错的..
$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;
Answer 6:
它的情况并不少见语言,包括你不应该用bargepole触摸功能(我甚至问了一个问题关于它一会儿回来),和可变的变量可能是那些属于这一类的结构之一。 仅仅因为一个语言包含一个功能并不意味着说你必须使用它。
可能还有机会时,他们解决问题(毕竟递归在实际中很少使用,但没有人会认为这不是一个必要的结构),但总体上任何一种语言的功能,掩盖你的代码是干什么的,可变的变量挑衅陷入这一类别中,应该格外谨慎对待。
Answer 7:
除非你是用多深度变量(如果你没有做任何幻想,你将不再需要)的工作,你可能并不需要它们。 即使是这样,你也许可以找到另一种方式写下同样的事情,仍然得到同样的结果。 它可以是短(在某些情况下甚至更容易理解)虽则使用它们,所以我个人很高兴,这是语言的一部分。
Answer 8:
我还没有找到变量的变量很多用途,但使用变量的方法可以很方便的,只要你在做什么是明确的。 例如,在一个简单的REST服务,你可能会做这样的事情:
$method = $request->getMethod(); // 'post','get','put','delete'
try
{
$response = $resource->$method($request->getInput());
}
catch (BadMethodException $badMethod)
{
$response = $responseFactory->getError($badMethod);
}
有人会说,你可以用做同样switch
语句(你可以),但这种方式适合于可扩展性(如果你决定要添加其他方法类型),并且保持对资源应用方法的抽象。