美文网首页
php的静态成员static

php的静态成员static

作者: PENG先森_晓宇 | 来源:发表于2020-01-21 17:18 被阅读0次

    静态变量静态方法常量是随着类的加载而加载的,而其他普通变量是随着类的实例化而加载的。

    • 在类中使用self关键字调用静态变量或者静态方法,在类外使用类名调用静态变量和静态方法。
    <?php
    namespace App\learn;
    
    class Home
    {
        public static $old=1;
    
        public $num;
    
        public function user()
        {
            return self::$old;
        }
    }
    echo Home::$old."\n";
    $home=new Home();
    echo $home->user();
    
    • 静态方法只能调用静态变量或者常量,普通方法内可调用静态变量和常量。
      1)静态方法,静态变量和常量是在类加载时候会一同加载,以至于在静态方法中可以获取到静态变量和常量,所以在静态方法中是可以使用关键字self调用静态变量或者常量的。
      2)普通方法,普通变量都是在类实例化后才加载的。类肯定是先加载后被实例化,所以在普通方法中可以调用静态方法,静态变量和常量的。
      3)静态方法中是不能通过this关键字来调用普通变量和普通方法,因为普通成员得类实例化后才可以调用得。
      4) this就是指类的对象。所以在静态方法中只能调用静态变量或者常量,不能使用$this关键字只能使用self::关键字来调用。
    • 静态方法,静态变量和常量称为类属性,普通方法,普通变量称为对象属性
    • 在传统php中静态变量在一次请求中是常驻内存的,在swoole中就更不用说了,静态变量会伴随进程的生命周期,只要变量不销毁就一直存在内存中。普通变量不管在传统php还是在swoole中只在一次请求中住内存的,请求结束,普通变量将会从内存中释放。
      对象属性是随着对象的创建而创建的,php中一次请求内可以多次实例化对象,则类中的对象属性也会重置。如果在传统php中的一次请求无论实例化对象多少次,类属性是不会重置的,但是只限于一次请求内,因为传统php在请求结束后会释放所有资源。如果在swoole中,类属性将不会局限于在一次请求中,而是在整个生命周期内都是可用的。

    如下是传统php代码

    <?php
    
    namespace App\learn;
    
    class User
    {
        public static $a=0;
        public $b=0;
    
        public function home()
        {
            $this->b++;
            self::$a++;
        }
    }
    
    $user=new User();
    $user->home();
    echo "b是".$user->b."\n";
    echo "a是".User::$a."\n";
    $user=new User();
    $user->home();
    echo "b是".$user->b."\n";
    echo "a是".User::$a."\n";
    
    

    结果为

    b是1
    a是1
    b是1
    a是2
    

    https://mp.weixin.qq.com/s/nTEkdrHM2bv3aRdj4mEQeg。为什么该文章的对象属性并没有释放?而是能一直复用呢?因为该类使用swoole的启动程序,php MyServer.php后该进程是一直在挂起的,也就是对象并没有释放,也就解释了其中对象属性也没释放了。

    相关文章

      网友评论

          本文标题:php的静态成员static

          本文链接:https://www.haomeiwen.com/subject/bfajnctx.html