静态变量
,静态方法
和常量
是随着类的加载而加载的,而其他普通变量
是随着类的实例化而加载的。
- 在类中使用
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后该进程是一直在挂起的,也就是对象并没有释放,也就解释了其中对象属性也没释放了。
网友评论