PHP中的OOP

來源:互聯網
上載者:User

標籤:value   統一   default   調用   iss   自己   get   php檔案   ted   

【面向過程和物件導向】
 * 1、面向過程:專註於解決一個問題的過程。面向過程的最大特點,是由一個個的函數去解決處理這個問題的一系列過程;
 * 2、物件導向:專註於由哪個對象來處理一個問題。物件導向的最大特點,是由一個個具有屬性和方法的功能的類,從類中拿對象,進而處理問題;
 *
 * 【物件導向】
 * 1、什麼是類?
 * 具有相同屬性(特徵)和方法(行為)的一系列個體的集合。類是一個抽象的概念。
 *
 * 2、什麼是對象?
 * 從類中拿到的具有具體屬性的個體,稱為對象。對象是一個具體的個體。
 *
 * 3、類和對象的關係?
 * 類是對象的抽象化,對象是類的具體化。
 * 類僅僅表明這類對象有哪些屬性。但是不能有具體的值,所以類是抽象的。
 * 而對象,是將類所有屬性賦值後,產生具體的個體,所以對象是具體的。

【類的聲明與執行個體化】
  * 1、如何聲明一個類?
  * class 類名{
  *  存取修飾詞 $屬性;
  *  [存取修飾詞] function 方法(){};
  * }
  *
  * 2、聲明一個類的注意事項?
  * ①類名只能有字母數字底線組成,開頭不能是數字,必須符合大駝峰法則;
  * ②類名必須使用class修飾,類名後面一定不能有();
  * ③屬性必須帶存取修飾詞;方法可以不帶存取修飾詞;
  *
  * 3、執行個體化對象及對象屬性方法的調用:
  * $對象名=new 類名();//()可帶可不帶;
  *
  * 類外部調用屬性和方法:
  * $對象名->屬性名稱;//使用->調用屬性時,屬性名稱不能帶$符號!!
  *
  * 類內部調用屬性和方法:
  * $this->屬性名稱;
  *
  *
  * 【常見的修飾符】
  * public、protected、private、var……
  *
  * 【建構函式】
  * 1、什麼是建構函式?
  * 建構函式是類中的一個特殊函數,當我們使用new關鍵字執行個體化對象時,相當於調用了類的建構函式;
  *
  * 2、建構函式有什麼作用?
  * 執行個體化對象時,自動調用,用於給對象的屬性賦初值;
  *
  * 3、建構函式的寫法?
  * ①建構函式名必須與類同名:
  * [public]function Person(){
  *  $this->name=$name
  * }
  * ②使用魔術方法
  *
  * 4、建構函式注意事項:
  * ①第一種寫法,建構函式名,必須與類同名!!!
  * ②如果一個類沒有手寫建構函式,則系統預設會有一個空參構造,因此可以使用new Person();
  *  如果我們寫進了帶參數的建構函式,則將不再有空參構造,也就是不能直接使用new Person();Person後面的()中的參數列表,必須符合建構函式的要求!!(即為形參實參問題);
  * ③如果兩種建構函式同時存在,將使用魔術方法__construct。
  *
  * 5、解構函式:__destruct():
  * ①解構函式在對象被銷毀釋放之前自動調用;
  * ②解構函式不能帶有任何參數;
  * ③解構函式常用於對象使用完以後,釋放資源,關閉資源等;
  *
  * 6、魔術方法:
  * PHP中給我們提供了一系列__開頭的函數,這些函數無需手動調用,會在合適的時機自動調用,這類函數稱為魔術函數(方法);
  *  例如:function __construct(){} 在類new一個對象時自動調用;
  *     function __destruct(){} 在對象被銷毀時時自動調用;
  *  我們要求,除了魔術方法之外,自訂函數與方法不能__開頭;
  *
  *
  * 最後,一般對於功能比較複雜的類,我們會單獨的寫到一個類檔案中。
  * 類檔案的命名,統一小寫,使用"類名.class.php"的方式命名。
  * 在其他檔案中使用這個類時,使用include匯入這個.class.php檔案。

【繼承的基礎知識】 
1、如何?繼承?
 * 給子類加上extends關鍵字,讓子類繼承父類;
 *   eg: class Student extends Person{}

2、實現繼承的注意事項:
 * ①子類只能繼承父類的非私人屬性;
 * ②子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this調用該屬性;
 * ③PHP只能單繼承,不支援一個類繼承多個類。即PHP不允許多重繼承!!!
 *  但是,一個類可以進行多層繼承; 
  eg:class Person{}
 *    class ChengNian extends Person{}
 *    class Student extends ChengNian{}//Student類就同時具有了Person類和ChengNian類的所有屬性和方法;
 3、方法覆蓋:
 * 條件①子類繼承父類;
 * 條件②子類重寫父類已有方法;
 *
 * 符合上述了兩個條件稱為方法覆蓋。覆蓋之後,子類調用的方法將調用子類自己的同名方法;
 *
 * 同樣,除了方法覆蓋,子類也可以具有與父類同名的屬性,進行屬性覆蓋; 
 *
 * 如果子類重寫了父類方法,如何在子類中調用父類的同名方法?
 * parent::方法名();
 *
 * 所以,當子類繼承父類時,需在子類構造中的第一步,首先調用父類構造並進行賦值;
 *   eg:function __construct($name,$sex,$school){
    parent::__construct($name,$sex);
    $this->school=$school;
   }

【封裝的基本概念】
1、什麼是封裝?
通過存取修飾詞,將類中不需要外部存取的屬性和方法進行私人化處理,以實現存取控制。
 >>>注意是實現存取控制,而不是拒絕訪問。也就是說,我們私人化屬性之後,需要提供對應的方法,讓使用者通過我們提供的方法處理屬性。

2、封裝的作用?
 * ①使用者只關心類能夠提供的功能,而不需要關心功能實現的細節(封裝方法)!
 * ②對使用者的資料進行控制。防止設定不合法資料,控制返回給使用者的資料(屬性封裝+set/get方法)!

3、實現封裝操作:
 * ①方法的封裝:
 * 對於一些只在類內部使用的方法,而不想對外不提供試用。那麼,這樣的方法我們可以使用private進行私人化處理;
 *   eg:private function say1(){
    return "我叫{$this->name},今年{$this->age}歲了!</br>";
   }
   function say(){
    echo $this->say1();
   }

②屬性的封裝+set/get方法:
 * 為了控制屬性的設定以及讀取,可以將屬性進行私人化處理,並要求使用者通過我們提供的set/get方法進行設定;
 *   eg:private $age;
    function setAge($age){
    if($age>=0&&$age<=99){
     $this->age=$age;
    }else{
     error_log("年齡設定有誤!");
    }
   }
   function getAge(){
    return $this->age;
   }
    $對象->getAge();
    $對象->setAge(12);

③屬性的封裝+魔術方法;
 *    eg:private $age;
 *    function __get($key){
     switch ($key) {
      case ‘name‘:
       return $this->$key."(這是__get讀取時加上的文字!)</br>";
       
      case ‘age‘:
       return $this->$key."(這是__get讀取時加上的文字!)</br>";
      
      default:
       return $this->$key."(這是__get讀取時加上的文字!)</br>";
       break;
     }
    
   }

function __set($key,$value){
     if($key=="name"){
      $this->$key=$value."(這是__set設定上的文字!)</br>";
     }else{
      $this->$key=$value;
     }
   }

$對象->age;//訪問對象私人屬性時,自動調用__get()魔術方法,並且將訪問的屬性名稱傳給__get()
 * 方法;
   $對象->age=12;//設定對象私人屬性時,自動調用__set()魔術方法,並且將設定的屬性名稱以及屬性值傳給__set()方法 ;
 *    
 *    注意:在魔術方法中,可以使用分支結構,判斷$key的不同,進行不同的操作。

4、關於封裝的魔術方法:
 * ①__set($key,$value):給類私人屬性賦值時自動調用,調用時給方法傳遞兩個參數:需要設定的屬性名稱、屬性值;
 *
 * ②__get($key):讀取類私人屬性時自動調用,調用時給方法傳遞兩個參數:需要讀取的屬性名稱;
 *
 * ③__isset($key):外部使用isset()函數檢測私人屬性時,自動調用。
 *   >>>類外部檢測私人屬性,預設是檢測不到的。false.
 *   所以我們可以使用__isset()函數,在自動調用時,返回內部檢測結果;
  eg:function __isset($name){
    return isset($this->$name);
   }
 *   當外部使用isset($對象名->私人屬性);檢測時,將自動調用上述__isset()返回的結果;
 *
 * ④__unset($key):外部刪除私人屬性是自動調用;
 *   eg:function __unset($name){
    unset($this->$name);
   }
 *   當外部使用unset($對象名->私人屬性);刪除屬性時,自動將屬性名稱傳給__unset();,並交由這個魔術方法處理。

【關鍵字】
1、final:
 * ①final修飾類,此類為最終類,不能被繼承;
 * ②final修飾方法,此方法為最終方法,不能被重寫;
 * ③final不能修飾屬性;

2、static:
 * ①可以修飾屬性和方法,分別稱為靜態屬性、靜態方法,也叫類屬性、類方法。
 * ②靜態屬性、靜態方法,只能使用類名直接調用。
 *   使用“類名::$靜態屬性”、“類名::靜態方法()”
  Person::$sex;   Person::say();
 * ③靜態屬性、方法,在類第一次裝載時就會產生。先於對象產生;
 *
 * ④靜態方法中,不能調用非靜態屬性或方法;非靜態方法可以調用靜態屬性或方法;(因為靜態屬性和方法在類裝載時就已經產生,而非靜態屬性方法此時還沒有執行個體化誕生!)
 * ⑤在類中,可以使用self關鍵字,代指類名;
 *   eg:class Person{
    static $sex="男";
    function __construct($name,$sex){
     $this->name=$name;
     self::$sex=$sex;
    }
   } 
   echo Person::$sex;

⑥靜態屬性是共用的。也就是說new很多個物件也是共用一個屬性;

3、const關鍵字;
 * 在類中聲明常量,不能使用define()函數!必須使用const關鍵字。
 * 與define()聲明類似,const關鍵字聲明不能帶$,必須全部大寫。
 * 常量一旦聲明,不能改變。調用時與static一樣,使用類名調用;Person::常量;

4、 instanceof操作符:
 * 檢測一個對象,是否是某一個類的執行個體(包括父輩 爺爺輩……);
 * 返回布爾值;

【小總結】幾種特殊操作符:
1、.只能連接字串    ""."";
2、=>聲明數組時,關聯鍵與值;["key"=>"value"];
3、->對象(this new出的對象)調用成員屬性、成員方法。
4、::①使用parent關鍵字,調用父類中的同名方法;parent::say()
  ②使用類名(和self),調用類中的靜態屬性靜態方法以及常量;

PHP中的OOP

聯繫我們

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