详解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 页面编码声明方法详解(header或meta)
Mar 12 PHP
php 常用类汇总 推荐收藏
May 13 PHP
php下删除一篇文章生成的多个静态页面
Aug 08 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
php获取错误信息的方法
Jul 17 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
php通过header发送自定义数据方法
Jan 18 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
python使用建议与技巧分享(一)
2020/08/17 Python
python如何实现word批量转HTML
2020/09/30 Python
Python wordcloud库安装方法总结
2020/12/31 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
审核会计岗位职责
2013/11/08 职场文书
送货司机岗位职责
2013/12/11 职场文书
销售部主管岗位职责
2013/12/18 职场文书
低碳环保倡议书
2014/04/14 职场文书
租房协议书范例
2014/10/14 职场文书
学生会招新宣传语
2015/07/13 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers