我注意到PHP中的关键字static
根本不是static
。
让我们说Elmo
是我的单身人士:
class Elmo
{
private static $instance;
private function __construct()
{
echo 'Elmo says constructor\n';
}
public static function getInstance()
{
if (!isset(self::$instance))
self::$instance = new Elmo();
return self::$instance;
}
public function boo()
{
echo 'Elmo says boo!\n';
}
}
以下文件只是一个普通的.php
脚本。
<?php
Elmo::getInstance()->boo();
Elmo::getInstance()->boo();
// Output:
// Elmo says constructor
// Elmo says boo!
// Elmo says boo!
?>
重新构建每个新页面Elmo
。为什么后续页面没有以下输出?
<?php
// Output:
// Elmo says boo!
// Elmo says boo!
?>
我希望有人能就此启发我,谢谢!
答案 0 :(得分:9)
因为在每个页面加载所有内存都被擦除了?
答案 1 :(得分:8)
静态作用域并不意味着它将永远保留在内存中,这意味着该变量在程序调用堆栈之外运行,并且在脚本执行期间将保持不变。程序结束后仍然会被清除。
答案 2 :(得分:3)
这是因为每次进行页面加载时,它都会单独运行{main}。这就像两次运行java程序并且不保留静态属性。 Elmo :: $ instance只会在同一个脚本的上下文中保持实例化。如果您希望它在页面加载中工作,您可以在会话(或DB)中对其进行序列化,并在每次检查时而不是$ instance:
const SESSION = 'session';
public static function inst() {
!isset($_SESSION[self::SESSION]) and self::init();
self::$inst = $_SESSION[self::SESSION];
return self::$inst;
}
private static function init() {
$_SESSION[self::SESSION] = new self;
}