天天看點

php class中self,parent,this的差別,以及執行個體

一,this

1,要用this,你必有是一個對像的形勢,不然它會報錯的,fatal error: using $this when not in object context。

2,this可以調用本類中的方法和屬性,也可以調用父類中的可以調的方法和屬性

二,self

1,self可以通路本類中的靜态屬性和靜态方法,可以通路父類中的靜态屬性和靜态方法。

2,用self時,可以不用執行個體化的

三,parent

1,parent可以通路父類中的靜态屬性和靜态方法。

2,用parent時,可以不用執行個體化的

php class中self,parent,this的差別,以及執行個體

<?php  

class test{  

 public $public;  

 private $private;  

 protected $protected;  

 static $instance;  

 static $good = 'tankzhang <br>';  

 public $tank = 'zhangying <br>';  

 public  function __construct(){  

 $this->public    = 'public     <br>';  

 $this->private   = 'private    <br>';  

 $this->protected = 'protected  <br>';  

 }  

 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<br>";  

 echo $this->public;  

 protected  function pro_function(){  

 echo "you request protected function<br>";  

 echo $this->protected;  

 private function pri_function(){  

 echo "you request private function<br>";  

 echo $this->private;  

 static function sta_function(){  

 echo "you request static function<br>";  

}  

class test1 extends test{  

 static $love = "tank <br>";  

 private $aaaaaaa = "ying <br>";  

 public function __construct(){  

 parent::tank();  

 parent::__construct();  

 public function tank(){  

 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<br>";  

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時,就會報錯

php class中self,parent,this的差別,以及執行個體

class a{  

    public function test(){  

        $objthis = new self(); //new a()  

    }  

}