靜態(tài)變量
罗捎,靜態(tài)方法
和常量
是隨著類的加載而加載的,而其他普通變量
是隨著類的實例化而加載的常挚。
- 在類中使用
self
關(guān)鍵字調(diào)用靜態(tài)變量或者靜態(tài)方法蛙吏,在類外使用類名
調(diào)用靜態(tài)變量和靜態(tài)方法源哩。
<?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();
- 靜態(tài)方法只能調(diào)用靜態(tài)變量或者常量,普通方法內(nèi)可調(diào)用靜態(tài)變量和常量。
1)靜態(tài)方法鸦做,靜態(tài)變量和常量是在類加載時候會一同加載励烦,以至于在靜態(tài)方法中可以獲取到靜態(tài)變量和常量,所以在靜態(tài)方法中是可以使用關(guān)鍵字self
調(diào)用靜態(tài)變量或者常量的。
2)普通方法泼诱,普通變量都是在類實例化后才加載的坛掠。類肯定是先加載后被實例化,所以在普通方法中可以調(diào)用靜態(tài)方法坷檩,靜態(tài)變量和常量的却音。
3)靜態(tài)方法中是不能通過this
關(guān)鍵字來調(diào)用普通變量和普通方法改抡,因為普通成員得類實例化后才可以調(diào)用得矢炼。
4) this就是指類的對象。所以在靜態(tài)方法中只能調(diào)用靜態(tài)變量或者常量阿纤,不能使用$this關(guān)鍵字只能使用self::關(guān)鍵字來調(diào)用句灌。 - 靜態(tài)方法,靜態(tài)變量和常量稱為
類屬性
,普通方法,普通變量稱為對象屬性
胰锌。 - 在傳統(tǒng)php中
靜態(tài)變量
在一次請求中是常駐內(nèi)存的骗绕,在swoole中就更不用說了,靜態(tài)變量會伴隨進程的生命周期
资昧,只要變量不銷毀就一直存在內(nèi)存中酬土。普通變量不管在傳統(tǒng)php還是在swoole中只在一次請求中住內(nèi)存的,請求結(jié)束格带,普通變量將會從內(nèi)存中釋放撤缴。
對象屬性是隨著對象的創(chuàng)建而創(chuàng)建的,php中一次請求內(nèi)可以多次實例化對象叽唱,則類中的對象屬性也會重置屈呕。如果在傳統(tǒng)php中的一次請求
內(nèi)無論實例化對象多少次,類屬性是不會重置的棺亭,但是只限于一次請求內(nèi)虎眨,因為傳統(tǒng)php在請求結(jié)束后會釋放所有資源。如果在swoole中镶摘,類屬性將不會局限于在一次請求中嗽桩,而是在整個生命周期內(nèi)都是可用的。
如下是傳統(tǒng)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";
結(jié)果為
b是1
a是1
b是1
a是2
https://mp.weixin.qq.com/s/nTEkdrHM2bv3aRdj4mEQeg钉稍。為什么該文章的對象屬性并沒有釋放涤躲?而是能一直復(fù)用呢?因為該類使用swoole的啟動程序贡未,php MyServer.php后該進程是一直在掛起的种樱,也就是對象并沒有釋放,也就解釋了其中對象屬性也沒釋放了俊卤。