PHP基础知识系列:静态

静态变量:

  只存在于函数作用域的变量,在函数执行完成后,这种变量的值不会丢失。下一次调用这个函数时,这个变量仍然会记住原来的值。如:

function testing(){
  static $a = 1;
  $a  *= 2;
  echo $a . "\n";
}

testing();//2
testing();//4
testing();//8

静态成员:

  是一种类变量,可以把它看成是属于整个类而不是属于类的实例。所有的实例成员都共享这个成员。

class MyObject{
   public static $myStaticVar = 0;

   function myMethod(){
      self::myStaticVar  += 2;
      echo self::myStaticVar  . "\n";
   }
}
$instance1 = new MyObject();
$instance1->myMethod();//2
$instance2 = new MyObject();
$instance2->myMethod();//4

这里使用的是self::作用域限定符,而不用$this。因为self::表示类,而$this表示的是实例。

::这个操作符,左边表示的是作用域,右边表示的是访问成员。可以使用系统定义的作用域:self和parent。

self::可以调用基类中声明的方法,但是它调用的总是已经在扩展中重写的方法。如下:

class MyObject  {  
  public static $myVar = 0;  
          
  function myMethod()  {  
    self::$myVar+=2;  
    echo self::$myVar . "/n";  
  }  
}  
      
class MyOtherObject extends MyObject  {  
  function myMethod()  {  
    echo "基类myMethod被重写";  
  }  
          
  static  function myOtherMethod()  {  
    echo "myExtendsedMethod" . "/n";  
    self::myMethod(); //在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法.  
    parent::myMethod();//如果基类的方法被重写的情况下,你希望调用定义在基类的方法,可以使用parent作用域.  
    parent::myMethod();//静态成员  
  }  
}  
      
MyOtherObject::myOtherMethod();

静态方法不在需要实例化类。

     static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护
  从内存的角度我们来分析一下,内存从逻辑上被分为四段,其中对象是放在“堆内存”里面,对象的引用被放到了“栈内存“里,而静态成员则放到了“初始化静态段”,在类第一次被加载的时候放入的,可以让堆内存里面的每个对象所共享,如下图:



类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。


const:

  是一个定义常量的关键字,在PHP中定义常量使用的是”define()”这个函数,但是在类里面定义常量使用的是”const”这个关键字,类似于C中的#define如果在程序中改变了它的值,那么会出现错误,用”const”修饰的成员属性的访问方式和”static”修饰的成员访问的方式差不多,也是使用”类名”,在方法里面使用”self”关键字。但是不用使用”$”符号,也不能使用对象来访问

复制代码
代码
<?php
    
class MyClass
    { 

    
//定义一个常量constant
        const constant = 'constant value';

        
function showConstant() {
        
echo  self::constant . "\n";  //使用self访问,不要加”$”
        }
    }

    
echo MyClass::constant . "\n";  //使用类名来访问,也不加”$”

    
$class = new MyClass();
    
$class->showConstant();
    
// echo $class::constant;  是不允许的 

?>
复制代码
原文地址:https://www.cnblogs.com/colorstory/p/2644075.html