何时在 PHP 中使用变量?

When to use a variable variable in PHP?

提问人:sjobe 提问时间:6/17/2009 最后编辑:Charlessjobe 更新时间:5/1/2015 访问量:3062

问:

我已经在PHP中开发了一段时间,但我仍然没有遇到必须使用变量的任务。谁能给我举例说明使用它们是个好主意?还是将它们包含在语言中只是为了好玩?

php 变量

评论

1赞 Evan Teran 6/17/2009
我只是偶尔使用PHP...PHP中的“变量”到底是什么?
3赞 jrockway 6/17/2009
$foo = 42;$bar = “foo”;$bar 美元 ==> 42

答:

9赞 cgp 6/17/2009 #1

我通常在代码闻起来很臭的地方找到它们。也许引用静态配置变量等......但是,为什么通常的关联数组不是一个更好的解决方案。似乎是一个等待发生的安全漏洞。

我想您可能能够在模板中有效地使用它们。

7赞 jrockway 6/17/2009 #2

永远不要使用它们;“数组”总是更好的解决方案。

6赞 Matchu 6/17/2009 #3

首先,如果您将用户输出用于这些目的,那将是一个巨大的安全问题。内部结构是这里唯一有效的用途。

鉴于此,我想它用于循环遍历各种变量或将变量作为参数发送之类的事情。

foreach($name in array('_GET','_POST','_REQUEST')) {
    array_map('stripslashes',$$name);
}
0赞 ylebre 6/17/2009 #4

除非你正在使用多深度变量(如果你没有做任何花哨的事情,你就不需要它),否则你可能不需要它们。即便如此,你也可能会找到另一种方法来写下同样的事情,并且仍然得到相同的结果。不过,使用它们可能会更短(在某些情况下甚至更容易理解),所以我很高兴它是语言的一部分。

5赞 Andrew Noyes 6/17/2009 #5

我不得不使用它们的一种情况是 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

在这种方法中有很多安全问题需要注意,但这是我见过的利用变量的一种方法。

免责声明:我不是建议您实际使用此代码。

评论

0赞 Andrew Noyes 6/17/2009
实际上,如果您使用的是字符串,则可以省略额外的 $。从来没有人说过PHP不是一种草率的语言。:)
0赞 Supernovah 9/30/2009
在这种情况下,我使用它们。首先,我削减并转义所有 $_GET、$_POST 和数据包传输数据,然后使用它们。我的 URL 由 Apache 以这种方式处理。site.com/controller/$_GET[1]/$_GET[2]/$_GET[n] 所以把它们用作类名、函数或参数是超级快速和容易的。我将不胜感激一些关于在术语或安全性中使用可变变量的说明。比如字符串的处理方式,如果它们在编译器之前被放入代码中,等等。 $class->$_GET[1];$_GET[1] = 'knownFunction;mysql_query('丢弃 *');';等等等等
2赞 Cruachan 6/17/2009 #6

语言包含你不应该用驳船杆触及的功能并不少见(我甚至问过一个问题),而变量变量可能是属于这一类的结构之一。仅仅因为一种语言包含一个特性并不意味着你必须使用它。

在某些情况下,它们可能会解决一个问题(毕竟,递归在实践中很少使用,但没有人会争辩说这不是一个基本的结构),但一般来说,任何语言特性都掩盖了你的代码正在做什么,变量也明显地属于这一类,都应该格外小心。

0赞 rojoca 6/17/2009 #7

我没有发现变量变量的很多用途,但将变量用于方法会很方便,只要你正在做的事情是清楚的。例如,在简单的 REST 服务中,您可以执行如下操作:

$method = $request->getMethod(); // 'post','get','put','delete'
try 
{
    $response = $resource->$method($request->getInput());
}
catch (BadMethodException $badMethod)
{
    $response = $responseFactory->getError($badMethod);
}

有些人会争辩说,你可以用一个语句(你可以)同样很好地做到这一点,但这种方式有助于扩展性(如果你决定添加另一个方法类型),并保持对资源应用方法的抽象。switch

3赞 Crazy Alien 5/1/2015 #8

我找到了一个相当不错的..

$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/默认:.php
模板/css/默认:.php

在尝试像这样的静态变量范围时,我已经遇到了这一点,然后我记得我可以使用变量变量,这些变量将被解释为self::$file;self::$$file;self::$php;