详解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之第十天
Oct 09 PHP
PHP 输出缓存详解
Jun 20 PHP
php获取301跳转URL简单实例
Dec 16 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
Aug 16 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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(3)
2006/10/09 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
js 函数性能比较方法
2020/08/24 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
复制粘贴功能的Python程序
2008/04/04 Python
Python使用爬虫猜密码
2016/02/19 Python
python2.7安装图文教程
2018/03/13 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
详解python如何引用包package
2020/06/07 Python
python小白学习包管理器pip安装
2020/06/09 Python
python设置表格边框的具体方法
2020/07/17 Python
股份合作协议书
2014/04/12 职场文书
百日安全生产活动总结
2014/07/05 职场文书
行政管理专业求职信
2014/07/06 职场文书
清洁员岗位职责
2015/02/15 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏