详解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 相关文章推荐
Banner程序
Oct 09 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 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&amp;mysql(六)
2006/10/09 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
python集合是否可变总结
2019/06/20 Python
如何使用Python 打印各种三角形
2019/06/28 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
python和php哪个更适合写爬虫
2020/06/22 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
教师见习期自我鉴定
2014/04/28 职场文书
新书发布会策划方案
2014/06/09 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
红旗渠导游词
2015/02/09 职场文书
质量保证书格式
2015/02/27 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
医院见习总结
2015/06/24 职场文书
Python装饰器详细介绍
2022/03/25 Python