1. 程式人生 > >Ucenter中全域性變數$_ENV的用法

Ucenter中全域性變數$_ENV的用法

二開ucenter,翻看程式碼,追到 /client/control/user.php ,看到註冊會員時的這段程式碼。

$uid = $_ENV['user']->add_user($username, $password, $email,$imdomain,0, $questionid, $answer);

Ruesin's Blog

額,不止一次的承認自己的基礎知識不夠紮實,看到這裡的$_ENV,竟然還要去查一下。

Ruesin.com

有興趣的可以去查一下官方手冊,這裡大概解釋一下,$_ENV是PHP中的一個包含伺服器端環境變數的陣列。它是PHP中一個超級全域性變數,我們可以在PHP程式的任何地方直接訪問它。它與$HTTP_ENV_VARS包含相同的資訊,但$HTTP_ENV_VARS不是一個超全域性變數。

那麼,它在ucenter的用法是什麼呢?

看到不明變數的時候,首先就是去列印一下了,在這裡我們會看到陣列包含兩個物件(user、note),如果這是包含model的大陣列的話,為什麼只包含了這兩個物件呢?而在之前,列印的話又是空的,很顯然,這個全域性變數陣列在不同的地方有不同的值。

我在想,這裡的變數是不是跟使用 $_POST['user'] 時差不多?是自定義的一個值?是給 $_EVN 設定一個key,儲存進去我們例項化的物件,從而達到,在程式的任何地方都可以直接訪問,這樣就無須在函式中使用global關鍵字了,避免了全域性變數的汙染。

繼續追蹤程式碼,果然驗證了我的理論,在 uc_client/model/base.php 中,load()方法定義了 $_ENV[$model] 並賦值,所以我們在不同的地方列印 $_ENV 的話,會打印出不同的值。

function load($model, $base = NULL) {
    $base = $base ? $base : $this;
    if(empty($_ENV[$model])) {
        require_once UC_ROOT."./model/$model.php";
        eval('$_ENV[$model] = new '.$model.'model($base);');
    }
    return $_ENV[$model];
}