// 测试的类 class Memory { private static $a= null; public function __construct() { return self::$a; } public static function getName(){ if(empty(self::$a)){ self::$a = new static(); } return self::$a; } public static function getOk(){ return self::$a; } }
echo '开始内存:'.memory_get_usage(), ' '; $a = memory_get_usage(); $stime=microtime(true); //获取程序开始执行的时间 $tmp = str_repeat('hello', 1000); for($i=1;$i<9999999;$i++){// $memory = new Memory(); $memory = Memory::getOk();// $memory = Memory::getName(); } echo '运行后内存:'.memory_get_usage(), ' '; $b = memory_get_usage(); unset($tmp); echo '内存占用:'.($b-$a)." "; /** *你要运行的程序 **/ $etime=microtime(true);//获取程序执行结束的时间 $total=$etime-$stime; //计算差值 echo "
结果:
1.实例化 开始内存:1785568运行后内存:1795352内存占用:9784[页面执行时间:2.3476557731628 ]秒 2.静态访问 开始内存:1785584运行后内存:1795320内存占用:9736[页面执行时间:1.1992189884186 ]秒 3.单例模式 开始内存:1785536运行后内存:1795224内存占用:9688[页面执行时间:1.6123049259186 ]秒
总结:从内存来看,差别不大;时间来看,静态访问最好
例如,当我们认为网站是实体,那么把连接数据库这个事情当成网站的一个动作,就是在网站类中实现该静态方法。然而为了节省内存,我们以为这个静态方法在程序初始化时就载入,这样就节省了内存,实际上我们在使用连接数据库的时候仍然是调用了这个方法,仍然需要重新连接一次,在内存中仍然在重复造连接资源。
如果我们把数据库当成一个实体,那么连接数据库这种事情当然是由这个实体来办的,然而为了节省内存,我希望所有用到数据库实体的情况都只使用那个已存在的实例,而不是每次都去创建连接,这时候单例模式就发挥了作用。