Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从函数内部生成全局变量_Php_Variables_Function_Global Variables_Global - Fatal编程技术网

在PHP中从函数内部生成全局变量

在PHP中从函数内部生成全局变量,php,variables,function,global-variables,global,Php,Variables,Function,Global Variables,Global,我试图动态地定义变量。我正在为此使用一个函数,但我不知道如何将新的var定义为全局变量,因为它从未在函数之前创建过 可能吗 谢谢 编辑 好的,这就是我建造的。有那么危险吗 function extract_values($row) { foreach ($row as $key => $value){ global $$key; $$key = $value; } } 然后我试着让我的生活变得更轻松: $result = mysql_que

我试图动态地定义变量。我正在为此使用一个函数,但我不知道如何将新的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'];
这个函数为我实现了这一点。 我不明白为什么在这种情况下会有危险。。 或者像往常一样,我错过了一些东西

试试这个:

function doSomething() {
  global $x;
  $x = 5;
}
如果希望保存两个字节,可以使用$\u GLOBALS数组:

$_GLOBALS['x'] = 5;
试试这个:

function doSomething() {
  global $x;
  $x = 5;
}
如果希望保存两个字节,可以使用$\u GLOBALS数组:

$_GLOBALS['x'] = 5;

您可以通过两种方式完成:

使用关键字使变量成为全局变量:

或者,也可以在数组中创建新元素:


请记住,这些都被认为是错误的做法,函数应该具有外部不可见的局部变量,并且应该通过传递的参数获取输入。您应该避免通过全局变量获取参数,并且必须完全避免装箱全局变量。

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

使用关键字使变量成为全局变量:

或者,也可以在数组中创建新元素:


请记住,这些都被认为是错误的做法,函数应该具有外部不可见的局部变量,并且应该通过传递的参数获取输入。您应该避免通过全局变量获取参数,并且必须完全避免装箱全局变量。

关于您的编辑:这会降低代码的可理解性

实际上,已经存在一个正在执行此操作的函数:

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

extract($row, EXTR_PREFIX_ALL, 'db');
这将导致$db\u first\u name等

当然,extract也在做一些内部工作,但是使用内置函数总是比创建自己的函数要好

另一种可能是使用:


关于你的编辑:这会让你的代码不那么容易理解

实际上,已经存在一个正在执行此操作的函数:

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

extract($row, EXTR_PREFIX_ALL, 'db');
这将导致$db\u first\u name等

当然,extract也在做一些内部工作,但是使用内置函数总是比创建自己的函数要好

另一种可能是使用:


是的,但请不要在现实生活中使用总有一天你会用这种方式覆盖你不想覆盖的变量。@deceze,我知道。但是OP想要它,就这样吧。好的实践有时比完成工作更重要。关于这个问题的问题:当我使用globals时,它只适用于当前脚本,对吗?我的意思是,当我在另一个页面上将$user_id更改为全局时,它不应该被更改。对吗?@OfficeJet对。除非您在同一范围内包含其他脚本。@谢谢。我刚刚编辑了问题并添加了脚本。这看起来可以吗?是的,但请不要在现实生活中使用总有一天你会用这种方式覆盖你不想覆盖的变量。@deceze,我知道。但是OP想要它,就这样吧。好的实践有时比完成工作更重要。关于这个问题的问题:当我使用globals时,它只适用于当前脚本,对吗?我的意思是,当我在另一个页面上将$user_id更改为全局时,它不应该被更改。对吗?@OfficeJet对。除非您在同一范围内包含其他脚本。@谢谢。我刚刚编辑了问题并添加了脚本。这看起来可以吗?尽量避免使用全局变量!尽量避免使用全局变量!
while (($row = mysql_fetch_row($result))){
    list($first_name, $last_name, $address) = $row;
    // ...
}