当在PHP中使用可变变量?(When to use a variable variable in P

2019-06-23 10:20发布

我一直在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语句(你可以),但这种方式适合于可扩展性(如果你决定要添加其他方法类型),并且保持对资源应用方法的抽象。



文章来源: When to use a variable variable in PHP?