摘要:定義屬性,包括一個靜態變量構造函數使用來調用靜態變量使用調用必須使用域運算符號打印最次數值實例化對象輸出我們這里只要注意兩個地方,第行和第行。我們知道是指向父類的指針,一般我們使用來調用父類的構造函數。
一、->,=>和::的區別
->前面的變量是一個對象:
$user->friends_count
取對象的friends_count屬性。
$t->homeTimeline($p)
調用對象的homeTimeline方法,方法中傳入一個參數$p
????php新手經常碰到的問題,->、=> 和 :: 這三個家伙是什么分別都是做什么的啊!看著就很暈。
????沒關系,下面我們做一下詳細的解釋,如果你有C++,Perl基礎,你會發現這些家伙和他們里面的一些符號功能是差不多的。
????php‘- >’符號是“插入式解引用操作符”(infix dereference operator)。換句話說,它是調用由引用傳遞參數的子程序的方法(當然,還有其它的作用)。正如我們上面所提到的,在調用PHP的函數的時候,大部分參數都是通過引用傳遞的。PHP中的‘->’功能就和它們在Perl或C++中一樣。下面是一個簡單的解引用的例子:
????在PHP的腳本中‘=>’操作符時很常見的。因為php數組函數很豐富,我們要經常用到數組,因為它操作數據很方便。
$phparr= new array( in => "reply," side => "left", padx => 2m, pady => 2m, ipadx => 2m, ipady => 1m )
????順便說一下,如果你需要用數字“大于等于”的符號,你應該用“>=”而不是“=>”。
????在PHP中“::”這個叫范圍解析操作符,又名域運算符。“::”符號可以認為是與C語言中的“.”相似的,而它更像C++中(Perl)的::類范圍操作符。
????php調用類的內部靜態成員,或者是類之間調用就要用::
下面是一個例子:
class A { static $count = 0; static function haha() { // } function diaoyoug() { self::haha(); self::$count; } } a.b.c; /* C語言中的 */ a::b::c(); // C++ 中的函數 $a::b::c; # Perl 5中的標量二、this,self,parent三個關鍵字從字面上比較好理解,分別是指這、自己、父親。
this是指向當前對象的指針(姑且用C里面的指針來看吧)
==>this是指向當前對象實例的指針,不指向任何其他對象或類。
self是指向當前類的指針
==>self是指向類本身,也就是self是不指向任何已經實例化的對象,一般self使用來指向類中的靜態變量。
parent是指向父類的指針(我 們這里頻繁使用指針來描述,是因為沒有更好的語言來表達)
根據實際的例子來看看
(1) this 1 name = $name; //這里已經使用了this指針 12 ? ? } 13? 14 ? ? //析構函數 15 ? ? function __destruct(){} 16 17 ? ? //打印用戶名成員函數 18 ? ? function printName() 19 ? ? { 20 ? ? ? ? ?print( $this->name ); //又使用了this指針 21 ? ? } 22 } 23 24 //實例化對象 25 $nameObject = new UserName( "heiyeluren" ); 26 27 //執行打印 28 $nameObject->printName(); //輸出: heiyeluren 29 30 //第二次實例化對象 31 $nameObject2 = new UserName( "PHP5" ); 32 33 //執行打印 34 $nameObject2->printName(); //輸出:PHP5 35 ?>
????我們看,上面的類分別在11行和20行使用了this指針,那么當時this是指向誰呢?
????其實this是在實例化的時候來確定指向誰,比如第一次實例化對象 的時候(25行),那么當時this就是指向$nameObject對象,那么執行18行的打印的時候就把print( $this->name )變成了print( $nameObject->name ),那么當然就輸出了"heiyeluren"。
????第二個實例的時候,print( $this- >name )變成了print( $nameObject2->name ),于是就輸出了"PHP5"。
所以說,this就是指向當前對象實例的指針,不指向任何其他對象或類。
(2)self
首先我們要明確一點,self是指向類本身,也就是self是不指向任何已經實例化的對象,一般self使用來指向類中的靜態變量。
1 lastCount = ++selft::$firstCount; //使用self來調用靜態變量,使用self調用必須使用::(域運算符號) 13 ? ? ? ? } 14 15 ? ? ? ? //打印最次數值 16 ? ? ? ? function printLastCount() 17 ? ? ? ? { 18 ? ? ? ? ? ? ?print( $this->lastCount ); 19 ? ? ? ? }? 20 ? ? } 21 22 //實例化對象 23 $countObject = new Counter(); 24 25 $countObject->printLastCount(); //輸出 1 26 27 ?>
我 們這里只要注意兩個地方,第6行和第12行。
我們在第二行定義了一個靜態變量$firstCount,并且初始值為0,那么在12行的時候調用了這個值, 使用的是self來調用,并且中間使用"::"來連接,
就是我們所謂的域運算符,那么這時候我們調用的就是類自己定義的靜態變量$frestCount, 我們的靜態變量與下面對象的實例無關,它只是跟類有關,
那么我調用類本身的的,那么我們就無法使用this來引用,可以使用 self來引用,
因為self是指向類本身,與任何對象實例無關。換句話說,假如我們的類里面靜態的成員,我們也必須使用self來調用。
(3)parent
我們知道parent是指向父類的指針,一般我們使用parent來調用父類的構造函數。
1 name = $name; 13 ? ? } 14 } 15 16 //派生類 17 class Person extends Animal //Person類繼承了Animal類 18 { 19 ? ? public $personSex; //性別 20 ? ? public $personAge; //年齡 21 22 ? ? //繼承類的構造函數 23 ? ? function __construct( $personSex, $personAge ) 24 ? ? { 25 ? ? ? ? ?parent::__construct( "heiyeluren" ); //使用parent調用了父類的構造函數 26 ? ? ? ? ?$this->personSex = $personSex; 27 ? ? ? ? ?$this->personAge = $personAge; 28 ? ? } 29 30 ? ? function printPerson() 31 ? ? { 32 ? ? ? ? ?print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge ); 33 ? ? ?} 34 } 35 36 //實例化Person對象 37 $personObject = new Person( "male", "21"); 38 39 //執行打印 40 $personObject->printPerson(); //輸出:heiyeluren is male,this year 21 41 42 ?>
我們注意這么幾個細節:成員屬性都是public的,特別是父類的,是為了供繼承類通過this來訪問。
我們注意關鍵的地方,第25行: parent::__construct( "heiyeluren" ),這時候我們就使用parent來調用父類的構造函數進行對父類的初始化,
因為父類的成員都是public的,于是我們就能夠在繼承類中直接使用 this來調用。
總結:this是指向對象實例的一個指針,self是對類本身的一個引用,parent是對父類的引用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22492.html
摘要:有了的靜態延遲綁定功能,可以在運行時動態確定歸屬的類。與是被討論最多,也是最容易引起誤用的組合。的用途看完與上述三個關鍵字的區別,的用途是不是呼之即出一句話總結,那就是總是指向當前類及類實例。 轉載請注明文章出處:https://tlanyan.me/self-in-php/ PHP群里有人詢問self關鍵字的用法,答案是比較明顯的:靜態成員函數內不能用this調用非成員函數,但可以用...
摘要:一面向對象的概念什么是面向對象世間萬物皆對象,抽象的也是對象,一切可見或不可見都是對象對象的基本組成對象包含兩個部分對象的組成元素是對象的數據模型,用于描述對象的數據又稱為對象的屬性,或者對象的成員變量對象的行為是對象的行為模型,用于描述對 一、面向對象的概念 1.1 什么是面向對象(object oriented) ?????世間萬物皆對象,抽象的也是對象,一切可見或不可見都是對象 ...
摘要:本文適合閱讀用戶有其他語言基礎的童鞋看完語法教程來回顧一下的童鞋傳送門,想全面看一下語法推薦這里毫無基礎然而天資聰慧頗有慧根不要左顧右看說的就是你,老夫這里有一本從入門到放棄,觀你根骨清奇兩銀子賣給你如何看完本文后你會收獲到什么的變量的定義 本文適合閱讀用戶 有其他語言基礎的童鞋 看完w3cschool語法教程來回顧一下的童鞋(傳送門,想全面看一下php語法推薦這里) 毫無基礎然而天...
摘要:正則表達式作為一個匹配的模板,是由定界符,原子普通字符,例如有特殊功能的字符稱為元字符,例如等以及模式修正符等部分組成的文字模式。正則表達式中可以使用編碼。限定符限定符用來指定正則表達式的一個給定原子必須要出現多少次才能滿足匹配。 正則表達式的定義 正則表達式就是描述字符排列模式的一種自定義的語法規則。由于正則表達式本身具有一套非常完整的、可以編寫模式的語法體系,提供了一種靈活且直觀的...
摘要:是決定正則表達式匹配規則的主要部分。二分隔符分隔符的選擇當使用函數的時候,正則表達式必須由分隔符閉合包裹。果分隔符經常在正則表達式內出現,最好使用其他分隔符來提高可讀性。需要將一個字符串放入正則表達式中使用時,可以用函數對其進行轉義。 一、簡介 1. 什么是正則表達式 正則表達式(Regular Expression)就是用某種模式去匹配一類字符串的一種公式。正則表達式使用單個字符串來...
摘要:中詞法語法分析,生成抽象語法樹,然后編譯成及被執行均由虛擬機完成。通常情況下這部分是可選部分,主要為便于程序的讀寫方便而使用。指令虛擬機的指令稱為,每條指令對應一個。 作者 陳雷編程語言的虛擬機是一種可以運行中間語言的程序。中間語言是抽象出的指令集,由原生語言編譯而成,作為虛擬機執行階段的輸入。很多語言都實現了自己的虛擬機,比如Java、C#和Lua。PHP語言也有自己的虛擬機,稱為Z...
閱讀 3510·2023-04-25 15:52
閱讀 583·2021-11-19 09:40
閱讀 2588·2021-09-26 09:47
閱讀 1028·2021-09-22 15:17
閱讀 3554·2021-08-13 13:25
閱讀 2219·2019-08-30 15:56
閱讀 3467·2019-08-30 13:56
閱讀 2101·2019-08-30 11:27