详解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 相关文章推荐
sae使用smarty模板的方法
Dec 17 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
Feb 26 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
Zend Framework校验器Zend_Validate用法详解
Dec 09 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
jquery按回车提交数据的代码示例
2013/11/05 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python中集合类型(set)学习小结
2015/01/28 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
python实现维吉尼亚算法
2019/03/20 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
留守儿童工作方案
2014/06/02 职场文书
作风建设剖析材料
2014/10/06 职场文书
学校计划生育责任书
2015/05/09 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers