静态方法和实例化方法是PHP编程中经常出现的两种方法,一个是通过类直接调用,一个是先实例化一个类得到一个对象,然后再通过对象来调用。如下图所示:
虽然,我们一直这样使用,但我们真的知道,什么时候该使用静态方法,什么时候该使用实例化方法吗?
思考误区通过平时与其他开发人员交流发现,在静态方法和实例化方法的使用上,存在几个思考误区:
1、静态方法常驻内存,实例方法不是,所以静态方法比实例方法效率高,但占内存。
事实上,静态方法和实例化方法在加载时机和占用内存上是一样的,在类第一次被使用时调用的速度基本上没有差别。
方法占不占用更多内存,和它是不是静态没什么关系。
2、静态方法在堆上分配内存,实例方法在堆栈上分配内存。
其实,所有的方法都不可能在堆或者堆栈上分配内存。实际上,方法作为代码是被加载到内存中特殊的代码区的,这个内存区域是不可写的。
类实例化后,其所有的信息,都保存在另外的区域里。
3、实例方法需要先创建实例才可以调用,比较麻烦;静态方法不用,比较简单。
实际上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。
使用原则1、从面向对象的角度上来说,在选择是使用实例化方法还是静态方法时,应该根据的是该方法和实例化对象是否具有逻辑上的相关性,如果有就应该使用实例化对象,反之,则使用静态方法。
2、如果从线程安全、性能、兼容性上来看,则选用实例化方法为宜。
总结早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c ,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的 问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
拿别人一个例子说事:
比 如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪 个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目” 的。