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

时间:2016-12-27 21:31:05

标签: php scope singleton

我有以下代码:

//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();

相关功能:

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

    return static::$instance;
}

这告诉我,即使在我删除了持有初始化对象的变量之后,某种程度上MySqlConnector仍留在内存中。

如何?我不认为它适用于任何其他非静态类。

1 个答案:

答案 0 :(得分:3)

静态属性存在于全局范围内,并且不与任何特定实例相关联。

您可能会取消设置$x,但MySqlConnector::$instance仍未定义。

通常,在这种情况下,$instance将是private static,因此您无法仅通过访问方法直接访问该属性,从而保证只有Singleton类才具有访问以修改属性,您不会更改/设置/取消设置它,但通过正确定义的方法(如果存在)。

manual中的更多信息。