>>>---PHP中的OOP-->面對過程與面對對象基礎概念與內容--(封裝、繼承、多態)

来源:http://www.cnblogs.com/zhuanzhibukaixin/archive/2017/06/10/6979686.html
-Advertisement-
Play Games

前 言 OOP 學習了好久的PHP,今天來總結一下PHP中的重要成員OOP 1、專註於解決一個問題的過程。面向過程的最大特點,是由一個一個的函數去解決處理這個問題的一系列過程。 2、專註於由哪個對象來處理一個問題。面向對象的最大特點,是一個個具有屬性和功能的類,從類中拿到對象,進而處理問題。 1、什 ...


 

 

 

  前  言

 OOP 

  學習了好久的PHP,今天來總結一下PHP中的重要成員OOP

 

1  面向過程&面向對象
   
   1、專註於解決一個問題的過程。面向過程的最大特點,是由一個一個的函數去解決處理這個問題的一系列過程。

       2、專註於由哪個對象來處理一個問題。面向對象的最大特點,是一個個具有屬性和功能的類,從類中拿到對象,進而處理問題。
         

 

2  面向對象
   
    1、什麼是類?
              具有相同屬性(特征)和方法(行為)的一系列個體的集合,類事一個抽象的概念。

         2、什麼是對象?
              從類中,拿到的具有具體屬性值得個體,稱為對象。 對象是一個具體的個體。
     
         3、類和對象的關係?
              類是對象的抽象化!對象是類的具體化!
              類僅僅表明這類對象有哪些屬性,但是不能有具體的值,所以類是抽象的。
              而對象,是將類的所有屬性複製後,產生的具體的個體,所有對象是具體的。
     
         

 

3  類的聲明與實例化
   
   1.如何聲明一個類:
        class  類名{
          訪問修飾符   $屬性;
         [訪問修飾符] function 方法(){}
            }
      2.聲明一個類的註意事項:
        ①類名只能由字母數字下劃線組成,開頭不能是數字,必須符合大駝峰法則;
        ②類名必須使用class修飾,類名後面一定不能有();
        ③屬性必須要帶訪問修飾符,方法可以不帶訪問修飾符;
      3.實例化對象及對象屬性方法的調用
         $對象名 =new 類名();//()可以不帶
         類外部調用屬性和方法:
         $對象名->屬性名;//使用->調用屬性時,屬性名不能帶$
     
         類內部調用屬性和方法:
         $this->屬性名
            
         

 

4  構造函數/析構函數
   
       1、什麼是構造函數?
              構造函數是類中的一個特殊函數,當我們使用new關鍵字實例化對象時,相當於調用了類的構造函數;
     
      2、構造函數有什麼作用?
              實例化對象時,自動調用,用於給對象的虎山行賦初值!
     
      3、構造函數的寫法?
              ① 構造函數名,必須與類同名
              [public] function Person($name){
                      $this->name =$name;
                          }
             
              ② 使用魔術方法__construct
             
              [public] function __construct($name){
                          $this->name =$name;    }
                     
      4、構造函數的註意事項:
              ① 第一種寫法,構造函數名必須與類同名。
              ② 如果一個類沒有手寫構造函數,則系統預設會有一個空參構造,因此可以使用 new Person();
                  如果我們寫了帶參的構造函數,則將不會再有空參構造,也就是不能直接使用new Prenson();Person; Person後面的()中的參數列表,必須符合構造函數的要求!!!!!
              ③ 如果兩種構造函數同事存在,將使用__construct。

      5、析構函數: __destruct():
              ① 析構函數在對象被銷毀釋放之前自動調用!
              ② 析構函數不能帶有任何的參數
              ③ 析構函數常用於對象使用完以後,釋放資源、關閉資源等!
         

 

5  魔術方法 
   
      php,中,給我們提供一系列用__開頭的函數,這些函數無需自己手動調用,會在何時的時機自動調用,這類函數稱為魔術函數。
     
          例如:function __construct(){} 在類new一個對象時自動調用
                function __destruct(){} 在對象被銷毀時自動調用
     
              我們要求,除了魔術方法之外,自定義的函數與方法不能使用__開頭。
     
      最後,一般對於功能比較複雜的類,我們會單獨的寫到一個類文件中。
      類文件的命名,統一小寫,使用“類名小寫.class.php”的方式命名。
      在其他文件中使用這個類時,可以用include導入這個.class.php文件。
     
         

 

6  重點來了--php中的封裝
   
  1、什麼是封裝?
          通過訪問修飾符,將類中不需要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。
          註意:是實現訪問控制,而不是拒絕訪問。也就是說,我們私有化屬性之後,需要提供對應的方法,讓用戶通過我們提供的方法處理屬性。
     
     2、封裝的作用?
     
          ① 使用者只關心類能夠提供的功能,而不必關心功能實現的細節!(封裝方法)
       ② 對用戶的數據進行控制,防止設置不合法數據,空置房會給用戶的數據(屬性封裝 set/get 方法)
     
     3、實現封裝操作?
          ① 方法的封裝
              對於一些只在類內部使用的方法,而不向對外部提供使用。那麼,這樣的方法我們可以使用private 進行私有化處理。
              privatefunction formatName(){}
              function showName(){
                  $this -> formatName();
                  }
       ② 屬性的封裝
              為了控制舒心的設置以及讀取,可以將屬性進行私有化處理,並要求用戶通過我們提供的set/get方法進行設置
              private $age;
              function setAge($age){
              $this->age = $age;
              }
              function getAge($age){
               return this->age
              }
         
             $對象-> setAge("")
              $對象-> getAge("")
     
          ③ 屬性的封裝+set/get 方法
              private $age;
              function __get($key){
                  return $this->$ket;    
              }
             
              function __set($key,$value){
                  return $this->$key=$value
                  }
              $對象->age;    //訪問兌現公司有屬性是,自動調用__get()魔術方法,並將訪問的屬性名傳給__get()方法。    
              $對象->age=12;    //設置對象私有屬性時,自動調用__set()魔術方法,並且將這是的屬性名以及屬性值傳給__set()方法;
     
      註意:在魔術方法中,可以使用分支結構,判斷$key的不同,進行不同操作。
     
      4、關於封裝的魔術方法:
              ① __set($key,$value):給類私有屬性賦值時自動調用,調用時給方法傳遞兩個參數:需要設置的屬性名、屬性值
              ② __get($key):讀取類私有屬性是自動調用,調用時給方法傳遞一個參數:需要讀取的屬性名;
              ③ __isset($key):外部使用isset()函數檢測私有屬性是,自動調用。。
                  >>> 類外部使用 isset();檢測私有屬性,預設是檢測不到的。  false
                  >>> 所以,我們可以是用__isset();函數,在自動調用時,返回內側檢測結果。
              function __isset($key){
                  return isset($this->$key);    
              }        
             
              當外部使用isset($對象名->私有屬性);檢測時,將自動調用上述__isset()返回結果!
              ④ __unset($key):外部使用unset()函數刪除私有屬性時,自動調用;
              function __unset($key){
                  unset($this->$key);
              }
              當外部使用unset($對象名->私有屬性);刪除屬性時,自動將屬性名傳給__unset(),並交由這個魔方方法處理。
             
         

 

 1     class Person{
 2         private $name;
 3         private $age;
 4         private $sex;
 5         public  function __construct($name,$age,$sex){
 6             $this->name=$name;
 7             $this->age=$age;
 8             $this->sex=$sex;
 9         }
10         function __isset($key){
11              return  isset($this->$key);
12         }
13         function __unset($name){
14             if($name=="name"){
15                 echo "<span style='color:red;'>刪除不掉name</span><br>";
16                 return;
17             }
18               unset($this->$name);
19               return;
20         }
21         function __set($key,$value){
22             if($key=="name"){
23                 $this->$key=$value."這是set出的。";
24                 return;
25             }
26                 $this->$key=$value;
27         }
28         function setAge($age){
29             if($age<=120&&$age>=0){
30                 $this->age =$age;
31             }else{
32              error_log("年齡設置有誤");
33             }
34         }
35         function getAge($age){
36             return "但是我永遠18歲,哈哈哈哈哈哈。" ;
37         }
38         function __get($key){
39             return $this->$key."hahahah";
40         }
41         private function formateName(){
42             return "我叫{$this->name},我今年{$this->age}歲了!<br>";
43         }
44         public function say(){
45             echo $this->formateName();
46         }
47     }
48     $zhangsan = new Person("張三豐",14,"男");
49     //$zhangsan->setAge(99);
50     //$zhangsan->say();
51     //echo $zhangsan->getAge("88");
52     //$zhangsan->name="李四";
53     // $zhangsan->name="李四";
54      echo $zhangsan->name;
55      echo $zhangsan->age;
56     var_dump(isset($zhangsan->age));
57     unset($zhangsan->age);
繼承的一點演示代碼

 

7  重點來了--php中的繼承
   
  1、如何實現繼承?
              給子類使用extends關鍵字,讓子類繼承父類;
              class Stydent extends Person{}
     
      2、實現繼承的註意事項?
             ① 子類只能繼承父類的非私有屬性;
              ② 子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this調用該屬性。
              ③  PHP只能單繼承,不支持一個類繼承多個類。但是一個類進行多層繼承。
                class Person{};
                class ChengRen extends Person{};
                class Student extends ChengRen{};
                 //Student 類就同事具有了ChengRen類和Person的屬性和方法。
     
      3、方法覆蓋(方法重寫)
              ① 子類繼承父類;
              ② 子類重寫父類已有方法。
             
              符合上述兩個條件,稱為方法覆蓋。覆蓋之後,子類調用方法,將調用子類的的方法。
     
              同樣,除了方法覆蓋,子類也可以具有與父類同名的屬性,進行屬性覆蓋。
             
     
              如果,子類重寫了父類方法,如何在子類中調用父類同名方法?
              partent:: 方法名();
             
              所以,當子類繼承父類時,需在子類的構造中的第一步,首先調用父類構造進行輔助。
              function __construct($name,$sex,$school);
              partent::__construct($name,$sex);
              $this->school = $school;。
         

 

 1 class Person{
 2         public    $name;
 3         public $sex;
 4         
 5         
 6         
 7         public function __construct($name,$sex){
 8             $this->name=$name;
 9             $this->sex=$sex;
10         }
11         
12         public function say(){
13             echo "我叫{$this->name},我是{$this->sex}生!  <br> ";
14         }
15     }
16     
17     class Student extends Person{
18         public $school;
19         public function __construct($school){
20             $this->school=$school;
21         }
22         
23         public function say(){
24             parent::say();
25             echo "我叫{$this->name},我是{$this->sex}生!  <br> ";
26         }
27         function say1(){
28             echo "今天下雨了,啦啦啦啦啦。<br>";
29         }    
30     }
31     
32     $lalala = new Student("每天學習");
33     $lalala->name= "lalala";
34     $lalala->sex="不詳";
35     $lalala->say();
36     $lalala->say1();
封裝的一點演示代碼

 

8  重點來了--php中的繼承

    1、一個類,被多個子類繼承。    
           如果,這個類的某個方法,在多個子類中,表現出不同的功能,我們稱這種行為為多態。
        
          2、實現多態的必要途徑;
              ① 子類繼承父類;
              ② 子類重寫父類方法;
              ③ 父類引用指向子類對象;
        
         

 

 1  abstract class Person{
 2 
 3             abstract function say();
 4             function say1(){
 5                 echo "我是Say1";
 6             }
 7         } 
 8         class Chinese extends Person{
 9             function say(){
10                 echo "我是一個中國人<br>";
11             }
12         }
13           class English extends Person{
14             function say(){
15                 echo "I'am a English";
16             }
17         }
18         
19     /*$a = new Chinese();
20     $a->say();
21         
22     $b = new English();
23     $b->say();    */ 
24     
25     function func(Person $p){
26         $p->say();
27     }
多態的一點演示代碼

 

學習時候的筆記,可能會有一些錯誤的地方,歡迎各位的批評指點。

反思,復盤,每天收穫一點---------------------期待更好的自己


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • package com.mstf.aes; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmExcep... ...
  • RSAsecurity.java RSAtest.java ...
  • 背景: 線上機器,需要過濾access日誌,發送給另外一個api 期初是單進程,效率太低,改為多進程發送後,查看日誌中偶爾會出現異常錯誤(忘記截圖了。。。) 總之就是埠不夠用了報錯 原因: 每一條日誌都是一次請求發送給api,短連接產生大量time_wait狀態,占用了大量埠 這種高併發導致的大 ...
  • 示例代碼 之前的文章說過,對於MyBatis來說insert、update、delete是一組的,因為對於MyBatis來說它們都是update;select是一組的,因為對於MyBatis來說它就是select。 本文研究一下select的實現流程,示例代碼為: selectMailById方法的 ...
  • 前幾天本來想以debug模式看一下JDK的源碼,進入調試模式時才發現,根本看不到方法裡面變數值的情況。為什麼呢?JDK現在的版本中,編譯過後,去除了裡面的調試信息。解決辦法是,編譯那些類,使其帶有調試信息,使用命令:javac -g 查看了一些相關資料,現將解決方法放到下麵 說明:JDK_HOME表 ...
  • 介紹OpenCL與D3D 10之間的互操作。 1.初始化OpenCL上下文實現Direct3D互操作 OpenCL共用由pragma cl_khr_d3d10_sharing啟用: #pragma OPENCL EXTENSION cl_khr_d3d10_sharing: enable 啟用D3D ...
  • java 企業網站源碼 前後臺都有 靜態模版引擎, 代碼生成器大大提高開發效率 前臺: 支持三套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對服務 ...
  • 單點登錄SSO方案選型與架構開發實戰。有示例的動畫演示。 從業十多年,為政府、電信、跨國公司顧問和實施的單點登錄解決方案無數,深諳其痛點與關鍵。 大部分單點登錄方案,從產品方案選型起就存在根本性問題,往往導致: 1. 受困於諸多被集成系統的改造。 2. 依賴特定終端,甚至特定瀏覽器。 3. ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...