首頁 >後端開發 >php教程 >php 物件導向基礎

php 物件導向基礎

WBOY
WBOY原創
2016-07-25 09:07:35770瀏覽
  1. class Person
  2. {
  3. //下面是人的成員屬性
  4. var $name; //人的名字子
  5. var $***; //人的性別
  6. var $age; //人的年齡
  7. //下面是人的成員方法
  8. function say() //這個人可以說話的方法
  9. {
  10. echo "這個人在說話";
  11. }
  12. function run() //這個人可以走路的方法
  13. {
  14. echo "這個人在走路";
  15. }
  16. }
  17. ?>
複製程式碼

3.5.如何實例化物件

3.5.如何實例化物件

上面說過php 物件導向程式的單位就是對象,但物件又是透過類別的實例化出來的,既然我們類別會宣告了,下一步就是實例化物件了。當定義好類別後,我們使用new關鍵字來產生一個物件。 $物件名稱 = new  類別名稱(); 物件->屬性 $p1->name; $p2->age; $p3->***; 物件->方法 $p1->say(); $p2->run();
5.7.特殊的引用“$this”的使用現在我們知道瞭如何訪問對像中的成員,是通過“對象->成員”的方式訪問的,這是在對象的外部去訪問對像中成員的形式,那麼如果我想在物件的內部,讓物件裡的方法存取本物件的屬性,或是物件中的方法去呼叫本物件的其它方法這時我們怎麼辦?因為物件裡面的所有的成員都要用物件來調用,包括物件的內部成員之間的調用,所以在PHP裡面給我提供了一個本物件的引用$this, 每個物件裡面都有一個物件的引用$this來代表這個對象,完成對象內部成員的呼叫, this的本意就是「這個」的意思, 上面的實例裡面,我們實例化三個實例對象$P1、 $P2、 $P3,這三個對象裡面各自存在一個$this分別代表物件$p1、$p2、$p3 。
  1. class Person
  2. {
  3. //下面是人的成員屬性
  4. var $name;人的名子
  5. var $***; //人的性別
  6. var $age; //人的年齡
  7. //下面是人的成員方法
  8. function say() //這個人可以說話的方法
{  echo "我的名子叫:".$this->name." 性別:".$this->***." 我的年齡是:".$this- >age."
";}
複製程式碼

8.構造法與析構法 大多數類別都有一種稱為建構函數的特殊方法。當建立一個物件時,它將自動呼叫建構函數,也就是使用new這個關鍵字來實例化物件的時候自動呼叫建構方法。

   建構子的宣告與其它所操作的宣告一樣,只是其名稱必須是__construct( )。這是PHP5的變化,以前的版本中,建構子的名稱必須與類別名稱相同,這種在PHP5中仍然可以用,但現在以經很少有人用了,這樣做的好處是可以使建構函數獨立於類別名,當類別名稱改變時不需要改對應的建構子名稱了。為了向下相容,如果一個類別中沒有名為__construct( )的方法,PHP將搜尋一個php4中的寫法,與類別名稱相同名的建構方法。   格式:function __construct ( [參數] ) { ... ... } 在一個類別中只能宣告一個建構方法,而是只有在每次創建物件的時候都會去呼叫一次構造方法,不能主動的呼叫這個方法,所以通常用它執行一些有用的初始化任務。例如對成屬性在創建物件的時候賦初值。

  1. //建立一個人類
  2. class Person
  3. {
  4. //下面是人類的成員屬性
  5. var $name; //人的名子
  6. var $***; //人的性別
  7. var $age; //人的年齡
  8. //定義一個建構方法參數為姓名$ name、性別$***和年齡$age
  9. function __construct($name, $***, $age)
  10. {
  11. //透過建構方法傳進來的$name給成員屬性$this ->name賦初使值
  12. $this->name=$name;
  13. //經由建構方法傳進來的$***給成員屬性$this->***賦初使值
  14. $this->***=$***;
  15. //透過建構方法傳進來的$age給成員屬性$this->age賦初使值
  16. $this->age=$age ;
  17. }
  18. //這個人的說話方法
  19. function say()
  20. {
  21. echo "我的名子叫:".$this->name." 性別:". $this->***." 我的年齡是:".$this->age."
  22. ";
  23. }
  24. }
  25. //透過建構方法建立3個物件$p1 、p2、$p3,分別傳入三個不同的實參為姓名、性別和年齡
  26. $p1=new Person(“張三”,”男”, 20);
  27. $p2=new Person (“李四”,”女”, 30);
  28. $p3=new Person(“王五”,”男”, 40);
  29. //下面訪問$p1對象的說話方法
  30. $p1->say();
  31. //下面訪問$p2物件中的說話方法
  32. $p2->say();
  33. //下面造訪$p3物件中的說話方法
  34. $p3->say();
  35. ?>
複製程式碼

輸出結果為: 我的名子叫:張三 性別:男 我的年齡是:20 我的名子叫:李四 性別:女 我的年齡是:30 我的名子叫:王五 性別:男 我的年齡是:40

與建構子相對的就是析構函式。析構函數是PHP5新加入的內容,在PHP4中沒有析構函數。析構函數允許在銷毀一個類別之前執行的一些操作或完成一些功能,比如說關閉文件,釋放結果集等,析構函數會在到某個物件的所有引用都被刪除或當物件被明確銷毀時執行,也就是物件在記憶體中被銷毀前呼叫析構函數。與建構子的名稱類似,一個類別的析構函式名稱必須是__destruct( )。析構函數不能帶有任何參數。  格式:function __destruct ( ) { ... ... }

  1. //建立人類
  2. class Person
  3. {
  4. ///下方是人類
  5. class Person
  6. {
  7. //下面是人的成員屬性
  8. var $name; //人的名子
  9. var $***; //人的性別
  10. var $age; //人的年齡
  11. //定義一個建構方法參數為姓名$name、性別$***和年齡$age
  12.   function __construct($name, $***, $age)

  13. {
  14. //透過建構方法傳進來的$name給成員屬性$this->name賦初使值
  15. $this->name=$name;
  16. //透過建構方法傳進來的$***給成員屬性$this->***賦初使值
  17. $this->***=$***;
  18. //經由建構方法傳進來的$age給成員屬性$this->age賦初使值
  19. $this->age=$age;
  20. }
  21. //這個人的說話方法
  22. function say()
  23. {
  24. echo "我的名字叫做: ".$this->name." 性別:".$this->***." 我的年齡是:".$this->age."
  25. ";
  26. }
  27. //這是一個析構函數,在物件銷毀前呼叫
  28. function __destruct()
  29. {
  30. echo “再見”.$this->name.”
”;
  }
複製程式碼

如果給類外部提供接口,可以為私有屬性在類外部提供設置方法和獲取方法,來操作私有屬性.例如:prvate $age; //私有的屬性年齡

  1. function setAge($age) //提供外部一個公有設定年齡的方法
  2. {
  3. if($age130) //在給屬性賦值的時候,為了避免非法值設定給屬性
  4. return;
  5. $this->age=$age;
  6. }
  7. function getAge() / /提供外部一個公有獲取年齡的方法
  8. {
  9. return($this->age);
  10. }
複製程式碼

複製程式碼

複製程式碼
  1. 複製程式碼
  2. 複製程式碼
  3. 上面的方法是為一個成員屬性設定和取得值, 當然你也可以為每個屬性用同樣的方法對其進行賦值和取值的操作,完成在類別外部的存取工作。 JAVABEAN是一樣的! ! !
  4. 10.__set() __get() __isset() __unset()四種方法的應用
  5.    一般來說,總是把類別的屬性定義為private,這比較符合現實的邏輯。但是,對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預先定義了兩個函數“__get()”和“__set()”來獲取和賦值其屬性,以及檢查屬性的“__isset ()”和刪除屬性的方法“__unset()”。 在上一節中,我們為每個屬性做了設定和取得的方法,在PHP5中給我們提供了專門為屬性設定值和取得值的方法,「__set()」和「__get()」這兩個方法,這兩個方法不是預設存在的, 而是我們手工添加到類別裡面去的,像構造方法(__construct())一樣, 類別裡面添加了才會存在,可以按下面的方式來添加這兩個方法,當然也可以以個人的風格來添加:
  6. //__get()方法用來取得私有屬性

  7. private function __get($property_name)
{
{

  if(isset($this->$property_name))

{
return($this->$property_name);}else {{ return(NULL);}}//__set()方法用來設定私有屬性private function __set($property_name, $value){$this- >$property_name = $value;} 複製程式碼

__get() 方法:這個方法用來取得私有成員屬性值的,有一個參數, 參數傳入你要取得的成員屬性的名稱,傳回取得的屬性值, 這個方法不用我們手工的去調用,因為我們也可以把這個方法做成私有的方法, 是在直接取得私有屬性的時候物件自動呼叫的。因為私有屬性已經被封裝上了,是不能直接取得值的(例如:「echo $p1->name」 這樣直接取得是錯誤的),但是如果你在類別裡面加上了這個方法,在使用「echo $p1->name” 這樣的語句直接取得值的時候就會自動呼叫__get($property_name)方法,將屬性name傳給參數$property_name,透過這個方法的內部執行,傳回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方法。 __set()方法:這個方法用來為私有成員屬性設定值的,有兩個參數,第一個參數為你要為設定值的屬性名,第二個參數是要給屬性設定的值,沒有回傳值。這個方法同樣不用我們手工去調用,它也可以做成私有的,是在直接設定私有屬性值的時候自動調用的,同樣屬性私有的已經被封裝上了, 如果沒有__set()這個方法,是不允許的, 例如:$this->name='zhangsan', 這樣會出錯,但是如果你在類別裡面加上了__set($property_name, $value)這個方法,在直接給私有屬性賦值的時候,就會自動呼叫它,把屬性例如name傳給$property_name, 把要賦的值「zhangsan」傳給$value,透過這個方法的執行,達到賦值的目的。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方 法。為了不傳入非法的值, 還可以在這個方法給做判斷。

  1. class Person
  2. {
  3. //下面是人的成員屬性,都是封裝的私有成員
  4. private $name; //人的名子
  5. private $***; //人的性別
  6. private $age; //人的年齡
  7. //__get()方法用來取得私有屬性
  8. private function __get($property_name)
  9. {
  10. echo "在直接取得私有屬性值的時候,自動呼叫了這個__get()方法
  11. ";
  12. if(isset( $this->$property_name))
  13. {
  14. return($this->$property_name);
  15. }
  16. else
  17. {
  18. return(NULL);
  19. }
  20. }
  21. //__set()方法用來設定私有屬性
  22. private function __set($property_name, $value)
  23. {
  24. echo "在直接設定私有屬性值的時候,自動呼叫了這個__set()方法為私有屬性賦值
  25. ";
  26.   $this->$property_name = $value;
  27. }
  28. }
  29. $p1=new Person();
  30. //直接為私有屬性賦值的操作, 會自動呼叫__set()方法進行賦值
  31. $p1->name="張三";
  32. $p1->***="男";
  33. $p1->age=20;
  34. //直接取得私有屬性的值, 會自動呼叫__get()方法,傳回成員屬性的值
  35. echo "姓名:".$p1-> name."
  36. ";
  37. echo "性別:".$p1->***."
  38. ";
  39. echo "年齡:".$p1->age."
  40. ";
  41. ?>
複製程式碼


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn