设为首页 收藏本站
查看: 566|回复: 0

[经验分享] PHP中静态方法和实例化方法的区别

[复制链接]

尚未签到

发表于 2017-12-30 16:42:44 | 显示全部楼层 |阅读模式
  在PHP中类为什么要使用静态方法,有什么好处
  不需要实例化?? 可以提高运行效率??
  这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。
  方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用 实例化方法需要new了以后才可以使用。。。。我们真的理解了吗?
  我特意以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c 、c++、java、c#)
  以下是他们的回答:
  海龙说:
  公用的方法,而且是一些零散的 一般用静态方法
  张伟说:
  几乎没有区别,如果不需要实例化,就用静态方法;如果为了稳妥,就用实例方法,这样才可调用其他实例方法和变量 。
  萧远山说:
  静态方法比较少用,因为他在一启动就实例化了,比较占资源,当然,,配合单例模式还是比较好用的
  比较多的用在数据连接上,我避免使用的原则就是减少资源消耗。
  张新波说:
  静态方法意味着我在调用前不需要进行对其所属的类进行new操作,我主要会在工具类里面用到静态方法。
  向详说:
  静态就是类的,实例就是对象的。
  静态方法和实例方法的区别之处还有一个地方:静态方法不需要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。
  winson_张林说:
  最大的区别在于内存。
  静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
  所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
  任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。
  静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
  而且静态内存是有限制的,太多了程序会启动不了。
  showlover说:
  静态方法与实例方法各有自己的用处...
  是定义成静态方法,还是定义成实例方法,还要看具体情况,比如方法本身与类型没有太大的关系,可以定义成静态方法..
  用实例方法,当然需要你先创建实例,才能调用实例方法,而静态方法则不需要..
  从性能上说,静态方法效率要稍微高一些,但是它会常驻内存...
  一些情况下使用静态方法是有好处的,因为对于静态方法无论你有多少个实例,
  内存中要维护的一份拷贝。同时,某些方法,确实使用静态是比较恰当的..
  Q.yuhen说:
  这个问题牵扯到的东西比较多,诸如设计模式等等。简单点说,静态方法用来执行无状态的一个完整操作,实例方法则相反,它通常是一个完整逻辑的一部分,并且需要维护一定的状态值。
  如果用内存和效率来区分使用Static Method、Instance Method 就回到过去结构化编程了。使用那种方法的根本出发点还是围绕面向对象来进行的。
  陈亮说:
  静态方法和全局函数差不多的,实例方法是一个类里面的方法。
  总结:大家对这个问题都有一个共识:那就是实例化方法更多被使用和稳妥,静态方法少使用。
  有时候我们对静态方法和实例化方法会有一些误解。
  1、大家都以为“静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
  事实上,他们都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
  2、大家都以为“ 静态方法在堆上分配内存,实例方法在堆栈上
  事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
  方法占不占用更多内存,和它是不是static没什么关系。
  因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所以字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。
  但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。
  同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……
  3、大家都以为“实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单
  事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。
  当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。
  从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象  反之使用静态方法。这只是从面向对象角度上来说的。
  如果从线程安全、性能、兼容性上来看  也是选用实例化方法为宜。
  我们为什么要把方法区分为:静态方法和实例化方法 ?
  如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
  拿别人一个例子说事:
  比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429732-1-1.html 上篇帖子: php的opcache缓存扩展(php页面代码刷新速度) 下篇帖子: app微信支付服务器端php demo
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表