最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP的秘密(四) 静态属性和静态方法

    正文概述 转载于:掘金(传达室老大爷)   2021-06-24   333

    静态是什么?

    我们之前讲到, 调用成员变量和方法, 都需要用到对象. 但如果我们不想实例化, 直接访问变量和方法呢? 这就用到了静态static功能.

    在定义变量和方法的时候, 在前面加上static关键词, 就转化为了静态, 就可以通过类名::双引号直接进行访问.

    我们继续将上面的例子改写为静态变量和静态方法:

    class Classname          //定义一个类, 类名不区分大小写
    {
    static public $name;      //定义静态成员变量;
    static public $height=180;    //初始化赋值
    static public $weight, $nationality; //可以一个语句定义多个变量
    static protected $age;
    
    static public function player($name,$height, $weight, $age, $sex)
    {                    //定义静态成员方法, 以及方法形参
        self::$name=$name;                 //为成员变量赋值, 使用了代词self::
        self::$weight=$weight;
        self::$height=$height;
    
        if (self::$height<185 && self::$weight<=85){
            return self::$name.',符合要求';
        }else{
            return self::$name.',不太行';
        }
    }
    }
    echo Classname::$height;              //180, 通过类名::访问静态变量
    echo Classname::player('xiaoming',180,80,22, 'Male');  //通过类名::访问静态方法;
    

    上面的例子可以注意到, 我将所有的$this都换成了self. 因为$this指代的是调用对象, 而self指代的方法所在的类本身. 静态方法可以通过类名::直接调用, 这里没有对象, \$this指代的就为空, 系统就会报错. 所以静态方法内调用变量, 不能通过$this.

    注意self::后面的变量要有$符号.

    静态的本质

    不要小瞧这个static, 加上了它, 其实不只是可以直接调用这么简单, 成员变量和方法的意义发生了本质上的变化:

    在静态方法中只能调用静态变量, 而不能调用普通变量, 普通方法则可以调用静态变量. 这是由静态方法的属性决定的, 因为普通的成员变量是与"对象"绑定的, 而静态变量是与"类"绑定的.

    我再详细解释一下静态变量和普通变量的区别:

    1. 普通的成员变量与对象绑定, 不同的对象都有一套属于自己的成员变量. 不同对象的成员变量都有各自的赋值, 虽然有可能相同, 但你的就是你的.

    2. 静态变量是和类绑定的. 如果静态变量改变了, 那么这个类所有的对象中, 这个值都会发生改变.

    3. 静态变量也可以通过对象::来进行访问, 但其实同一个类的对象访问的其实都是同一个静态变量值. 可以理解为静态变量是整个类共享的, 包括它的子类.

    4. 所以即便其中一个对象被销毁了, 静态变量值还会保留.

    5. 子类也可以重写父类的静态成员变量, 但父类的静态变量依然存在, 这两个静态成员变量是独立的. 会根据调用的类名分别进行访问.

    我们举个例子:

    class Shouji
    {
        static public $test;           //定义一个静态变量
        static function test5()        //定义静态方法来操作并输出静态变量
        {
            self::$test++;
            echo self::$test;
        }
    }
    class Shouji2 extends  Shouji          //定义一个子类
    {
        static function test5()           //定义子类的静态方法
        {
            self::$test++;                 //访问并操作父类的静态变量
            echo self::$test;
        }
    }
    $shouji1=new Shouji;               //新建父类对象
    $shouji1->test5();     //1, 通过对象调用静态方法
    $shouji2=new Shouji;   //新建另一个父类对象
    $shouji2->test5();    //2,  在前一次操作基础上继续+1
    $shouji3=new Shouji2;    //新建子类对象
    $shouji3->test5();    //3, 调用子类同名静态方法, 继续+1
    echo Shouji::$test;    //3, 通过父类::直接访问静态成员变量
    echo $shouji1::$test;   //3, 通过对象名::可以直接访问静态成员变量
    

    通过上面这个例子, 我们还能有以下几点总结:

    1. 子类可以重写父类的静态方法.

    2. 方法内访问静态变量需要用::符号. 不能用$this;

    3. 静态方法和静态变量都会被子类继承.

    4. 静态变量不能由->访问, 而是由 ::(双冒号)进行访问

    5. 对象可以通过对象名->来直接调用静态成员方法, 这个和调用普通方法是一样的.

    总结不易, 请勿私自转载, 否则别怪老大爷不客气!

    参考资料:

    WWW.php.NET PHP官方文档


    起源地下载网 » PHP的秘密(四) 静态属性和静态方法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元