详解php用static方法的原因


Posted in PHP onSeptember 12, 2018

静态方法不需要所在类被实例化就可以直接使用。

静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。

static全局变量和普通全局变量,static局部变量和普通局部变量,static函数与普通函数的区别?下面本文将一一为你解答。

(1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

(2)从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

(3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。

如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

实践是检验代码执行效率的唯一标准,于是趁着下班回家有点时间,做了个小测试:

先上测试代码(如果有不对的地方,请大家指正哈):

测试环境:

/test # php -v
PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
/test # uname -a
Darwin 192.168.0.101 13.1.0 Darwin 
Kernel Version 13.1.0: Thu Jan 16 19:40:37 PST 2014; 
root:xnu-2422.90.20~2/RELEASE_X86_64 x86_64
<?php
class staticTest {
public function test() {
$i = 0; 
$i++;
}
public static function testStatic() {
$i = 0;
$i++;
} 
}
$start = microtime(true);
for($i=0;$i<10000000;$i++) {
$test = new staticTest();
$test->test();
}
echo (microtime(true) - $start) ."\n";
$start = microtime(true);
for($i=0;$i<10000000;$i++) {
staticTest::testStatic();
}
echo microtime(true) - $start;

循环执行一千万次执行结果如下:

/test # php staticTest.php

2.2938342094421

1.1871800422668

第二次执行结果:

2.303295135498

1.1807670593262

执行很多次以后,都在2.3和1.18附近。可见,虽然没有文章中说的效率提升那么恐怖,性能的提升方面确实提升了一倍左右。

因此还是建议:

如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近1倍。

对于一个正常的php框架,里面的类和方法还是非常多的,如果我们能够做成静态方法,还是使用静态方法比较好,效率比较高。

PHP 相关文章推荐
php实现图片添加水印功能
Feb 13 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
php eval函数一句话木马代码
May 21 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
thinkphp下MySQL数据库读写分离代码剖析
Apr 18 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 PHP
php实现数字补零的方法总结
Sep 12 #PHP
php使用QueryList轻松采集js动态渲染页面方法
Sep 11 #PHP
Yii2结合Workerman的websocket示例详解
Sep 10 #PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 #PHP
php 中htmlentities导致中文无法查询问题
Sep 10 #PHP
使用PHPExcel导出Excel表
Sep 08 #PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 #PHP
You might like
PHP 图片水印类代码
2012/08/27 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
js实现随机点名
2021/01/19 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
python网络爬虫学习笔记(1)
2018/04/09 Python
python实现flappy bird小游戏
2018/12/24 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
python实现梯度下降法
2020/03/24 Python
Python如何对XML 解析
2020/06/28 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
《雕塑之美》教学反思
2014/04/24 职场文书
电子商务求职信
2014/06/15 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
满月酒邀请函
2015/01/30 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏