PHP 类的静态成员变量和普通成员变量对比

蔚落 2022-05-17 09:41 293阅读 0赞

有很多人可能弄不清楚,在PHP中类的静态成员变量和普通成员变量有什么区别?

1、类的静态方法只能访问静态成员变量,而不能访问非静态成员变量

2、静态成员变量不需要实例化就能访问,且访问速度快一些

3、类的静态成员变量只属于这个类,但类的所有实例共享这个静态成员变量

一个由 c/c++编译过的程序占用的内存分为一下几个部分

(1)、栈区 stack :

  1. 由编译器自动分配释放,存放函数的参数值,局部变量的值等。这个栈的操作方式类似于数据结构中的栈。栈区是在程序运行前就会分配好的,速度较堆要快

(2)、堆区 heap :

  1. 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,注意它与数据结构中的堆是两回事,分配方式类似于链表。是在程序运行时动态分配的,速度较栈慢

(3)、全局区(静态去)static :

  1. 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量又放在相邻的另一块区域中。程序结束后由系统释放。

(4)、文字常量区 :

  1. 常量字符串放在这里。程序结束后由系统释放。

(5)、程序代码区 :

  1. 存放函数体的2进制代码。

下面咱们一起来做个小例子:

  1. class A{
  2. public static $a = 5;
  3. public $b = 4;
  4. public function getA(){
  5. return A::$a;
  6. }
  7. public function setA($val){
  8. A::$a = $val;
  9. }
  10. public function getB(){
  11. return $this->b;
  12. }
  13. public function setB($val){
  14. $this->b = $val;
  15. }
  16. public static function getbb(){
  17. return $this->a;
  18. }
  19. }
  20. $a = new A();
  21. echo $a->getA();
  22. $a->setA('aaaa');
  23. echo '<br/>';
  24. $b = new A();
  25. echo $b->getA();
  26. echo '<br/>';
  27. $c = new A();
  28. echo $c->getA();
  29. 执行结果会是:5 aaaa aaaa

类的对象$a将类的静态成员变量值修改后,由于类的所有实例对象共享静态成员变量,所以其他对象在获取静态成员变量值时就会发生改变。

  1. $a = new A();
  2. echo $a->getB();
  3. $a->setB('aaaa');
  4. echo '<br/>';
  5. $b = new A();
  6. echo $b->getB();
  7. 执行结果是:4 4
  8. echo A::getbb();

会发生报错,因为类的静态方法只能访问静态成员变量

相信看到这里大家应该会明白了吧!

错误之处欢迎指出!

参考文献:

https://blog.csdn.net/lhbeggar/article/details/46119705

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读

    相关 静态成员变量

    1)定义静态成员变量 关键字 static 可以用于说明一个类的成员,              静态成员提供了一个同类对象的共享机制  把一个类的成员说明

    相关 静态成员变量

    类的静态成员变量 coding时遇到一个需求,抽象出来大概意思就是:A类的一个静态成员变量,需要在B类里面赋值,然后在C类里面使用。知识点:类的静态成员变量需要在全局域进

    相关 静态成员变量

    共享静态数据成员对象:类成员或者成员函数(类的范围内) 普通数据成员和静态数据成员的区别 1.普通数据成员属于类的对象,对象被创建后,普通数据成员才会分配内存。静态数据成员