详解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边学边教》(01.开篇――准备工作)
Dec 13 PHP
怎样去阅读一份php源代码
Aug 21 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 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实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
python requests 测试代理ip是否生效
2018/07/25 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
python下载的库包存放路径
2020/07/27 Python
Python如何重新加载模块
2020/07/29 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
母亲80寿诞答谢词
2014/01/16 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
融资租赁计划书
2014/04/29 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
惊天动地观后感
2015/06/10 职场文书
陪护人员误工证明
2015/06/24 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
MySQL令人咋舌的隐式转换
2021/04/05 MySQL