• 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;  是不允许的 

    ?>
    复制代码
  • 相关阅读:
    如何保证access_token长期有效
    微信自定义菜单的创建
    是否同一棵二叉搜索树
    Tree Traversals Again(根据前序,中序,确定后序顺序)
    List Leaves 树的层序遍历
    leetcode-优美的排列
    leetcode-下一个排列
    leetcode-二进制手表
    leetcode-组合总数III(回溯)
    leetcode-累加数(C++)
  • 原文地址:https://www.cnblogs.com/colorstory/p/2644075.html
Copyright © 2020-2023  润新知