2009-06-16 72 views
5

我一直在PHP开发一段时间,而我还没有一个任务,我不得不使用变量变量。任何人都可以给我例子,在哪里使用它们是一个好主意?或者他们是否仅仅为了娱乐而被包含在语言中?什么时候在PHP中使用变量变量?

+1

我只是偶尔使用PHP ...什么时候越过自己对这个heck是PHP中的一个“变量变量”? – 2009-06-16 20:14:16

+3

$ foo = 42; $ bar =“foo”; $$ bar ==> 42 – jrockway 2009-06-16 20:19:10

回答

5

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

有很多安全陷阱的看出来在这种方法中,但是这是我见过利用的一种方式变量变量。

免责声明:我不是建议你真的使用这段代码。

9

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

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

7

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

+1

+1是的 - *任何*数据结构是更好的方法 – Dario 2009-06-16 20:04:56

6

首先,如果您将用户输出用于这些目的,那么这将是一个巨大的安全隐患。内部是这里唯一有效的用法。

鉴于这一点,我想这是为了像循环各种变量或发送变量作为参数。

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

好的例子:) – 2009-06-16 21:34:37

0

除非你用多深度变量(如果你没有做任何幻想,你将不再需要)的工作,你可能并不需要它们。即使那样,你也许可以找到另一种方式来写下同样的东西,仍然可以得到相同的结果。虽然它可以缩短(并且在某些情况下甚至更容易理解),但我很高兴它是该语言的一部分。

2

语言包括你不应该碰到的东西(我甚至在asked a question about it后面),这种情况并不少见,而变量变量可能属于这个类别的构造之一。仅仅因为一种语言包含一项功能并不意味着你必须使用它。

有些时候他们可以解决问题(毕竟递归在实践中很少使用,但没有人会认为这不是一个基本的构造),但通常任何语言特性都会掩盖您的代码正在做什么,并且可变变量明确地属于这个范畴,应该极其谨慎。

0

我还没有找到变量变量的许多用途,但使用变量的方法可以很方便,只要你在做什么是明确的。例如,在一个简单的REST服务,你可能会做这样的事情:

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

有人会说,你可以用switch声明做同样(你能),但这种方式适合于可扩展性(如果你决定添加另一种方法类型)并维护在资源上应用方法的抽象。

2

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

$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::$$file;将被解释为self::$php;

相关问题