2011-04-09 105 views
-1

func(CONST_A)应该返回'CONST_A'func($name)应该返回$name如何在PHP中以编程方式获取变量/常量名称?

如何实现这个func在PHP?

+0

[如何在PHP中获取变量名称作为字符串?](http://stackoverflow.com/questions/255312/how-to-get-a-variable-name-as-a-string -in-php) – 2011-04-09 03:39:12

+0

@Marc,它适用于变量,但不适用于CONSTANTS ... – 2011-04-09 03:44:45

+0

设置另一个函数并处理从'get_defined_constants()'返回的数据。据我所知,函数没有办法告诉它的参数是来自变量还是常量。它只能看到var/constant的内容,而不是来源。你必须设置两个功能,两个做你想做的事。一个是vars,一个是consts。 – 2011-04-09 03:48:13

回答

0

这似乎并不可能轻易。

您可以使用reflection来确定parameters of the function,但它会返回函数期望的变量名称,如果您已经在函数中,那么您已经知道这些变量名称。

debug_backtrace是什么叫你偷看的常用方法,但它返回的值传递的参数,而不是进行调用时使用呼叫者的变量名称或常量

然而,它确实给你的是文件名和调用者的行号,所以你可以打开文件,并寻求到该行并解析出来,但是这将是很无聊,你不应该这样做。我不会给你这个例子的代码,因为它非常愚蠢,你不应该考虑这样做有史以来

get_defined_vars事情是一个黑客,并不能保证工作,并且肯定不会用于常量,因为get_defined_constants这样做。

+0

好吧,我放弃这个想法:) – 2011-04-09 04:18:34

+0

你叫我完全傻。那么,事实是,我在一个很酷的函数中做这个事情,我总是使用对象检查。这不是生产环境,我承认它,但让我告诉你这对于调试非常方便。 – 2011-07-27 05:36:58

0

试试这个:

<?php 
function getVarConst($var) 
{ 
    if (isset($GLOBALS[$var]) // check if there is a variable by the name of $var 
    { 
     return $GLOBALS[$var]; // return the variable, as it exists 
    } 
    else if (defined($var)) // the variable didn't exist, check if there's a constant called $var 
    { 
     return constant($var); // return the constant, as it exists 
    } 
    else 
    { 
     return false; // return false, as neither a constant nor a variable by the name of $var exists 
    } 
} 
?> 
+0

它不适用于const,请尝试'define('CONST_A','test'); echo getVarConst(CONST_A);' – 2011-04-09 04:05:12

+0

这些名称必须作为字符串传递。如果您将它们作为变量或常量传递,则函数会接收常量/变量的值。据我所知,除非循环遍历$ GLOBALS和get_defined_constants()来查找值,否则从它的值中获取常量或变量的名称是不可能的,而且这很愚蠢 - PHP将在每个请求(也解析,如果你不使用操作码缓存)。它会让你的应用/脚本执行得如此糟糕,这不值得。 – ShotgunToothpaste 2011-04-09 04:09:50

+0

说实话,你不应该需要这个代码,除非你的应用程序需要能够获取设置的值,而不管用户是将它定义为常量还是变量。 例如你可以使用它来完成这个工作,所以'$ db ='myDb';'或'define('db','myDb');'都可以使用,你可以通过'getVarConst('db ');'所以你得到可用的值,变量优先于常量。 – ShotgunToothpaste 2011-04-09 04:11:40

0

这是不可能的。

你真的想要以下权利?

define('CONST_A', 'THIS COULD BE ANYTHING'); 
$name = 'who cares'; 

func(CONST_A); //returns 'CONST_A' 
func($name); //returns '$name' 

函数不能知道这个。

我想,像查尔斯描述的阅读源代码可以让你这个,但为什么?

+0

即使这样,它可能也无法解决诸如'$ name = myFunc('hiThere');'之类的问题而不执行该文件。 换句话说,OP的问题几乎是不可能的,绝对不可行,因为性能受到影响,并且无法通过一些小的重构来解决......好的计划应用程序绝不需要这种类型的东西。 – ShotgunToothpaste 2011-04-09 08:36:02