1. 程式人生 > 實用技巧 >PHP 全域性和靜態變數的引用

PHP 全域性和靜態變數的引用

在 Zend 引擎 1 代,它驅動了 PHP4,對於變數的 staticglobal 定義是以引用的方式實現的。例如,在一個函式域內部用 global 語句匯入的一個真正的全域性變數實際上是建立了一個到全域性變數的引用。這有可能導致預料之外的行為,如以下例子所演示的:

<?php
function test_global_ref() {
    global $obj;
    $obj = &new stdclass;
}

function test_global_noref() {
    global $obj;
    $obj = new stdclass;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);

輸出:

NULL
object(stdClass)(0) {
}

類似的行為也適用於 static 語句。引用並不是靜態地儲存的:

<?php
function &get_instance_ref() {
    static $obj;

    echo 'Static object: ';
    var_dump($obj);
    if (!isset($obj)) {
        // 將一個引用賦值給靜態變數
        $obj = &new stdclass;
    }
    $obj->property++;
    return $obj;
}

function 
&get_instance_noref() { static $obj; echo 'Static object: '; var_dump($obj); if (!isset($obj)) { // 將一個物件賦值給靜態變數 $obj = new stdclass; } $obj->property++; return $obj; } $obj1 = get_instance_ref(); $still_obj1 = get_instance_ref(); echo "\n"; $obj2 = get_instance_noref(); $still_obj2
= get_instance_noref();

輸出:


Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)(1) {
["property"]=>
int(1)
}