php物件導向 $this關鍵字用法詳解

來源:互聯網
上載者:User

在前面我們知道,在對象外部存取對象成員屬性和方法,使用對象的引用來完成。而在對象內部中,成員方法訪問自己對象中的其它成員屬性或者成員方法,要使用特殊的對象引用"$this->值"的形式來訪問,成員屬於哪個對象,$this引用就代表哪個對象,並且只能在對象的成員方法中使用。

為瞭解決php類和對象中變數與屬性的命名衝突和不確定性問題,引入了”$this”關鍵字來調用當前的對象。

在類中調用當前對象的屬性和方法,必須使用”$this->”關鍵字;$this在建構函式中指該建構函式所建立的新對象;方法內的局部變數不屬於對象,不使用$this關鍵字取值。使用$this關鍵字,我們可以在類中調用對象屬性或者方法。

1、調用變數

執行個體:

 代碼如下 複製代碼
<?php
 class user{
  private $n;
  function __construct(){
   $name="Mike";
   echo $this->n=$name;
  }
 }
 $p=new user();
?>

2、調用方法

執行個體:

 代碼如下 複製代碼

<?php
 class cal{
  public function sum($a,$b){
   return $a+$b;
  }
  public function prt($a,$c){
   return $a*$c;
  }
  public function result($a,$b,$c){
   $a=$this->sum($a,$b);
   return $this->prt($a,$c);
  }
 }
 $c=new cal();
 echo "(2+3)*10= " .$c->result('2','3','10');
?>


我們來看一下下面的例子,$this在做了什嗎?

 代碼如下 複製代碼
class Person{
//下面是人的成員屬性
var $name; //人的名子
var $sex; //人的性別
var $age; //人的年齡
//定義一個構造方法參數為屬性姓名$name、性別$sex和年齡$age進行賦值
function __construct($name="", $sex="", $age=""){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//這個人可以說話的方法, 說出自己的屬性
function say() {
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>";
}
//對象複製時自動調用的方法, 如果想在複製後改變原對象的內容,需要在__clone()中重寫原本
的屬性和方法
function __clone(){
//$this指的複本p2, 而$that是指向原本p1,這樣就在本方法裡,改變了複本的屬性。
$this->name="我是假的$that->name";
$this->age=30;
}
}
$p1=new Person("張三", "男", 20);
$p2=clone $p1;
$p1->say();
$p2->say();
?>

上例輸出:

執行結果
我的名子叫:張三性別:男我的年齡是:20
我的名子叫:我是假的張三性別:男我的年齡是:30

我們來看一下上面的代碼中$this做了什麼:

1、訪問對象內部的成員,如$this->name

2、訪問對象的其它方法,如在say()方法內部訪問了其之外的$this->run()和$this->eat("apple")方法。

另外還有一點值得注意的是,局部變數和成員屬性可以同名,但作用範圍和訪問方式不一樣,如在eat()方法體內的$name相當於局部變數,其作用範圍只限於eat方法內部,而Person的成員屬性聲明部分的 $name,則相當於全域變數,可以其它方法中使用$this->name的形式訪問。

 代碼如下 複製代碼

< ?php  
class UserName 
{  
//定義屬性  
private $name; 
//定義建構函式 
function __construct( $name ) 

$this->name = $name;
//這裡已經使用了this指標 

//解構函式 
function __destruct(){}  
//列印使用者名稱成員函數 
function printName() 

print( $this->name );
//又使用了PHP關鍵字this指標 

}  
//執行個體化對象 
$nameObject = new UserName
( "heiyeluren" );  
//執行列印 
$nameObject->printName();
 //輸出: heiyeluren 
//第二次執行個體化對象 
$nameObject2 = new UserName( "PHP5" ); 
//執行列印 
$nameObject2->printName(); //輸出:PHP5 
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.