php class中self,parent,this的區別,以及執行個體
我容易混淆public,private,protected,還容易混淆this,self這些東西。前面已經寫了一篇關於public,private,protected博文了,下面來說一下this,self,parent的用法
一,this
1,要用this,你必有是一個對像的形勢,不然它會報錯的,Fatal error: Using $this when not in object context。
2,this可以調用本類中的方法和屬性,也可以調用父類中的可以調的方法和屬性
二,self
1,self可以訪問本類中的靜態屬性和靜態方法,可以訪問父類中的靜態屬性和靜態方法。
2,用self時,可以不用執行個體化的
三,parent
1,parent可以訪問父類中的靜態屬性和靜態方法。
2,用parent時,可以不用執行個體化的
'; public $tank = 'zhangying
'; public function __construct(){ $this->public = 'public
'; $this->private = 'private
'; $this->protected = 'protected
'; } public function tank(){ //私人方法不能繼承,換成public,protected if (!isset(self::$instance[get_class()])) { $c = get_class(); self::$instance = new $c; } return self::$instance; } public function pub_function() { echo "you request public function
"; echo $this->public; } protected function pro_function(){ echo "you request protected function
"; echo $this->protected; } private function pri_function(){ echo "you request private function
"; echo $this->private; } static function sta_function(){ echo "you request static function
"; }}class test1 extends test{ static $love = "tank
"; private $aaaaaaa = "ying
"; public function __construct(){ parent::tank(); parent::__construct(); } public function tank(){ echo $this->public; echo $this->protected; echo $this->aaaaaaa; $this->pro_function(); } public function test1_function(){ echo self::$love; echo self::$good; echo parent::$good; echo parent::$tank; //Fatal error: Access to undeclared static property: test::$tank echo self::$tank; //Fatal error: Access to undeclared static property: test::$tank } static function extends_function(){ parent::sta_function(); self::pro_function(); echo "you request extends_private function
"; }}error_reporting(E_ALL);$test = new test1();$test->tank(); //子類和父類有相同名字的屬性和方法,執行個體化子類時,會調用子類中的方法。test1::test1_function();test1::extends_function(); //執行一部分後,報Fatal error: Using $this when not in object context in D:\xampp\htdocs\mytest\www4.php on line 32?>
?
1,當我們調用$test->tank();這個方法時,tank裡面的$this是一個對像,這個對像可以調用本類,父類中的方法和屬性,
2,test1::test1_function();當我們用靜態方法去調用非靜態方法時,會顯示警告的,Non-static method test::test1_function() should not be called statically可以看出不,self可以調用本類,父類中的靜態屬性,parent可以調用父類中的靜態屬性,二者調用非靜態屬性會報錯。代碼中有注釋
3,test1::extends_function();這一步會報錯,報在非對像中使用$this。為什麼會這樣呢,test1::extends_function();只是調用了class中的一個方法,並沒有執行個體化,所以根本不存在什麼對像,當父類中用到$this時,就會報錯