zoukankan      html  css  js  c++  java
  • 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)
    }

  • 相关阅读:
    Oracle 字符集的查看和修改
    Hibernate查询方法与缓存的关系
    Oracle Sql语句整理
    Android动画效果
    Acrobat9键盘快捷键
    Head区的设置
    JAR,WAR,EAR区别
    ASCII码表完整版
    HTML的meta标签详解
    .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法
  • 原文地址:https://www.cnblogs.com/holiphy/p/13928654.html
Copyright © 2011-2022 走看看