详解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应用程序来获取Web服务器的状态信息
Oct 09 PHP
深入解析PHP中逗号与点号的区别
Aug 05 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
php生成mysql的数据字典
Jul 07 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
php自定义截取中文字符串-utf8版
Feb 27 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
php源码的使用方法讲解
Sep 26 PHP
tp5 实现列表数据根据状态排序
Oct 18 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
解析php中的escape函数
2013/06/29 PHP
PHP的拦截器实例分析
2014/11/03 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
浅谈JavaScript 标准对象
2016/06/02 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
python 不以科学计数法输出的方法
2018/07/16 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
Python3实现二叉树的最大深度
2019/09/30 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
如何通过python实现全排列
2020/02/11 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
网络营销策划方案
2014/06/04 职场文书
建筑安全生产责任书
2014/07/22 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
《山中访友》教学反思
2016/02/24 职场文书
mysql部分操作
2021/04/05 MySQL
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server