• 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 "
    ";
    $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)
    }

  • 相关阅读:
    利用Jmeter模拟Github登录
    利用Python模拟GitHub登录
    Linux命令学习-ps命令
    Linux命令学习-tail命令
    Linux命令学习-history命令
    Linux命令学习-wget命令
    Linux命令学习-tar命令
    10.21工作第11天
    10.18工作第十天
    10.17工作第九天
  • 原文地址:https://www.cnblogs.com/holiphy/p/13928654.html
Copyright © 2020-2023  润新知