php全局变量修饰符不起作用

14 php global modifier

我正在使用全局修饰符的基本php示例,它对我不起作用: - |

$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo "***: ".$b;
Run Code Online (Sandbox Code Playgroud)

这是结果...... $***:2

php.ini上有没有可能影响这个的参数?

Rem*_*hem 21

我也遇到了你的问题.当我使用框架(Yii)时,我并不完全清楚我的代码确实嵌套在函数内部,因此global没有按预期运行(正如omadmedia和其他人所解释的那样).

我的解决方案非常简单:

global $a;
global $b;
$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo "***: ".$b;
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于CodeIgniter 3.0 (2认同)

oma*_*dia 14

信不信由你,我得到答案:2.这意味着确实存在一些全局无效的情况.

尝试找到原因:似乎如果你有一个函数并将OP的代码(这是一个php.net示例)放在该函数中,你将得到答案2.这有点奇怪,有点在某种程度上是有道理的. ..

(我在Win XP中使用Apache 2.2.8下的PHP 5.2.5)

LE:我的解决方案好了,解决了这个问题:当你在第二个函数中使用global时,你显然得到了超级全局变量,那些可供所有人使用的变量(即在任何函数之外的变量),但是因为在第一个函数中声明了$ a和$ b ,它们不属于该范围,不适用于第二功能.我对一个解决方案的猜测是在第二个函数之外声明$ a和$ b global,它位于第一个函数内部.!请注意,由于各种原因,第一个可能不那么明显,例如您的文件(仅包含第二个函数)被包含在不同文件中不同函数体内的某个位置.


小智 7

正如@AgelessEssence 回答的那样,如果您有嵌套函数,则全局关键字不起作用。从他的例子中可以看出这一点。但是,如果不清楚是否包含文件。这是一个例子。

//a.php
function f() {
    require_once('./a_inc.php');
}

f();

//a_inc.php
$a = 12;

function g() {
    global $a;

    var_dump($a);
}

g();

//result
null
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,$a 看起来像一个全局变量。其实并不是因为它包含在a.php中的函数f()中,而$a是函数f()的一部分。

因此,当您的全局关键字不起作用时,请检查它是否包含在函数中。由于这个问题的解决方案在其他答案中已经解释得很清楚了,所以我没有在这里添加它。


OIS*_*OIS 2

您上面的示例代码对我有用。但您也可以使用$GLOBALS超级变量。

function Sum()
{
    $a = $GLOBALS["a"];
    $b =& $GLOBALS["b"];
    $b = $a + $b;
} 
Run Code Online (Sandbox Code Playgroud)

如果可以的话,就不应该使用全局变量。有更好的方法来创建你的函数。使用参数(参数)(可能通过引用 传递)并返回一个值

/**
 * Calculate the sum of the parameters
 * @param int|float $a one or more parameter
 * @param int|float $a, ... 
 * @return int|float
 */
function sum($a)
{
    $args = func_get_args();
    return array_sum($args);
}

$a = 1;
$b = 2;

$b = sum($a, $b);
Run Code Online (Sandbox Code Playgroud)

使用PHPDOC,您可以在几年后了解您的函数的功能,而无需阅读代码。有了好的IDE,您还可以在编写函数时获得解释和参数顺序。