日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象知识点

發布時間:2024/9/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象知识点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面向對象編程

第 1 章?????????? 類與對象................................................................................................................ 1

1.1???????????????? 學習技術的套路??????????????????????????????????????????????????????????????????????????????????????????????????????? 1

1.2???????????????? 看一個實際的需求??????????????????????????????????????????????????????????????????????????????????????????????????? 1

1.3???????????????? php支持面向對象????????????????????????????????????????????????????????????????????????????????????????????????????? 3

1.4???????????????? 類與對象的關系??????????????????????????????????????????????????????????????????????????????????????????????????????? 4

1.5???????????????? 如果理解類與對象??????????????????????????????????????????????????????????????????????????????????????????????????? 6

1.6???????????????? 類的定義????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6

1.7???????????????? 成員屬性????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6

1.8???????????????? 創建對象的說明??????????????????????????????????????????????????????????????????????????????????????????????????????? 7

1.9???????????????? 對象傳遞方式(重點, 難點)???????????????????????????????????????????????????????????????????????????????????????? 9

1.10?????????????? 成員方法(函數)?????????????????????????????????????????????????????????????????????????????????????????????????????? 10

第 2 章?????????? 構造方法(函數)..................................................................................................... 14

2.1???????????????? 一個需求,引出構造函數??????????????????????????????????????????????????????????????????????????????????????? 14

2.2???????????????? 構造函數的基本介紹?????????????????????????????????????????????????????????????????????????????????????????????? 14

2.3???????????????? 快速入門案例????????????????????????????????????????????????????????????????????????????????????????????????????????? 14

2.4???????????????? 構造函數的細節和注意事項???????????????????????????????????????????????????????????????????????????????????? 15

2.5???????????????? 默認構造函數????????????????????????????????????????????????????????????????????????????????????????????????????????? 16

2.6???????????????? 構造函數的小結????????????????????????????????????????????????????????????????????????????????????????????????????? 18

2.7???????????????? 類定義的進一步完善?????????????????????????????????????????????????????????????????????????????????????????????? 18

第 3 章?????????? 析構函數............................................................................................................... 20

3.1???????????????? 簡單的介紹???????????????????????????????????????????????????????????????????????????????????????????????????????????? 20

3.2???????????????? php文件執行的流程???????????????????????????????????????????????????????????????????????????????????????????????? 20

3.3???????????????? 析構函數的基本使用?????????????????????????????????????????????????????????????????????????????????????????????? 21

3.4???????????????? 析構函數的小結????????????????????????????????????????????????????????????????????????????????????????????????????? 22

3.5???????????????? 析構函數的最佳實踐?????????????????????????????????????????????????????????????????????????????????????????????? 22

3.6???????????????? 垃圾回收機制????????????????????????????????????????????????????????????????????????????????????????????????????????? 24

3.7???????????????? 類定義的完善????????????????????????????????????????????????????????????????????????????????????????????????????????? 25

?

?

第 1 章 類與對象

1.1 學習技術的套路

1.2 看一個實際的需求

?

  • 使用現有的技術來解決
  • ?

  • 使用面向對象的方式來解決
  • 代碼來一個快速入門的案例
  • 說明
  • class 是一個關鍵字,表示這是一個類,不能修改
  • public $name , 是一個成員屬性, 當我們類定義的{} 中定義的變量,就是一個成員屬性
  • public 是訪問修飾符, 他是用于控制成員屬性(變量)的訪問范圍的, 除了public還有兩個,protected 和 private ,后面我們會詳細介紹
  • $cat1 = new Cat , 這個叫實例化一個對象, $cat1 就是一個對象, new 是一個關鍵字,表示新創建一個對象
  • $cat1->name = '小白'; 表示給成員屬性賦值,-> 符號叫做對象運算符
  • 當我們需要看一個對象的情況時,我們可以通過 var_dump 來輸出該對象
  • 1.3 php支持面向對象

    ?

    職業規劃:

    PHP + 前端技術 ===> 全棧工程師

    架構師

    python(對項目架構和運維[負載,讀寫分離,優化等等 ,大流量,大并發,大數據]) + linux(centos/ubuntu) + unix(freebsd, solars) + 算法

    cto => 首先技術官

    ceo => 首先執行官

    1.4 類與對象的關系

  • 介紹
  • 在面向對象編程中,最重要的概念就是 類 和對象,因此我們必須將他們的關系和區別搞清楚.

    舉例說明:

    說明: 從上面的代碼我們可以看出

  • 一個類可以創建多個對象
  • 不同的對象的標識符#編碼,是不一樣的,有系統在創建對象時分配的標識符,按編號的順序分配
  • 1.5 如果理解類與對象

    1.6 類的定義

    class? 類名{

    ????? 訪問修飾符 成員屬性1;

    ?? 訪問修飾符 成員屬性2;

    ????? //.....

    }

    1.7 成員屬性

  • 文檔說明
  • 類的變量成員叫做“屬性”,或者叫“字段”、“特征”,在本文檔統一稱為“屬性”。屬性聲明是由關鍵字 public,protected 或者 private 開頭,然后跟一個普通的變量聲明來組成。屬性中的變量可以初始化,但是初始化的值必須是常數,這里的常數是指 PHP 腳本在編譯階段時就可以得到其值,而不依賴于運行時的信息才能求值。

  • 通俗說明:
  • 成員屬性是類的一個組成部分,一般是基本數據類型(整數,字符串等),

    也可是復合類型(對象、數組) 資源類型。比如我們前面定義貓類的

    public $age 就是成員屬性。

  • 代碼舉例說明
  • ?

    1.8 創建對象的說明

    說明

  • 在使用默認構造方法時,創建對象的
  • $對象名? =? new 類名()

    $對象名? =? new 類名

    等價

    舉例:

  • 如何訪問成員屬性
  • 類名的規范說明
  • 類名不區分大小寫.

    類名命名規范

    關于函數,變量,常量,接口等等的命名規范,請參考手冊.

    ?

    1.9 對象傳遞方式(重點, 難點)

  • 先請大家看一段代碼,從而引起思考
  • ?

    ?

    注意當 對象傳遞方式是 $p1 = $p2 , 分析如上圖

    ?

    注意當 對象傳遞方式是 $p1 = &$p2 , 分析如上圖

    ?

    1.10成員方法(函數)

  • 看一個需求
  • 當我們需要讓對象完成某個任務(比如計算,比如上傳下載文件,分頁等等), 就需要在類中定義函數, 這時我們就將這樣的函數稱為 成員方法.

    ?

  • 舉例說明:
  • 代碼走:

    ?

    原理分析圖如下:

    ?

  • 成員方法的基本語法
  • class? 類名{

    ????? 成員屬性;

    訪問修飾符? function? 成員方法1名(形參){

    ??? 方法體;

    ???? ??return 語句;//[是有程序員自己決定的,]

    }

    訪問修飾符? function? 成員方法1名(形參){

    ??? 方法體;

    return 語句;//

    }

    ?

    }

    ?

    說明

  • 成員方法定義在類中.
  • 成員方法前面可以有訪問修飾符,如果你不寫,默認為public
  • 成員方法的運行原理和普通的函數是一樣的.
  • 成員方法的小結
  • 類定義的進一步完善
  • ?

    第 2 章 構造方法(函數)

    2.1 一個需求,引出構造函數

    什么是構造函數呢?在回答這個問題之前,我們來看一個需求:前面我們在創建人類的對象時,是先把一個對象創建好后,再給他的年齡和姓名屬性賦值,如果現在我要求,在創建人類的對象時,就指定這個對象的年齡和姓名,該怎么做?

    2.2 構造函數的基本介紹

  • 基本語法
  • class? 類名{

    ????? //構造函數

    ????? 訪問修飾符 function? __construct(形參列表){

    ?????? //可以對成員屬性進行初始化.

    }

    }

    ??? ?????? 說明

  • 構造函數的訪問修飾符可以是 public , protected, private , 一般情況下是public ,默認就是public
  • __construct 是關鍵字,不能修改, __ 是兩個_ 下劃線。
  • 構造函數沒有返回值, 即沒有return
  • 構造函數是系統調用的,程序員不能顯示調用
  • 2.3 快速入門案例

    走代碼:(基本的使用案例)

    2.4 構造函數的細節和注意事項

  • 構造函數沒有返回值,即沒有return, 就算寫了也沒有用處
  • 在創建一個類的新對象時,系統會自動的調用該類的構造方法完成對新對象的初始化
  • 構造函數的作用是完成對成員屬性的初始化任務,而不是創建對象本身. 所以以后在oop編程中,需要對成員屬性進行初始化,則將這段代碼放在構造函數中即可
  • 在一個類中,構造函數有且只能有一個, 如果定義多個,就會報錯.
  • 在php4中,可以使用 類名作為構造函數,在php5中也支持
  • 2.5 默認構造函數

  • 如果在類中,沒有定義構造函數,那么會有一個默認的構造函數,形式如下,舉例說明
  • 如何將一個對象的屬性輸出并顯示
  • 說明: 通過上面的案例,我們講解了兩個重要的點

  • 如果顯示成員屬性的值
  • 深刻理解了$this 的指向當前調用對象的特點.
  • this的使用注意事項
  • this這個關鍵字,只能在類的方法中使用,而不能在類的外部使用.

    2.6 構造函數的小結

    2.7 類定義的進一步完善

    ?

    第 3 章 析構函數

    3.1 簡單的介紹

    基本的說明: 文檔的說明:

    PHP 5 引入了析構函數的概念,這類似于其它面向對象的語言,如 C++。析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行

    我們來理解一下上面的話

  • PHP5中引入的一個技術
  • 某個對象的所有引用都被刪除
  • 使用unset(對象名), 將對象名銷售
  • $對象名 = null;
  • $對象名 = 'abc'
  • 顯示銷毀
  • 上面寫的三種方式,都是顯示銷毀, 所謂顯示銷毀就是程序員主動的刪除對象引用.

    如果程序員不去顯示銷毀對象,那么在程序執行完畢后,這個對象就會被系統銷毀,這個就是系統銷毀

    3.2 php文件執行的流程

    畫圖:

    3.3 析構函數的基本使用

  • 基本語法
  • class? 類名{

    ????? public? function? __destruct(){

    ?????? //函數體

    ?? //析構函數的最重要的作用,就是釋放對象創建的資源

    ?? //比如 數據庫連接, 文件句柄, 繪圖句柄..

    }

    }

    ?

    說明

  • 析構函數都是public
  • __destuct 是關鍵字,不要修改
  • 析構函數沒有形式參數
  • 析構函數是系統調用
  • 析構函數在如下情況會被系統調用
  • php文件執行完畢
  • 某個對象的所有引用都被刪除后, 馬上就會調用析構函數
  • ?

  • 快速入門案例
  • ?

    3.4 析構函數的小結

    3.5 析構函數的最佳實踐

    我們使用析構函數完成對資源的及時釋放

    說明

  • 關于在析構函數中釋放資源的問題,如果我們對效率沒有很高很特殊的要求,完全可以不使用析構函數.
  • 如果我們不確定代碼后面是否還會使用資源(比如鏈接),那么我們建議最好不要使用析構函數
  • 項目有特殊和明確的要求時,我們可以使用析構函數,顯示的銷毀對象是,在析構函數中,釋放資源.
  • 3.6 垃圾回收機制

    ?

    3.7 類定義的完善

    ?

    ?

    第 4 章 魔術方法

    4.1 魔術方法一覽

    說明

  • 魔術方法都是系統提供,程序員使用即可.
  • 所有的魔術方法,前面都是以? __ 開頭的 _是兩個下劃線.
  • 我們在自定義函數時,就不要使用 __開頭了.
  • 魔術方法是在滿足某個條件(一會一個一個的說明)時,有系統自動的調用.
  • 4.2 訪問控制修飾符的基本入門介紹

  • 介紹
  • 因為魔術方法和訪問修飾符關系密切,因此我們需要先學習一下訪問控制修飾符的基本知識, 這里我們先講一個基本的介紹.

  • 文檔的介紹:
  • 屬性方法的訪問控制,是通過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。被定義為公有的類成員可以在任何地方被訪問。被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。被定義為私有的類成員則只能被其定義所在的類訪問

  • 訪問控制修飾符可以修飾成員屬性,也可以修飾方法.
  • 有三種 public , protected 和 private
  • 使用代碼來說明
  • 4.3 魔術方法之-__get 和 __set函數

  • 基本的介紹
  • 當程序員去使用不可以訪問的屬性時,系統就會調用__get方法.
  • 不可以訪問的屬性指的是(1 . 該屬性不存在 2. 直接訪問了protected或者private屬性)
  • 當程序員去給不可以訪問的屬性直接賦值,系統就會調用__set方法
  • 舉例說明
  • 需求是: 如果對象有一個成員變量是private、protectd的,我希望在在類的外部通過 : $對象名->變量名的方式來賦值和取值,怎么辦?

  • 課堂練習
  • 4.4 魔術方法之-__isset 和 __unset函數

  • 基本介紹
  • 當對不可訪問的屬性進行了 isset($對象名->屬性), empty($對象名->屬性)操作,那么__isset函數就會被系統調用。
  • 不可訪問的屬性 仍然和前面說的一樣 。
  • 當對不可訪問的屬性進行了 unset($對象名->屬性), 那么__unset函數就會被系統調用
  • 代碼說明
  • ?

  • 補充說明一下語法現象-屬性重載
  • 補充說明一下-property_exists()函數
  • <?php

    ????? header('content-type:text/html;charset=utf-8');

    ????? //property_exists說明

    ?

    ????? class A{

    ????? ?????? public $name;

    ????? ?????? protected $food;

    ?

    ????? ?????? public function __construct($name, $food){

    ????? ?????? ?????? $this->name = $name;

    ????? ?????? ?????? $this->food = $food;

    ????? ?????? }

    ????? }

    ?

    ????? $a = new A('小貓', '魚兒');

    ?????

    ????? unset($a->name);

    ?

    ????? echo'<pre>';

    ????? var_dump($a);

    ?

    ????? if(property_exists($a, 'name')){

    ????? ?????? echo '<br> name屬性存在';

    ????? }

    ?

    ????? //屬性的重載

    ????? $a->age = 100;

    ?

    ????? echo '<pre>';

    ????? var_dump($a);

    ?

    ????? if(property_exists($a, 'age')){

    ????? ?????? echo '<br> age屬性存在';

    ????? }else{

    ????? ?????? echo '<br> age屬性不存在';

    ????? }

    ?

    ????? unset($a->age);

    ????? echo '<pre>';

    ????? echo '<br>---------<br>';

    ????? var_dump($a);

    ?

    ????? if(property_exists($a, 'age')){

    ????? ?????? echo '<br> age屬性存在';

    ????? }else{

    ????? ?????? echo '<br> age屬性不存在';

    ????? }

    ?

    ????? //property_exists(對象名, 屬性)

    ????? //1. 先判斷該對象是否有這個屬性,如果有則返回真.

    ????? //2. 如果該對象沒有有這個屬性, 則繼續判斷該對象對應的類是否定義過這個屬性,如果定義過仍然返回真,否則才返回假

    ?

    ?

    ?

    ?

    ?

    4.5 魔術方法之-__toString 函數

  • 基本介紹:
  • 當我們希望將一個對象當做字符串來輸出時,就會觸發__toString魔術方法.

  • 代碼說明
  • 小練習
  • 做兩個怪物!

    ?

    4.6 魔術方法之-__clone函數

  • 基本介紹 :
  • 當我們需要將一個對象完全的賦值一份, 保證兩個對象的屬性和屬性值一樣,但是他們的數據庫空間獨立,則可以使用對象克隆。

  • 案例說明
  • 說明

  • 當我們 $對象1 = clone $對象2, 會觸發 __clone 方法
  • 如果我們希望在克隆時,修改某個屬性,則在__clone方法中去修改即可
  • 如果我們希望阻止克隆,只需要將 __clone 魔術方法申明為private 即可.
  • 4.7 魔術方法之-__call函數

  • 基本介紹:
  • 當我們調了一個不可以訪問的成員方法時,__call魔術方法就會被調用.
  • 不可以訪問的成員方法的是指(1. 該成員方法不存在, 2. 成員方法是protected或者 private)
  • 需求
  • 我們就是希望,在類的外部直接調用不可訪問的成員方法(private , protected).

  • 案例說明
  • 課堂小練習
  • ?

    點評:

    ?

    第 5 章 類的自動加載

    5.1 看一個需求

    說明

  • 在我們的開發中, 一個類對應一個文件,其命名方式為 類名.class.php
  • 在需要某個類時,通過 include 或者? require 引入即可.
  • 問題請思考,如果一個文件使用到多個類,怎么辦?
  • 5.2 使用傳統的方法來解決

    5.3 對代碼優化,使用類的自動加載來完成

    5.4 對代碼思考,對代碼進行靈活性的處理

  • 分析和思路
  • 對應的代碼
  • common.php 文件

    5.5 使用spl_autoload_register? 的高級方式(了解)來完成類的自動加載

  • 一個案例
  • ?

    第 6 章 靜態屬性

    6.1 看一個開發的需求

    6.2 思路(使用現有的技術解決)

  • 思路: 定義一個全局的變量 $total_num, 當有一個小朋友加入游戲時,我們就加1, 當我們需要查看有多少小朋友玩時,直接輸出.
  • 代碼實現 :
  • ?

    6.3 對上面代碼的進行分析和優化

  • 分析: 雖然可以解決問題,但是不是以面向對象的方式來解決,因此我們需要優化
  • 解決方式: 使用靜態變量來完成:靜態變量是屬于所有對象, 因此可以被所有的對象共享.
  • 代碼解決:
  • 內存的分析圖
  • ?

    6.4 靜態變量的其它說明

  • 基本概念的再說明
  • 靜態屬性是該類的所有對象共享的變量,任何一個該類的對象去訪問它時,取到的都是相同的值,同樣任何一個該類的對象去修改它時,修改的也是同一個變量。這個從前面的圖也可看出來.

  • 定義靜態屬性
  • 訪問修飾符 static 靜態屬性名;
  • static 訪問修飾符 靜態屬性名;
  • 說明上面兩種方式是等價的.

    6.5 如何訪問靜態屬性

  • 在類的內部訪問
  • 可以使用兩種方式? self::$靜態屬性名? ,? 類名::$靜態屬性名

    :: 叫 范圍解析符.

    舉例:

  • 在類的外部訪問
  • 如果要在類的外部訪問靜態屬性,靜態屬性需要是public ,否則也不能直接訪問, 訪問的形式是 類名::$屬性名;

  • $this和self的區別
  • 6.6 靜態屬性的使用注意事項

    6.7 課后練習題

    <?php

    ????? header('content-type:text/html;charset=utf-8');

    ????? /*

    ????? 要求:

    ????? 請設計一個Person類, (有 名字, 年齡? 和? 蛋糕 三個屬性)

    ????? 蛋糕一共1000塊,是所有人共享的.

    ????? 創建唐僧師徒四人,他們每人都吃蛋糕, 唐僧每天吃 3塊,悟空吃5塊,沙和尚吃9塊,豬八戒吃 30塊. (編寫一個 eat方法來吃)

    ????? 問兩天后,還剩多少塊蛋糕,(編寫一個 showCake() 來顯示)

    ????? 請計算,蛋糕一共可以吃多少天.

    ?

    ????? */

    ?

    ?

    ????? class Person{

    ????? ?????? public $name;

    ????? ?????? public $age;

    ????? ?????? // 蛋糕一共1000塊,是所有人共享的, 因為共享的,因此我們應該設為static

    ????? ?????? protected static $cakeNum = 1000;

    ?

    ????? ?????? //構造函數

    ????? ?????? public function __construct($name, $age){

    ????? ?????? ?????? $this->name = $name;

    ????? ?????? ?????? $this->age = $age;

    ????? ?????? }

    ?

    ????? ?????? //編寫一個eat方法

    ????? ?????? public function eat($num){

    ?

    ????? ?????? ?????? //判斷一下是否夠吃

    ????? ?????? ?????? if(self::$cakeNum >= $num){

    ????? ?????? ?????? ?????? self::$cakeNum -= $num;

    ????? ?????? ?????? ?????? return true;

    ????? ?????? ?????? }else{

    ????? ?????? ?????? ??????

    ????? ?????? ?????? ?????? echo '<br> 當' .$this->name. ' 想吃 ' . $num . ' 塊蛋糕, 不夠了,不能吃了';

    ????? ?????? ?????? ?????? return false;

    ????? ?????? ?????? }

    ????? ?????? }

    ?

    ????? ?????? //編寫一個方法,顯示還有多少塊蛋糕

    ????? ?????? public function showNum(){

    ????? ?????? ??????

    ????? ?????? ?????? echo '<br> 當前還有 ' . self::$cakeNum . ' 蛋糕...';

    ????? ?????? }

    ?

    ????? ??????

    ?

    ????? }

    ?

    ????? //使用

    ????? //問兩天后,還剩多少塊蛋糕,(編寫一個 showCake() 來顯示)

    ????? //1. 創建四個對象

    ????? $monk = new Person('唐僧', 30);

    ????? $monkey = new Person('悟空', 500);

    ????? $pig = new Person('八戒', 400);

    ????? $sMonk = new Person('沙僧', 300);

    ?

    ????? //2. 統計兩天后

    ????? $day = 20;

    ????? for($i = 0; $i < $day; $i++){

    ????? ??????

    ????? ?????? if(!$monk->eat(3)){

    ????? ?????? ?????? break;

    ????? ?????? }

    ????? ?????? if(!$monkey->eat(5)){

    ????? ?????? ?????? break;

    ????? ?????? }

    ????? ?????? if(!$sMonk->eat(9)){

    ????? ?????? ?????? break;

    ????? ?????? }

    ????? ?????? if(!$pig->eat(30)){

    ????? ?????? ?????? break;

    ????? ?????? }

    ????? }

    ?

    ????? echo '<br> 一共 可以吃 ' . ($i+1) . '天';

    ?

    ????? /*

    ????? ?????? //思想?? 【程序員? 思想=====(鍛煉)=====>代碼(php技術) 】

    ????? ?????? $count_day = 0;

    ????? ?????? while(true){

    ????? ?????? ??????

    ????? ?????? ?????? if(!$monk->eat(3)){

    ????? ?????? ?????? break;

    ????? ?????? ?????? }

    ????? ?????? ?????? if(!$monkey->eat(5)){

    ????? ?????? ?????? ?????? break;

    ????? ?????? ?????? }

    ????? ?????? ?????? if(!$sMonk->eat(9)){

    ????? ?????? ?????? ?????? break;

    ????? ?????? ?????? }

    ????? ?????? ?????? if(!$pig->eat(30)){

    ????? ?????? ?????? ?????? break;

    ????? ?????? ?????? }

    ?

    ????? ?????? ?????? $count_day++;

    ????? ?????? }

    ?

    ????? */

    ?

    ????? //3. 看看還剩多少塊

    ?

    ?????? $monk->showNum();

    ?

    ?

    ?

    第 7 章 靜態方法

    7.1 基本的介紹

    當程序員需要對靜態屬性進行操作時,可以定義靜態方法來處理, 靜態方法是專門用于操作靜態屬性.

  • 靜態方法的基本語法
  • class 類{

    ????? 訪問修飾符? static? function 函數名(形參){

    ?????? //函數體

    }

    }

    ??? ?????? 說明

  • 靜態方法是在類中定義的
  • static 是關鍵字,不能修改.
  • 靜態方法專門用于操作靜態屬性
  • 靜態方法可以通過類名直接調用. 形式時候 類名::靜態方法名(參數 )
  • 快速入門案例
  • 7.2 靜態方法的細節討論

  • 在類外部調用靜態方法:? 類名::靜態方法名 或者 對象名->靜態方法名 或者 對象名::靜態方法(語法支持,但是不推薦)
  • 舉例說明:

  • 在類內部調用靜態方法:??? self::靜態方法名 或者 類名::靜態方法名 通過 $this也可以
  • 舉例說明:

  • 注意:靜態方法中只能訪靜態屬性,不能訪問非靜態屬性(普通屬性, 沒有static)
  • 舉例:

  • 普通的成員方法,可以訪問靜態屬性和非靜態屬性
  • ?

  • 如果我們的靜態方法是protected 或是是 private 則也不能在類的外部使用
  • 7.3 靜態屬性和靜態方法的最佳實踐-單例模式

  • 先看實際的需求
  • ?

  • 代碼實現
  • 第一種版本-ok

  • 第二種寫法(推薦使用)
  • ?

  • 上面代碼對應的示意圖:
  • 知識點的補充
  • ?

    第 8 章 OOP編程的三大特征-封裝

    8.1 基本介紹

    oop編程的三大特征是: 封裝性, 繼承, 多態. 說明一下,在php面向對象編程中,多態提的并不是很多,因為php本身就是天生的多態.

    8.2 抽象

    在面向對象編程中,將一類事物的共有的屬性(成員屬性)和行為(成員方法)提取出來,形成一個模板(類), 這種解決問題的方法就是抽象.

    8.3 抽象的實際案例

    代碼說明:

    8.4 封裝的基本概念

    8.5 封裝的具體實現-訪問控制符

  • 說明: 在php中,提供了三種訪問控制符 public , protected 和private, 訪問控制的訪問是 public >protected > private. 具體我們看一個圖:(重點
  • 總結:

    public?? ?????? 類內部、外部和子類都可以訪問;

    protected?? 表示受保護的,只有本類或子類可以訪問;

    private??????? 表示私有的,只有本類內部可以使用;

    強調: 上面的說的訪問控制訪問,對屬性和成員方法都起作用.

  • 代碼舉例說明
  • 8.6 如何訪問protected和private屬性的三種形式

  • 使用魔術方法__get 和 __set 來實現對protected 和 private 屬性的操作
  • 總結

  • 優點: 簡單,一對__set 和 __get 就可以搞定所有的private , protected屬性
  • 缺點:? 不夠靈活,沒有辦法對各個屬性進行控制和驗證.
  • 對每一個private 和 protected 屬性提供一對get/set方法, 這樣就可以分別控制,各個屬性,并進行驗證.
  • 舉例說明:

    說明

  • 優點: 可以對每個屬性進行驗證,因此很靈活.
  • 缺點: 會造成有比較多的setXxx 和 getXxx方法,但是這個沒有什么大的問題.
  • 推薦使用這種方法,在實際開發中,這種方式比較多.
  • 寫一個成員方法,可以根據業務邏輯,一次性對多個屬性進行批量操作 。
  • 舉例說明:

    <?php

    ????? header('content-type:text/html;charset=utf-8');

    ?

    ????? //Movie(名稱,導演,成本(protected),票房[ticket_office](private))

    ????? //updateInfo() showAllInfo()

    ?

    ????? class Movie{

    ????? ?????? public $name;

    ????? ?????? public $director;

    ????? ?????? protected $cost;

    ????? ?????? private $ticketOffice;

    ?

    ????? ?????? public function __construct($name, $director, $cost){

    ????? ?????? ?????? $this->name = $name;

    ????? ?????? ?????? $this->director = $director;

    ????? ?????? ?????? $this->cost = $cost;

    ????? ?????? }

    ?

    ????? ?????? //顯示一下電影信息

    ????? ?????? public function showAllInfo(){

    ????? ?????? ?????? echo '<br> 電影的信息如下:';

    ????? ?????? ?????? echo '<br> name = ' . $this->name;

    ????? ?????? ?????? echo '<br> director = ' . $this->director;

    ????? ?????? ?????? echo '<br> cost = ' . $this->cost;

    ????? ?????? ?????? echo '<br> tickeoffice = ' . $this->ticketOffice;

    ????? ?????? }

    ?

    ????? ??????

    ?

    ????? ?????? public function updateInfo($director, $cost, $ticketOffice){

    ????? ?????? ??????

    ????? ?????? ?????? //簡單方式

    //??? ?????? ?????? $this->director = $director;

    //??? ?????? ?????? $this->cost = $cost;

    //??? ?????? ?????? $this->ticketOffice = $ticketOffice;

    ?

    ????? ?????? ?????? //結合setXxx 來完成

    ????? ?????? ?????? $this->setDirector($director);

    ????? ?????? ?????? $this->setCost($cost);

    ????? ?????? ?????? $this->setTicketOffice($ticketOffice);

    ????? ?????? ??????

    ????? ?????? }

    ?

    ????? ?????? //setXxx GetXxx

    ????? ??????

    ????? ?????? public function SetDirector($director){

    ????? ?????? ?????? $this->director = $director;

    ????? ?????? }

    ????? ??????

    ????? ?????? public function getDirector(){

    ????? ?????? ?????? return $this->director;

    ????? ?????? }

    ?

    ????? ?????? public function setCost($cost){

    ????? ?????? ??????

    ????? ?????? ?????? //加入數據的驗證和判斷

    ????? ?????? ?????? if(is_numeric($cost) && $cost > 0.0){

    ????? ?????? ?????? ?????? $this->cost = $cost;

    ????? ?????? ?????? }else{

    ????? ?????? ?????? ?????? echo '<br> 輸入成本格式有問題 ';

    ????? ?????? ?????? }

    ????? ?????? }

    ?

    ????? ?????? public function getCost(){

    ????? ?????? ?????? return $this->cost;

    ????? ?????? }

    ?

    ????? ?????? public function setTicketOffice($ticketOffice){

    ????? ?????? ??????

    ????? ?????? ?????? //加入數據的驗證和判斷

    ????? ?????? ?????? if(is_numeric($ticketOffice) && $ticketOffice > 0.0){

    ????? ?????? ?????? ?????? $this->ticketOffice = $ticketOffice;

    ????? ?????? ?????? }else{

    ????? ?????? ?????? ?????? echo '<br> 輸入票房格式有問題 ';

    ????? ?????? ?????? }

    ????? ?????? }

    ?

    ????? ?????? public function getTicketOffice(){

    ????? ?????? ?????? return $this->ticketOffice;

    ????? ?????? }

    ?

    ????? }

    ?

    ????? $movie = new Movie('葫蘆娃', '老爺子', 60000);

    ?

    ????? $movie->showAllInfo();

    ?

    ????? echo '<br>***********<br>';

    ????? $movie->updateInfo('老韓', 4000, 89000);

    ?

    ?????? $movie->showAllInfo();

    8.7 在開發中,如何選擇操作方式

  • 如果我們希望直接通過 $對象名->屬性名的方式來操作屬性,則使用__set 和 __get 函數即可
  • 如果我們希望對各個屬性分別進行驗證,則使用setXxx 和 getXxx
  • 如果希望同時操作多個屬性,選擇第三種
  • 項目經理要求.
  • 8.8 封裝的細節說明

  • 普通屬性要定義為公有,受保護,私有之一。如果用 var 定義,則被視為公有。靜態屬性可以不指定訪問修飾符,默認是public
  • 舉例說明:

  • 類中的方法可以被定義為公有,私有或受保護。如果沒有設置這些關鍵字,則該方法默認為公有(不管這個方法是靜態的,還是非靜態都滿足這個規則)
  • ?

    8.9 對象運算符的連用現象

    要求是 : 通過一個學生對象,可以訪問到該學生所在班級的信息.

    代碼實現:

    對應的原理分析圖:

    8.10課后練習題

    //評講....

    <?php

    ????? header('content-type:text/html;charset=utf-8');

    ????? /*

    ????? ??????

    ????? ?????? 要求:

    ????? 編寫一個Dog類(名字,年齡,性別,主人)

    ????? 編寫一個Master類(名字,年齡,寵物狗)

    ????? 創建一個Dog對象和Master對象,通過Dog對象可以找到對應主人的信息,通過Master對象可以找到對應寵物狗的信息[提示,需要各寫一個方法.]

    ?????

    ????? */

    ?

    ????? class Dog{

    ????? ??????

    ????? ?????? public $name;

    ????? ?????? private $age;

    ????? ?????? private $sex;

    ????? ?????? private $master;

    ????? ?????? public function __construct($name, $age, $sex, $master){

    ????? ?????? ?????? $this->name = $name;

    ????? ?????? ?????? $this->age = $age;

    ????? ?????? ?????? $this->sex = $sex;

    ????? ?????? ?????? $this->master = $master;

    ????? ?????? }

    ?

    ????? ?????? public function setMaster($master){

    ????? ?????? ??????

    ????? ?????? ?????? $this->master = $master;

    ????? ?????? }

    ?

    ????? ?????? public function getMaster(){

    ????? ?????? ??????

    ????? ?????? ?????? return $this->master;

    ????? ?????? }

    ?

    ????? ?????? public function showMasterInfo(){

    ????? ?????? ??????

    ????? ?????? ?????? echo '<br> 主人的信息是';

    ????? ?????? ?????? echo '<br> 主人名字是 ' . $this->master->name;

    ????? ?????? ?????? echo '<br> 主人年齡是 ' . $this->master->getAge();

    ????? ?????? }

    ????? ??????

    ????? }

    ?

    ?

    ????? class Master{

    ????? ??????

    ????? ?????? public $name;

    ????? ?????? private $age;

    ????? ?????? private $dog;

    ?

    ????? ?????? public function __construct($name, $age, $dog){

    ????? ?????? ?????? $this->name = $name;

    ????? ?????? ?????? $this->age = $age;

    ????? ?????? ?????? $this->dog = $dog;

    ????? ?????? }

    ?

    ????? ?????? public function setDog($dog){

    ????? ?????? ?????? $this->dog = $dog;

    ????? ?????? }

    ?

    ????? ?????? public function getDog($master){

    ????? ??????

    ????? ?????? ?????? return $this->master;

    ????? ?????? }

    ?

    ????? ?????? public function setAge($age){

    ????? ?????? ?????? $this->age = $age;

    ????? ?????? }

    ?

    ????? ?????? public function getAge(){

    ????? ??????

    ????? ?????? ?????? return $this->age;

    ????? ?????? }

    ????? }

    ?

    ????? //創建一只狗

    ????? $dog = new Dog('狼牙', 3, 'boy', null);

    ?

    ????? //創建一個人

    ????? $master = new Master('老吳', 32, $dog);

    ?

    ????? echo '<pre>';

    ????? var_dump($master);

    ?

    ????? $dog->setMaster($master);

    ????? var_dump($dog);

    ?

    ????? //顯示主人的信息

    ?????? $dog->showMasterInfo();

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    第 9 章 OOP編程的三大特征-繼承

    9.1 看一個實際的需求(問題)

    開發一個學生考試系統,學生可以考試并且測評分數,并顯示考了多少分.(小學生,大學生.)

    代碼:

    分析問題

  • Pupil 類和 Graduate 類,相似度很高,很多相同的屬性和方法.
  • 這時已經出現了代碼的冗余, 這樣不利于類的管理和維護.
  • 解決的方法就是繼承.
  • 9.2 繼承的基本思想是

    9.3 使用繼承的方式對上面的代碼進行改寫

    1

    9.4 繼承的概念在說明

    說明

  • 繼承的根本作用就是解決代碼的復用性,減少冗余度 , 同時利用類的維護和擴展
  • 繼承時的關鍵字是 extends , 這個是固定的,不能修改.
  • 9.5 繼承的細節

  • 當子類繼承了父類,并不是父類所有的屬性和方法,都可以被子類訪問, 子類只能訪問父類的public 和 protected 屬性和方法
  • 舉例:

    說明結論

    • 子類 可以訪問 父類的 public 屬性和方法 (不管是子類的內部,還是外部)
    • 子類可以訪問父類的protected 的屬性和方法,但是必須在子類的內部才可以訪問.
    • 子類不能訪問父類的private 的屬性和方法
    • 在輸出子類對象時,我們dump 可以看到父類的私有屬性,但是這個私有屬性是輸入父類,在子類中仍然無法訪問
  • 繼承的本質(重點)
  • 我們在理解繼承的時候,應該這樣理解:

    • 不能理解成 子類把父類的屬性和方法拷貝了一份
    • 而是 子類和父類之間連接了一種查找的關系.

    看一個示意圖

    ??? ??????

  • ?繼承的舉例說明
  • 代碼說明:

  • 關于繼承查找的順序和執行的說明
  • 以Book 類 繼承了 Goods 為例進行說明

  • 當我們訪問子類的某個屬性或者方法時,首先先到子類中去查找是否有這個屬性或者方法,如果有 在繼續判斷是否可以訪問,如果可以訪問就訪問,如果不能訪問,則報錯.
  • 當我們訪問子類的某個屬性或者方法時,首先先到子類中去查找是否有這個屬性或者方法,如果沒有, 就到該類的父類(如果有)去查找是否有這個屬性或者方法,如果有,就繼續判斷是否可以訪問,如果可以訪問就訪問,如果不能訪問,就報錯.
  • 如果父類還有父類,則依次類推
  • 9.6 繼承的注意事項

  • 子類最多只能繼承一個父類(指直接繼承)
  • 舉例:

  • 子類可以繼承其父類(或者基類)的 public ,protected修飾的變量(屬性) 和 函數(方法)
  • 案例看前面的即可.

  • 在創建某個子類對象時,默認情況下會自動調用其父類的構造函數(指在子類沒有自定義構造函數情況時)
  • 如果在子類中需要訪問其父類的方法(構造方法/成員方法? 方法的訪問修飾符是public/protected),可以使用父類::方法名(或者 parent::方法名 ) 來完成。
  • 如果子類(擴展類)中的方法和父類(基類)方法相同,我們稱為方法重寫, 關于方法的重寫我們在后面有詳細的講解
  • 9.7 類定義的進一步完善

    9.8 繼承的課后練習題

    9.9 方法重載

  • 文檔的說明
  • PHP所提供的"重載"(overloading)是指動態地"創建"類屬性和方法。我們是通過魔術方法(magic methods)__call _callStatic來實現的

  • 重載的英文 overloading
  • php中,重載是值動態的創建屬性和方法.
  • 通過magic method 來實現
  • 9.10傳統的oop編程中,方法的重載指的是什么含義

  • 介紹
  • 在oop中,可以調用相同的函數名, 實現調用不同函數的結果,比如$obj->getSum($n1), $obj->getSum($n1, $2); 依靠函數不同的參數個數或者類型來區分不同函數.

    舉例:

    在php中,不能像上面這樣實現方法的重載.

    9.11在php也可以實現方法重載,但是方式有變化(__call)

  • 基本介紹: 在php中,也可以實現方法重載,使用魔術方法中的__call
  • 代碼說明:
  • 看出(1) 方法重載不推薦使用, 但是有些項目中也有使用 (2) 面試筆試有人問你.

    9.12課堂練習

    ?

    9.13魔術方法__callStatic 說一下

    當我們調用一個不可以訪問(protected/private/不存在)的靜態方法時,__callStatic魔術方法就會被系統調用。

    舉例說明:

    9.14課后練習題

    9.15屬性的重載

  • 基本介紹
  • 當我們去給一個不存在的屬性賦值時,類會自動的動態的創建一個對應的屬性,這個屬性是public 的.

  • 對應屬性重載的處理方式
  • 程序員不干預,使用默認機制來處理.
  • 禁止屬性重載.
  • 案例:

  • 專門寫一個數組屬性和方法,來管理我們的重載的屬性.
  • 9.16方法的重寫

  • 看一個實際的問題
  • 看一個案例
  • 小結

  • 當子類和父類的某個方法名一樣時,我們就說子類的方法重寫了父類的這個方法
  • 重寫(override), 有些文檔手冊把重寫也叫做 覆蓋, 在我們授課中,我們統計叫方法重寫.
  • 如果子類的方法重寫父類的方法,要求方法名和參數個數完全一樣,如果父類使用了類型約束,則子類的這個方法也必須有相同的類型.
  • 9.17方法重寫的細節說明

  • 如果在子類中需要訪問其父類的方法(public/protected),可以使用父類::方法名 或者 parent::方法名 來完成。
  • 子類的方法的參數個數 ,方法名稱,要和父類方法的參數個數,方法名稱一樣
  • 如果父類的方法的參數使用了類型約束,還必須保證數據類型一致, 即子類的這個方法也需要使用相應的類型約束
  • 子類方法不能縮小父類方法的訪問權限(可以大于可以等于)
  • ?

    9.18屬性的重寫

  • 基本的介紹: 屬性也可以被重寫,重寫的幾點注意事項
  • 只有public 和 protected 的屬性可以被重寫
  • 屬性重寫時,也不能縮小父類的屬性控制訪問
  • 舉例
  • 9.19重寫的課堂練習

    ?

    9.20補充一個知識點類型約束

    PHP 5 可以使用類型約束。函數的參數可以指定必須為對象(在函數原型里面指定類的名字),接口數組(PHP 5.1 起)或者 callable(PHP 5.4 起)。不過如果使用 NULL作為參數的默認值,那么在調用函數的時候依然可以使用 NULL 作為實參。

    舉例說明一把:

    ?

    第 10 章 多態[了解]

    10.1基本介紹

    所謂多態,就是在面向對象編程中,一個對象在不同的情況下的多種狀態, 根據不同的上下文環境來決定。

  • php本身就是天生的多態語言
  • 當一個函數接收到不同對象時,會自動的判斷并調用對應的方法.
  • 多態利于類的維護和擴展
  • 10.2舉例說明

    使用代碼來完成上面的示意圖:

    10.3多態的課后練習題

    晚上完成即可.

    ?

    第 11 章 抽象類

    11.1看一個開發的實際需求

    當我們編寫一個父類, 有個方法是不確定的,比如

    class Animal {

    ????? public $name;

    ????? public function cry(){

    ?????? echo '<br> 動物不知道怎么叫喚...';

    }

    }

    cry 這里是不確定,寫了也是白寫, 沒有意義,因此, oop中,可以將這樣的方法做成抽象方法,類就做成抽象類.

    11.2抽象類的基本概念

  • 基本的概念
  • 基本語法
  • 11.3快速入門案例

  • 抽象類主要用來被繼承,偏重設計
  • 當一個成員方法前使用abstract 來修飾,該方法就是抽象方法
  • 當一個類名前有abstract來修飾,該類就是抽象類
  • 11.4抽象類的細節討論

  • 抽象類不能實例化
  • 抽象類可以沒有abstract方法, 可以有非抽象方法和屬性,常量
  • 一旦類包含了abstract方法,則這個類必須聲明為abstract 類
  • 抽象方法不能有函數體
  • 如果一個類繼承了某個抽象類,則它必須實現該抽象類的所有抽象方法.(除非它自己也聲明為抽象類)[多級繼承]
  • 11.5抽象類的最佳實踐

    抽象類的最大價值是設計,讓其他的人來繼承抽象類,并實現抽象方法.

    11.6抽象類的課后練習

    ?

    第 12 章 接口

    12.1看一個實際的需求

    12.2接口的基本介紹

  • 所謂接口:就是將一些抽象方法封裝到一起,在某個類需要使用時,只需要實現該接口就可以, 說的實現接口就是指將該接口中的所有的抽象方法都實現了。
  • 基本語法
  • interface 接口名稱{

    ????? 常量;

    ?? 方法;

    }

    幾點說明

  • interface 是關鍵字,不能夠修改,規定好 。
  • 接口名稱有命名規范是: iXxxxXxxx , 首先以小寫的i開頭. 后面使用大駝峰命名規則
  • 接口中的方法,都是抽象方法, 但是不需要使用abstract 去修飾
  • 接口中,不能有普通的成員屬性,但是可以有常量.
  • 12.3使用接口的好處

    12.4快速入門案例

    12.5接口的最佳實踐案例

  • 使用接口的方式來模擬一下下面的運用場景
  • 走代碼
  • 12.6接口的應用場景

    總結: 當我們需要定義一些規范(方法)時,可以將這些方法封裝到接口中 ,然后讓其他的類來實現該接口即可.

    12.7接口的細節討論

  • 接口不能被實例化
  • ?

  • 接口中所有的方法都不能有主體, 即接口中的方法都是抽象方法.
  • ?

  • 一個類可以實現多個接口,逗號隔開
  • ?

    舉例說明:

    ?

    ?

  • 接口中可以有屬性,但只能是常量 ,默認是public, 但不能用public 顯式修飾
  • 一個接口不能繼承其它的類,但是可以繼承別的接口
  • 12.8類定義的進一步完善

    12.9繼承類vs 實現接口

    ?

    ?

    ?

  • 總結一下
  • 實現接口可以看做是對php單繼承機制的補充
  • 實現接口可以在不打破繼承的層級關系的前提下,對類的功能進行擴展
  • ?

    ?

    第 13 章 final關鍵字

    13.1基本介紹

    當程序員不希望某個成員方法被子類重寫時,我們可以將該方法修飾為final 方法.

    當程序員不希望某個類被繼承,我們可以將該類修飾為final 類.

    final "最終"

    13.2基本語法

    final 類名{

    ????? final 訪問修飾符 function 方法名(){

    ????? ?????? //函數體??????

    }

    }

    13.3快速入門案例

    總結

  • //如果我們不希望子類去重寫attack方法, 使用final 修飾即可
  • //如果我們不希望子類來繼承某個類, 則使用final修飾該類即可
  • 13.4final 的使用細節討論

  • final不能夠修飾成員屬性
  • final 方法不能被重寫,但可以被繼承
  • 一般來說,final 類中不會出現final 方法,因為final類都不能被繼承,也就不會去重寫override final類的方法了
  • final 類 是可以被實例化的
  • ?

    第 14 章 類常量(const關鍵字)

    14.1為什么需要使用當類常量

    在某些情況下,程序員可能有這樣的需求:

    當不希望一個成員變量被修改,希望該變量的值是固定不變的。這時可以用const 去修飾該成員屬性,這樣這個屬性就自動成為常量 , 比如所得稅率, 數學中的圓周率等

    14.2類常量的基本語法

    類常量是在類中定義的.

    class? 類名{

    ????? const 常量名 = 初始值;

    }

    說明

  • const 是關鍵字,規定好的而不能修改.
  • 常量名的規范是 XXX_YYY , 全部大寫,然后使用下劃線間隔
  • 類常量都是public , 但是我們不要使用public 去修飾.
  • 14.3快速入門案例

    //計算公司所得稅的案例.

    14.4關于類常量的使用細節說明

  • 常量名一般字母全部大寫 : TAX_RATE ,中間可以有下劃線 TAX_RATE
  • 在定義常量的同時,必須賦初值, 比如 const TAX_RATE=1.1
  • const關鍵字前不能用public/protected/private修飾。默認是public
  • 如何訪問常量
  • 在類的內部訪問:?? 類名::常量名??? self::常量名?? 接口::常量名

    在類的外部訪問:? 類名::常量名? 接口名::常量名??

  • 常量的值在定義的時候就初始化,以后就不能修改
  • 常量可以被子類繼承
  • 一個常量是屬于一個類的,而不是某個對象的
  • 關于常量可以是什么數據類的討論
  • 結論: 常量可以是 基本數據類型(int, float , bool, string), 還是可以是 array ,但是不能是對象。

  • 類常量可以在類中,類的外部和其它普通函數中使用
  • ?

    ?

    第 15 章 PHP面向對象編程的相關技術

    基本: 把php面向對象編程的各個知識點都過一下.

    15.1對象克隆技術和分析

    15.2對象遍歷[了解,應付筆試]

  • 看看如何對對象進行遍歷: 所謂對象的變量,指的是對某個對象的屬性進行遍歷.
  • 舉例
  • 在類的外部對對象進行遍歷, 這時我們只能遍歷到對象的public 屬性.

    15.3php的內置標準類

    看一個具體的需要: 如果,我們希望把一些數據,以對象的屬性的方式存儲,同時我們又不想定義一個類,可以考慮使用 PHP內置標準類 stdClass [standard標準]

    php的內置標準類 stdClass , 這個是系統默認提供,不需要程序員去創建,而是直接使用就可以.

    案例說明:

    15.4數據類型轉對象和對象轉數組的說明

    在我們的開發中,有時會看到有人將數組或者基本數據類轉成對象,那么這個是怎么回事?

  • 舉例說明
  • 15.5對象序列化和反序列化

  • 基本介紹
  • 所謂對象序列化是指: 將一個對象轉換成一個字符串,這個字符串包括 屬性名,屬性值,屬性類型, 和該對象對應的類名。簡單的說明就把一個對象的數據和數據類型轉成字符串.

  • 看一個實際的需求
  • 我要求同學們講一個對象保存到文件中.(freeze 冷凍)-對象序列化.

    ?

  • 反序列化
  • 所謂反序列化就是指,將一個序列化的字符串,重新恢復成對應的對象.

    說明

  • 如果我們希望正確的操作反序列化對象,則需要引入該對象的類定義
  • 對象序列化和反序列化的細節討論
  • 序列化的作用在哪些地方
    • 對象序列化利于對象的保存和傳輸
    • 可以讓多個文件共享對象,而且我們將序列化后的對象保存到文件中,還可以達到在不同的時間段操作該對象.
  • serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,該方法會先被調用,然后才執行序列化操作。此功能可以用于清理對象,并返回一個包含對象中所有應被序列化的變量名稱的數組。如果該方法未返回任何內容,則 NULL 被序列化,并產生一個 E_NOTICE 級別的錯誤
  • 代碼說明:

  • 與之相反, unserialize() 會檢查是否存在一個 __wakeup()方法。如果存在,則會先調用 __wakeup 方法,預先準備對象需要的資源。
  • __wakeup() 經常用在反序列化操作中,例如重新建立數據庫連接,或執行其它初始化操作。

    ??? ?????? ?????? 代碼說明:

    15.6類與對象的相關函數

    在面向對象編程中,有一系列的函數,可以來對類和對象以及成員方法進行操作。我們重點講解5個,其它的函數就請同學們自己去看一下即可.

    代碼舉例說明:

    15.7traits 的講解(重點)

  • 看一個實際的需求
  • 代碼實現
  • traits技術的細節說明
  • ?

    第 16 章 反射技術

    16.1當我們echo $對象時,輸出該對象的屬性,成員方法等等信息

  • 舉例說明:
  • 16.2反射機制的基本介紹

    PHP 5 具有完整的反射 API,添加了對類、接口、函數、方法和擴展進行反向工程的能力。 此外,反射 API 提供了方法來取出函數、類和方法中的文檔注釋。

    16.3反射機制的使用場景

  • 寫底層框架(比如tp框架有一個控制器調度原理)
  • 擴展類的功能
  • 管理大量的未知類
  • 16.4看一個需求-一會我們一起搞定他

    16.5我們看一個簡單的案例-反向代理調用

  • 使用反射機制代理帶有某個對象的方法
  • 代碼說明
  • 16.6反射機制的綜合小練習-tp的控制器調度原理

    走代碼:

    16.7反射練習

    ?

    16.8小結:

    ?

    ?

    文章來自泰牛PHP課堂筆記

    ?

    ?

    總結

    以上是生活随笔為你收集整理的面向对象知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。