写程序的时候, 很多核心类, 使用动态方法 还是静态方法,让我疑虑;
比如;
class A{
  public static $a;
  public fucntion aaa() {
      return self::$a;
  }
}
class B{
  public $a;
  public fucntion aaa() {
      return $this->a;
  }
}
A 和 B 类, 请问效率上有差别吗? 
不明白 实例化 具体浪费了什么资源?   
A::aaa()  和 (new B())->aaa() ; 使用一样的内存吗? 
--------------------
关于功能上, 所有动态类都可以写成静态的: (把成员属性添加标识存到静态属性中,  把__construct每个方法都写上...),就是繁琐点;目前在写框架, 不懂实例化和非实例化在资源上的具体差别在哪里?
求本质,thanks.

解决方案 »

  1.   

    本质是,无论静态方法还是动态方法,都是存在程序代码区被所有对象共用,对象只拥有属性和类指针。
    成员:
    静态成员属于类,被所有对象所共用。存在静态存储区,整个程序运行都存在,占内存。
    非静态成员属于各个对象,各个对象都拥有一份拷贝。存在动态存储区,对象调用过后自动销毁。
    方法
    静态方法只能访问静态成员。
    动态方法隐含this指针,调用时需要实例化对象传递指针给方法。动态方法既可以访问静态成员,又可以访问非静态成员。因为传递指针,比静态方法多一步,稍慢。
    A 和 B 类, 请问效率上有差别吗? 
    不明白 实例化 具体浪费了什么资源?   
    A::aaa()  和 (new B())->aaa() ; 使用一样的内存吗? 关于功能上, 所有动态类都可以写成静态的: (把成员属性添加标识存到静态属性中,  把__construct每个方法都写上...),就是繁琐点;1.根据你的问题,你这个功能是想访问$a。B类要实例化,要给对象开辟内存空间,实际上是访问类B的对象的一份拷贝。效率上,不如去访问类A的静态成员属性$a。
    2.所有动态类的确可以写成静态类,但是成员属性到底想被所有对象共用,还是各个对象各自拥有,是要根据自己的需求而定的。