从PHP中的函数内部创建全局变量

时间:2010-10-15 07:38:31

标签: php variables function global-variables global

我正在尝试定义动态变量。我正在使用一个函数,但我不知道如何将新var定义为全局(因为它从未在函数之前创建)。

可能吗?

感谢。


修改

好的,这就是我建造的。这有危险吗?

function extract_values($row) {
    foreach ($row as $key => $value){
        global $$key;
        $$key = $value;
    }
}

然后我试图让我的生活更轻松:

$result = mysql_query("SELECT first_name, last_name, address FROM users ORDER BY id ASC");

    while ($row = mysql_fetch_array($result)){
        extract_values($row);
#[do some stuff with the variables.]#
}

我这样做是为了节省时间。而不是为每一列创建它自己的变量,如

$first_name = $row['first_name'];

这个功能对我有用。 我不明白为什么在这种情况下它可能是危险的.. 或者像我们一样,我错过了一些东西..

3 个答案:

答案 0 :(得分:5)

试试这个:

function doSomething() {
  global $x;
  $x = 5;
}

如果您希望保存几个字节,可以使用$_GLOBALS数组:

$_GLOBALS['x'] = 5;

答案 1 :(得分:3)

关于您的编辑:它使您的代码不易理解。

实际上,已经有一个功能正在执行此操作:extract()

while (($row = mysql_fetch_assoc($result))){
    extract($row);
    // ...
}

extract()甚至更好,因为它允许您指定在变量已存在时应该发生的事情和/或允许您指定前缀(因此您不会用该名称覆盖已存在的变量)。例如。你可以这样做:

extract($row, EXTR_PREFIX_ALL, 'db');

会导致$db_first_name等。

Surly,extract()也在做一些内部工作,但使用内置函数总是比创建自己的函数更好。


另一种可能性是使用list()

while (($row = mysql_fetch_row($result))){
    list($first_name, $last_name, $address) = $row;
    // ...
}

答案 2 :(得分:2)

您可以通过两种方式实现:

使用global关键字将变量设为全局:

function fun1() {
        global $foo;
        $foo = 1;
}

或者,您也可以在$GLOBALS数组中创建一个新元素:

function fun2() {

        $GLOBALS['bar'] = 1;
}

Working code

请记住,这些被认为是不好的做法,函数应该让局部变量在外面不可见,并且应该通过传递的参数获得输入。你应该避免通过全局变量获取参数,并且必须完全避免创建全局变量。