doz15449 2016-12-27 21:31
浏览 95
已采纳

Singleton模式在程序的整个生命周期中如何保留在内存中?

I have the following code:

//init X (DB initialization with credentials)
$x = MySqlConnector::getMySql();

//I destroy $x
unset($x);
$x = null;

//I try to re-initialize the database, but it is already initialized
//as evident from my logs
$x = MySqlConnector::getMySql();

Relevant function:

public static function getMySql()
{
    if (null === static::$instance)
    {
        include 'include/config.php';
        static::$instance = new MySql(DBHOST, DBUSER, DBPASS);
    }

    return static::$instance;
}

That tells me that even after I kill off the variable that was holding the initialized object, somehow MySqlConnector stayed in memory.

How? I don't think it works with any other non-static class.

  • 写回答

1条回答 默认 最新

  • dougongyou7364 2016-12-27 21:38
    关注

    Static properties exist in the global scope, and are not associated to any particular instance.

    You may be unsetting $x, but MySqlConnector::$instance stays defined.

    Typically, in this kind of scenario, $instance will be a private static, so you wont be able to access the property directly, only through accesor methods, hence guaranteeing that only the Singleton class will have access to modify the property, and you wont be changing/setting/unsetting it but through properly defined methods, if they exist.

    More info in the manual.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了