【问题标题】:When to use a variable variable in PHP?什么时候在 PHP 中使用变量变量?
【发布时间】:2010-11-03 11:13:13
【问题描述】:

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

【问题讨论】:

  • 我只是偶尔使用 PHP...PHP 中的“变量”到底是什么?
  • $foo = 42; $bar = "foo"; $$bar ==> 42

标签: php variable-variables


【解决方案1】:

我找到了一个很好的..

$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;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我不得不使用它们的一种情况是 URI 处理,尽管这种技术可能已经过时了,而且我承认我已经很长时间没有使用它了。

      假设我们要从脚本中提取格式为domain.tld/controller/action/parameter/s 的URI。我们可以使用以下内容删除脚本名称:

      $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
      

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

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

      【讨论】:

      • 实际上,如果您使用的是字符串,则可以省略额外的 $。没有人说过 PHP 不是一种草率的语言。 :)
      • 我在这种情况下使用它们。首先,我对所有 $_GET、$_POST 和数据包传输数据进行斜线和转义,然后使用它们。我的网址是由 apache 以这种方式处理的。 site.com/controller/$_GET[1]/$_GET[2]/$_GET[n] 因此将它们用作类名、函数或参数非常快速和简单。我将不胜感激有关在术语或安全性方面使用变量变量的一些说明。就像字符串的处理方式一样,如果它们在编译器之前放入代码中等等。 $class->$_GET[1]; $_GET[1] = 'knownFunction; mysql_query('DROP *');';等等等等
      【解决方案4】:

      语言包含您不应该与 bargepole 接触的功能并不少见(我什至 asked a question about it 不久前),变量变量可能是属于此类的那些结构之一。仅仅因为一种语言包含一个特性并不意味着你必须使用它。

      在某些情况下,它们可能会解决问题(毕竟递归在实践中很少使用,但没有人会认为这不是基本构造),但一般来说,任何语言功能都会掩盖您的代码正在做什么,以及变量变量明显属于这一类,应谨慎对待。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          鉴于此,我想它是用于循环各种变量或将变量作为参数发送。

          foreach($name in array('_GET','_POST','_REQUEST')) {
              array_map('stripslashes',$$name);
          }
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              我想您也许可以在模板中有效地使用它们。

              【讨论】:

                猜你喜欢
                • 2016-01-21
                • 2021-04-15
                • 2011-04-04
                • 2010-11-18
                • 1970-01-01
                • 2021-10-08
                • 2012-07-23
                • 1970-01-01
                • 2013-08-14
                相关资源
                最近更新 更多