php - 全局变量不在 PHP 中的静态类方法中更新

标签 php global-variables superglobals

我对 PHP 中的全局变量有疑问。我的问题是我在静态类方法内部更改的全局变量不会在方法外部更新。

我已经包含了代码:

测试.php

define( 'APP_ID', 'TESTING' );
$_APP = array( 'test' => 'test value' );
include ('appsettings.class.php');
AppSettings::initApplication();

appsettings.class.php

class AppSettings
{
  public static function initApplication()
  {
    global $_APP;
    session_start();

    // Some code here for your initializtions
    self::initAppEngine();
echo '<pre>Inside initApplication: '; print_r($_APP);
echo '<pre>Directly printing the session variable: '; print_r($_SESSION[APP_ID] );
  }

  private static function initAppEngine()
  {
    global $_APP;

    if( isset($_SESSION[APP_ID]) )
    {
      $_APP = &$_SESSION[APP_ID];
    }
    else
    {
      $_SESSION[APP_ID] = array( 'abcd' => 'hello', 'APP_ID' => APP_ID );
      $_APP = &$_SESSION[APP_ID];
die("Refresh the page");
    }

    if ( !isset( $_APP['uid'] ) )
      $_APP['uid'] = 0;

echo '<pre>Inside initAppEngine: '; print_r($_APP);
  }
}

$_APP 的旧值将取代 initApplication 中的新值。谁能指出我做错了什么?

提前致谢

最佳答案

这很有趣。首先要注意的是,它似乎与静态方法无关:

$_SESSION['test'] = array("test value from superglobal");
$_APP = array('test' => "test value directly assigned");

class AppSettings
{
  public static function initApplication()
  {
    global $_APP;
    $_APP = &$_SESSION['test'];
    echo '<pre>Inside initApplication: '; print_r($_APP);
  }

  public function initApplicationNonStatic()
  {
    global $_APP;
    $_APP = &$_SESSION['test'];
    echo '<pre>Inside initApplicationNonStatic: '; print_r($_APP);
  }
}

echo '<pre>Before calling initApplication: '; print_r($_APP);
AppSettings::initApplication();
echo '<pre>After calling initApplication: '; print_r($_APP);
echo '<pre>Before calling initApplicationNonStatic: '; print_r($_APP);
$appSettings = new AppSettings();
$appSettings->initApplicationNonStatic();
echo '<pre>After calling initApplicationNonStatic: '; print_r($_APP);

结果:

Before calling initApplication: Array
(
    [test] => test value directly assigned
)
Inside initApplication: Array
(
    [0] => test value from superglobal
)
After calling initApplication: Array
(
    [test] => test value directly assigned
)
Before calling initApplicationNonStatic: Array
(
    [test] => test value directly assigned
)
Inside initApplicationNonStatic: Array
(
    [0] => test value from superglobal
)
After calling initApplicationNonStatic: Array
(
    [test] => test value directly assigned
)

但这行得通:

$_SESSION['test'] = array("test value from superglobal");
$_APP = array('test' => "test value directly assigned");

class AppSettings2
{
  public function initApplicationNonStatic()
  {
    $GLOBALS['_APP'] = &$_SESSION['test']; // by reference
    echo '<pre>Inside initApplicationNonStatic: '; print_r($GLOBALS['_APP']);
  }
}

echo '<pre>Before calling initApplicationNonStatic: '; print_r($_APP);
$appSettings2 = new AppSettings2();
$appSettings2->initApplicationNonStatic();
echo '<pre>After calling initApplicationNonStatic: '; print_r($_APP);
$_SESSION['test'] = array("test value from superglobal altered");
echo '<pre>After altering superglobal: '; print_r($_APP);

结果:

Before calling initApplicationNonStatic: Array
(
    [test] => test value directly assigned
)
Inside initApplicationNonStatic: Array
(
    [0] => test value from superglobal
)
After calling initApplicationNonStatic: Array
(
    [0] => test value from superglobal
)
After altering superglobal: Array
(
    [0] => test value from superglobal altered
)

这也行得通:

$_SESSION['test'] = array("test value from superglobal");
$_APP = array('test' => "test value directly assigned");

class AppSettings2
{
  public function initApplicationNonStatic()
  {
    global $_APP;
    $_APP = $_SESSION['test']; // by value
    echo '<pre>Inside initApplicationNonStatic: '; print_r($_APP);
  }
}

echo '<pre>Before calling initApplicationNonStatic: '; print_r($_APP);
$appSettings2 = new AppSettings2();
$appSettings2->initApplicationNonStatic();
echo '<pre>After calling initApplicationNonStatic: '; print_r($_APP);
$_SESSION['test'] = array("test value from superglobal altered");
echo '<pre>After altering superglobal: '; print_r($_APP);

结果:

Before calling initApplicationNonStatic: Array
(
    [test] => test value directly assigned
)
Inside initApplicationNonStatic: Array
(
    [0] => test value from superglobal
)
After calling initApplicationNonStatic: Array
(
    [0] => test value from superglobal
)
After altering superglobal: Array
(
    [0] => test value from superglobal // expected, since assigned by value
)

所以,似乎无论何时你想在函数或方法中为全局变量分配一个引用,你都必须使用$GLOBALS['_APP'] 语法,你不能使用 global $_APP。如果您不需要通过引用赋值,$GLOBALS['_APP']global $_APP 的行为相同。

我不太清楚为什么会这样; some pages引用这两个构造的等效性:

global $example;
$example =& $GLOBALS['example'];

这可能会导致正确的轨道;但是,我希望我的回答能解决您的问题。

关于php - 全局变量不在 PHP 中的静态类方法中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17784930/

相关文章:

php - 从 <option> 中选择多个字段并将它们添加到数据库

PHP - 显示数据库数据的登录表单

python - 为什么我可以在 python 中从另一个模块访问一个模块中的非全局变量?

c - 全局变量和realloc和内存泄漏

php - 阻止 PHP 在 $_POST 超全局中创建数组

php - 无法连接到网站中的数据库

PHP MySQL 类别树父级 ID

java - Java 访问者模式和全局变量

php - 我应该将 superglobals 存储为包装类的属性还是应该直接访问它?

php - 为什么我看不到我在第一个脚本中设置的请求变量?