• 技术文章 >后端开发 >php教程

    php中静态类与静态变量的用法及区别

    怪我咯怪我咯2017-07-10 11:43:11原创450
    这篇文章主要介绍了php中静态类与静态变量用法的区别,以实例形式较为详细的分析了php中静态类与静态变量的定义、功能及使用技巧,需要的朋友可以参考下

    本文实例分析了php中静态类与静态变量用法的区别。分享给大家供大家参考。具体分析如下:

    static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了.

    1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问.

    2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以,但是有前提条件.

    A. 如果是变量,需要该变量可访问.

    B. 如果是方法,除了该方法可访问外,还需要满足.

    ① 如果是静态方法,没有特殊条件.

    ② 如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题.

    然后我们再看一下使用$object->… 和使用class::… 都有什么区别:

    1. 使用$object->… ,需要执行构造函数创建对象.

    2. 使用class::… 调用静态方法/变量,不需要执行构造函数创建对象.

    3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象.

    然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?

    静态static:声明类成员或方法为 static,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外),静态成员属于类,不属于任何对象实例,但类的对象实例都能共享.

    例子,代码如下:

    代码如下:

    <?php 
    Class Person{ 
        // 定义静态成员属性 
        public static $country = "中国"; 
        // 定义静态成员方法 
        public static function myCountry() { 
            // 内部访问静态成员属性 
            echo "我是".self::$country."人<br />"; 
        } 
    } 
    class Student extends Person { 
        function study() { 
            echo "我是". parent::$country."人<br />"; 
        } 
    } 
    // 输出成员属性值 
    echo Person::$country."<br />";  // 输出:中国 
    $p1 = new Person(); 
    //echo $p1->country;   // 错误写法 
    // 访问静态成员方法 
    Person::myCountry();   // 输出:我是中国人 
    // 静态方法也可通过对象访问: 
    $p1->myCountry(); 
     
    // 子类中输出成员属性值 
    echo Student::$country."<br />"; // 输出:中国 
    $t1 = new Student(); 
    $t1->study();    // 输出:我是中国人 
    ?>

    运行该例子,输出:
    中国
    我是中国人
    我是中国人
    中国
    我是中国人

    小结:在类内部访问静态成员属性或者方法,使用 self::(注意不是 $slef),代码如下:

    代码如下:

    slef:: $country
    slef:: myCountry()

    在子类访问父类静态成员属性或方法,使用 parent::(注意不是 $parent),代码如下:

    代码如下:

    parent:: $country
    parent:: myCountry()

    外部访问静态成员属性和方法为 类名/子类名::,代码如下:

    代码如下:

    Person::$country
    Person::myCountry()
    Student::$country

    但静态方法也可以通过普通对象的方式访问.
    例子,声明静态变量,代码如下:

    代码如下:

    <?PHP 
       function foo(){ 
       static $int = 0;// correct 
       static $int = 1+2;   // wrong (as it is an expression) 
       static $int = sqrt(121); // wrong (as it is an expression too) 
       $int++; 
       echo $int; 
       } 
    ?>

    例子,使用静态变量的例子,代码如下:

    代码如下:

    <?PHP 
       function Test() 
       { 
       static $w3sky = 0; 
       echo $w3sky; 
       $w3sky++; 
       } 
    ?>

    现在,每次调用 Test() 函数都会输出 $w3sky 的值并加一.

    静态变量也提供了一种处理递归函数的方法,递归函数是一种调用自己的函数,写递归函数时要小心,因为可能会无穷递归下去,必须确保有充分的方法来中止递归,一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止.

    例子,静态变量与递归函数,代码如下:

    代码如下:

    <?PHP 
       function Test() 
       { 
       static $count = 0; 
        
       $count++; 
       echo $count; 
       if ($count < 10) { 
       Test(); 
       } 
       $count--; 
       } 
    ?>

    注:静态变量可以按照上面的例子声明,如果在声明中用表达式的结果对其赋值会导致解析错误.


    在php中,访问类的方法/变量有两种方法:
    1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问。
    2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件:
    A. 如果是变量,需要该变量可访问。
    B. 如果是方法,除了该方法可访问外,还需要满足:
    b1) 如果是静态方法,没有特殊条件;
    b2) 如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题。

    然后我们再看一下使用$object->… 和使用class::… 都有什么区别:
    1. 使用$object->… ,需要执行构造函数创建对象;
    2. 使用class::… 调用静态方法/变量,不需要执行构造函数创建对象;
    3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象。

    然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?
    差异还是显然存在的,如下:
    1. 静态变量
    静态成员只保留一个变量值,而这个变量值对所有的实例都是有效,也就是说,所有的实例共享这个成员。
    2. 静态方法
    静态方法可以直接使用class::… 来调用,而非静态方法需要满足一定限制条件才能使用class::.. 的方法调用,如之前所述

    以上就是php中静态类与静态变量的用法及区别的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 区别 用法
    上一篇:关于php 静态变量的问题 下一篇:php 面向对象中常用的关键字和魔术方法详解
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• PHP如何使用xlswriter进行大数据的导入导出?(详解)• PHP的substr函数怎么完全模拟ASP的right函数 • javascript打开文件有关问题 • PHP常用字符串处置函数 • js 弹窗出现乱码了解决方案
    1/1

    PHP中文网