什么时候在PHP中使用变量?

什么时候在PHP中使用变量?,php,variable-variables,Php,Variable Variables,我已经用PHP开发了一段时间了,但我还没有一个任务需要使用变量。谁能给我举个例子,说明使用它们是个好主意?或者它们被包含在语言中只是为了好玩吗?我通常会在代码有异味的地方找到它们。可能引用了静态配置变量等。。。但是为什么通常的关联数组不是更好的解决方案呢。似乎有一个安全漏洞等着发生 我想您可能能够在模板中有效地使用它们 永远不要使用它们;“数组”总是一个更好的解决方案。首先,如果您将用户输出用于这些目的,这将是一个巨大的安全问题。内部构件是这里唯一有效的用途 考虑到这一点,我想象它是用于循环各种

我已经用PHP开发了一段时间了,但我还没有一个任务需要使用变量。谁能给我举个例子,说明使用它们是个好主意?或者它们被包含在语言中只是为了好玩吗?

我通常会在代码有异味的地方找到它们。可能引用了静态配置变量等。。。但是为什么通常的关联数组不是更好的解决方案呢。似乎有一个安全漏洞等着发生


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

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

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

考虑到这一点,我想象它是用于循环各种变量,或者发送变量作为参数

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

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

我不得不使用它们的一种情况是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\u data[0]
现在包含控制器名称,
$uri\u data[1]
包含操作名称,数组中超出该名称的值是应传递给操作方法的参数

$controller_name = $uri_data[0];
$action_name = $uri_data[1];
现在我们有了这些名字,我们可以用它们来做很多事情。如果将控制器保存在相对于站点根目录的非常特定的目录中,则可以使用此信息来
require\u once
controller类。此时,您可以实例化它并使用变量调用它:

$controller = new $controller_name();
$controller->{$action_name}();    // Or pass parameters if they exist
在这种方法中有很多安全隐患需要注意,但这是我见过的利用变量的一种方法


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

语言中包含您不应该使用讨价还价的功能(我甚至在不久前也说过),而变量可能就是属于这一类的结构之一。仅仅因为一种语言包含一个特性并不意味着你必须使用它


在某些情况下,它们可能会解决问题(毕竟递归在实践中很少使用,但没有人会认为这不是一个基本的构造),但一般来说,任何模糊代码所做的事情的语言特性,以及公然属于这一类的变量,都应该极其小心地对待

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

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

有人会说,使用
switch
语句(您可以)也可以做到这一点,但这种方式有助于扩展性(如果您决定添加另一种方法类型),并保持在资源上应用方法的抽象性。

我发现了一个非常好的方法

$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);
}
输出:

templates/php/default.php
templates/css/default.php

当我试图确定静态变量的范围时,我已经将自己与此交叉
self::$file
self::$$文件将被解释为
self::$php

我只是偶尔使用PHP…PHP中的“变量”到底是什么?$foo=42$bar=“foo”$$bar==>42实际上,如果您使用的是字符串,则可以省略额外的$。没有人说过PHP不是一种草率的语言我在这种情况下使用它们。首先,我斜杠和转义所有$\u GET、$\u POST和数据包传输数据,然后使用它们。apache以这种方式处理我的URL。site.com/controller/$\u-GET[1]/$\u-GET[2]/$\u-GET[n]因此,将它们用作类名、函数或参数非常简单快捷。如果您能在术语或安全性方面提供一些关于使用变量变量的说明,我将不胜感激。就像字符串是如何处理的,如果它们在编译器之前放入代码中,等等。$class->$\u GET[1]$_获取[1]=“known函数;mysql_查询('DROP*');等等