php 物件導向基礎

來源:互聯網
上載者:User
  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.如何執行個體化對象

上面說過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() //這個人可以說話的方法
  9. {  echo "我的名子叫:".$this->name." 性別:".$this->***." 我的年齡是:".$this->age."
  10. ";
  11. }
複製代碼

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. 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. function __destruct()
  26. {
  27. echo “再見”.$this->name.”
  28. ”;
  29.   }

複製代碼

如果給類外部提供介面,可以為私人屬性在類外部提供設定方法和擷取方法,來操作私人屬性.例如:prvate $age; //私人的屬性年齡

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

上面的方法是為一個成員屬性設定和擷取值, 當然你也可以為每個屬性用同樣的方法對其進行賦值和取值的操作,完成在類外部的存取工作。JAVABEAN是一樣的!!!

10.__set() __get() __isset() __unset()四個方法的應用

   一般來說,總是把類的屬性定義為private,這更符合現實的邏輯。但是, 對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預定義了兩個函數“__get()”和“__set()”來擷取和賦值其屬性,以及檢查屬性的 “__isset()”和刪除屬性的方法“__unset()”。上一節中,我們為每個屬性做了設定和擷取的方法,在PHP5中給我們提供了專門 為屬性設定值和擷取值的方法,“__set()”和“__get()”這兩個方法,這兩個方法不是預設存在的, 而是我們手工添加到類裡面去的,像構造方法(__construct())一樣, 類裡面添加了才會存在,可以按下面的方式來添加這兩個方法,當然也可以按個人的風格來添加:

  1. //__get()方法用來擷取私人屬性

  2. private function __get($property_name)
  3. {

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

  5. {
  6. return($this->$property_name);
  7. }else
  8. {
  9. return(NULL);
  10. }
  11. }
  12. //__set()方法用來設定私人屬性
  13. private function __set($property_name, $value)
  14. {
  15. $this->$property_name = $value;
  16. }
複製代碼

__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. ?>
複製代碼
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.