1.self代表類,$this代表對象
2.能用$this的地方一定使用self,能用self的地方不一定能用$this
靜態的方法中不能使用$this,靜態方法給類訪問的。
今天在使用靜態方法的時候,使用了$this去調用對象的屬性,導致曝出錯誤信息,在網上查詢了手冊和百度,
發現大部分回答只是說明了在靜態方法中不允許使用$this,只能使用self,較為靠譜的回答說明是$this是實例化對象的指針,self是對象的指針。
針對以上信息,綜合自己的學習知識和網上搜索結果作下圖:
其中,我們可以明顯看到,self調用的類的指針,而非實例化后的對象指針,靜態變量和靜態方法始終屬於類,而非屬於實例化后的對象,因此在靜態方法中無法使用$this,因為此時所處的位置是類所在的指針,只能使用self調用靜態方法或者靜態變量。
如果要在靜態方法中,強制使用函數的其他方法,則只能先實例化一個新的對象,然后再使用該對象的方法。
綜上所述,self調用的是類,而$this調用的則是實例化的對象。下面是代碼。
<?php class demo { public $a; public $b; public static $c = 100; public function __construct($a) { $this->a = $a; $this->funct(); } public static function func() { $newObj = new self(20); $newObj->funct(); self::$c += 100; echo self::$c; } private function funct() { $this->b = $this->a * 200; } public function getC() { echo self::$c; } } $demo = new demo(3); $demo::func(); $demo::getC(); $demo2 = new demo(4); $demo2::func(); $demo::getC(); $demo2::getC(); $demo->getC();