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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面向对象知识点

發(fā)布時(shí)間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象知识点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面向?qū)ο缶幊?/p>

第 1 章?????????? 類(lèi)與對(duì)象................................................................................................................ 1

1.1???????????????? 學(xué)習(xí)技術(shù)的套路??????????????????????????????????????????????????????????????????????????????????????????????????????? 1

1.2???????????????? 看一個(gè)實(shí)際的需求??????????????????????????????????????????????????????????????????????????????????????????????????? 1

1.3???????????????? php支持面向?qū)ο????????????????????????????????????????????????????????????????????????????????????????????????????? 3

1.4???????????????? 類(lèi)與對(duì)象的關(guān)系??????????????????????????????????????????????????????????????????????????????????????????????????????? 4

1.5???????????????? 如果理解類(lèi)與對(duì)象??????????????????????????????????????????????????????????????????????????????????????????????????? 6

1.6???????????????? 類(lèi)的定義????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6

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

1.8???????????????? 創(chuàng)建對(duì)象的說(shuō)明??????????????????????????????????????????????????????????????????????????????????????????????????????? 7

1.9???????????????? 對(duì)象傳遞方式(重點(diǎn), 難點(diǎn))???????????????????????????????????????????????????????????????????????????????????????? 9

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

第 2 章?????????? 構(gòu)造方法(函數(shù))..................................................................................................... 14

2.1???????????????? 一個(gè)需求,引出構(gòu)造函數(shù)??????????????????????????????????????????????????????????????????????????????????????? 14

2.2???????????????? 構(gòu)造函數(shù)的基本介紹?????????????????????????????????????????????????????????????????????????????????????????????? 14

2.3???????????????? 快速入門(mén)案例????????????????????????????????????????????????????????????????????????????????????????????????????????? 14

2.4???????????????? 構(gòu)造函數(shù)的細(xì)節(jié)和注意事項(xiàng)???????????????????????????????????????????????????????????????????????????????????? 15

2.5???????????????? 默認(rèn)構(gòu)造函數(shù)????????????????????????????????????????????????????????????????????????????????????????????????????????? 16

2.6???????????????? 構(gòu)造函數(shù)的小結(jié)????????????????????????????????????????????????????????????????????????????????????????????????????? 18

2.7???????????????? 類(lèi)定義的進(jìn)一步完善?????????????????????????????????????????????????????????????????????????????????????????????? 18

第 3 章?????????? 析構(gòu)函數(shù)............................................................................................................... 20

3.1???????????????? 簡(jiǎn)單的介紹???????????????????????????????????????????????????????????????????????????????????????????????????????????? 20

3.2???????????????? php文件執(zhí)行的流程???????????????????????????????????????????????????????????????????????????????????????????????? 20

3.3???????????????? 析構(gòu)函數(shù)的基本使用?????????????????????????????????????????????????????????????????????????????????????????????? 21

3.4???????????????? 析構(gòu)函數(shù)的小結(jié)????????????????????????????????????????????????????????????????????????????????????????????????????? 22

3.5???????????????? 析構(gòu)函數(shù)的最佳實(shí)踐?????????????????????????????????????????????????????????????????????????????????????????????? 22

3.6???????????????? 垃圾回收機(jī)制????????????????????????????????????????????????????????????????????????????????????????????????????????? 24

3.7???????????????? 類(lèi)定義的完善????????????????????????????????????????????????????????????????????????????????????????????????????????? 25

?

?

第 1 章 類(lèi)與對(duì)象

1.1 學(xué)習(xí)技術(shù)的套路

1.2 看一個(gè)實(shí)際的需求

?

  • 使用現(xiàn)有的技術(shù)來(lái)解決
  • ?

  • 使用面向?qū)ο蟮姆绞絹?lái)解決
  • 代碼來(lái)一個(gè)快速入門(mén)的案例
  • 說(shuō)明
  • class 是一個(gè)關(guān)鍵字,表示這是一個(gè)類(lèi),不能修改
  • public $name , 是一個(gè)成員屬性, 當(dāng)我們類(lèi)定義的{} 中定義的變量,就是一個(gè)成員屬性
  • public 是訪問(wèn)修飾符, 他是用于控制成員屬性(變量)的訪問(wèn)范圍的, 除了public還有兩個(gè),protected 和 private ,后面我們會(huì)詳細(xì)介紹
  • $cat1 = new Cat , 這個(gè)叫實(shí)例化一個(gè)對(duì)象, $cat1 就是一個(gè)對(duì)象, new 是一個(gè)關(guān)鍵字,表示新創(chuàng)建一個(gè)對(duì)象
  • $cat1->name = '小白'; 表示給成員屬性賦值,-> 符號(hào)叫做對(duì)象運(yùn)算符
  • 當(dāng)我們需要看一個(gè)對(duì)象的情況時(shí),我們可以通過(guò) var_dump 來(lái)輸出該對(duì)象
  • 1.3 php支持面向?qū)ο?/span>

    ?

    職業(yè)規(guī)劃:

    PHP + 前端技術(shù) ===> 全棧工程師

    架構(gòu)師

    python(對(duì)項(xiàng)目架構(gòu)和運(yùn)維[負(fù)載,讀寫(xiě)分離,優(yōu)化等等 ,大流量,大并發(fā),大數(shù)據(jù)]) + linux(centos/ubuntu) + unix(freebsd, solars) + 算法

    cto => 首先技術(shù)官

    ceo => 首先執(zhí)行官

    1.4 類(lèi)與對(duì)象的關(guān)系

  • 介紹
  • 在面向?qū)ο缶幊讨?#xff0c;最重要的概念就是 類(lèi) 和對(duì)象,因此我們必須將他們的關(guān)系和區(qū)別搞清楚.

    舉例說(shuō)明:

    說(shuō)明: 從上面的代碼我們可以看出

  • 一個(gè)類(lèi)可以創(chuàng)建多個(gè)對(duì)象
  • 不同的對(duì)象的標(biāo)識(shí)符#編碼,是不一樣的,有系統(tǒng)在創(chuàng)建對(duì)象時(shí)分配的標(biāo)識(shí)符,按編號(hào)的順序分配
  • 1.5 如果理解類(lèi)與對(duì)象

    1.6 類(lèi)的定義

    class? 類(lèi)名{

    ????? 訪問(wèn)修飾符 成員屬性1;

    ?? 訪問(wèn)修飾符 成員屬性2;

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

    }

    1.7 成員屬性

  • 文檔說(shuō)明
  • 類(lèi)的變量成員叫做“屬性”,或者叫“字段”、“特征”,在本文檔統(tǒng)一稱(chēng)為“屬性”。屬性聲明是由關(guān)鍵字 public,protected 或者 private 開(kāi)頭,然后跟一個(gè)普通的變量聲明來(lái)組成。屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指 PHP 腳本在編譯階段時(shí)就可以得到其值,而不依賴(lài)于運(yùn)行時(shí)的信息才能求值。

  • 通俗說(shuō)明:
  • 成員屬性是類(lèi)的一個(gè)組成部分,一般是基本數(shù)據(jù)類(lèi)型(整數(shù),字符串等),

    也可是復(fù)合類(lèi)型(對(duì)象、數(shù)組) 資源類(lèi)型。比如我們前面定義貓類(lèi)的

    public $age 就是成員屬性。

  • 代碼舉例說(shuō)明
  • ?

    1.8 創(chuàng)建對(duì)象的說(shuō)明

    說(shuō)明

  • 在使用默認(rèn)構(gòu)造方法時(shí),創(chuàng)建對(duì)象的
  • $對(duì)象名? =? new 類(lèi)名()

    $對(duì)象名? =? new 類(lèi)名

    等價(jià)

    舉例:

  • 如何訪問(wèn)成員屬性
  • 類(lèi)名的規(guī)范說(shuō)明
  • 類(lèi)名不區(qū)分大小寫(xiě).

    類(lèi)名命名規(guī)范

    關(guān)于函數(shù),變量,常量,接口等等的命名規(guī)范,請(qǐng)參考手冊(cè).

    ?

    1.9 對(duì)象傳遞方式(重點(diǎn), 難點(diǎn))

  • 先請(qǐng)大家看一段代碼,從而引起思考
  • ?

    ?

    注意當(dāng) 對(duì)象傳遞方式是 $p1 = $p2 , 分析如上圖

    ?

    注意當(dāng) 對(duì)象傳遞方式是 $p1 = &$p2 , 分析如上圖

    ?

    1.10成員方法(函數(shù))

  • 看一個(gè)需求
  • 當(dāng)我們需要讓對(duì)象完成某個(gè)任務(wù)(比如計(jì)算,比如上傳下載文件,分頁(yè)等等), 就需要在類(lèi)中定義函數(shù), 這時(shí)我們就將這樣的函數(shù)稱(chēng)為 成員方法.

    ?

  • 舉例說(shuō)明:
  • 代碼走:

    ?

    原理分析圖如下:

    ?

  • 成員方法的基本語(yǔ)法
  • class? 類(lèi)名{

    ????? 成員屬性;

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

    ??? 方法體;

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

    }

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

    ??? 方法體;

    return 語(yǔ)句;//

    }

    ?

    }

    ?

    說(shuō)明

  • 成員方法定義在類(lèi)中.
  • 成員方法前面可以有訪問(wèn)修飾符,如果你不寫(xiě),默認(rèn)為public
  • 成員方法的運(yùn)行原理和普通的函數(shù)是一樣的.
  • 成員方法的小結(jié)
  • 類(lèi)定義的進(jìn)一步完善
  • ?

    第 2 章 構(gòu)造方法(函數(shù))

    2.1 一個(gè)需求,引出構(gòu)造函數(shù)

    什么是構(gòu)造函數(shù)呢?在回答這個(gè)問(wèn)題之前,我們來(lái)看一個(gè)需求:前面我們?cè)趧?chuàng)建人類(lèi)的對(duì)象時(shí),是先把一個(gè)對(duì)象創(chuàng)建好后,再給他的年齡和姓名屬性賦值,如果現(xiàn)在我要求,在創(chuàng)建人類(lèi)的對(duì)象時(shí),就指定這個(gè)對(duì)象的年齡和姓名,該怎么做?

    2.2 構(gòu)造函數(shù)的基本介紹

  • 基本語(yǔ)法
  • class? 類(lèi)名{

    ????? //構(gòu)造函數(shù)

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

    ?????? //可以對(duì)成員屬性進(jìn)行初始化.

    }

    }

    ??? ?????? 說(shuō)明

  • 構(gòu)造函數(shù)的訪問(wèn)修飾符可以是 public , protected, private , 一般情況下是public ,默認(rèn)就是public
  • __construct 是關(guān)鍵字,不能修改, __ 是兩個(gè)_ 下劃線。
  • 構(gòu)造函數(shù)沒(méi)有返回值, 即沒(méi)有return
  • 構(gòu)造函數(shù)是系統(tǒng)調(diào)用的,程序員不能顯示調(diào)用
  • 2.3 快速入門(mén)案例

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

    2.4 構(gòu)造函數(shù)的細(xì)節(jié)和注意事項(xiàng)

  • 構(gòu)造函數(shù)沒(méi)有返回值,即沒(méi)有return, 就算寫(xiě)了也沒(méi)有用處
  • 在創(chuàng)建一個(gè)類(lèi)的新對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)的調(diào)用該類(lèi)的構(gòu)造方法完成對(duì)新對(duì)象的初始化
  • 構(gòu)造函數(shù)的作用是完成對(duì)成員屬性的初始化任務(wù),而不是創(chuàng)建對(duì)象本身. 所以以后在oop編程中,需要對(duì)成員屬性進(jìn)行初始化,則將這段代碼放在構(gòu)造函數(shù)中即可
  • 在一個(gè)類(lèi)中,構(gòu)造函數(shù)有且只能有一個(gè), 如果定義多個(gè),就會(huì)報(bào)錯(cuò).
  • 在php4中,可以使用 類(lèi)名作為構(gòu)造函數(shù),在php5中也支持
  • 2.5 默認(rèn)構(gòu)造函數(shù)

  • 如果在類(lèi)中,沒(méi)有定義構(gòu)造函數(shù),那么會(huì)有一個(gè)默認(rèn)的構(gòu)造函數(shù),形式如下,舉例說(shuō)明
  • 如何將一個(gè)對(duì)象的屬性輸出并顯示
  • 說(shuō)明: 通過(guò)上面的案例,我們講解了兩個(gè)重要的點(diǎn)

  • 如果顯示成員屬性的值
  • 深刻理解了$this 的指向當(dāng)前調(diào)用對(duì)象的特點(diǎn).
  • this的使用注意事項(xiàng)
  • this這個(gè)關(guān)鍵字,只能在類(lèi)的方法中使用,而不能在類(lèi)的外部使用.

    2.6 構(gòu)造函數(shù)的小結(jié)

    2.7 類(lèi)定義的進(jìn)一步完善

    ?

    第 3 章 析構(gòu)函數(shù)

    3.1 簡(jiǎn)單的介紹

    基本的說(shuō)明: 文檔的說(shuō)明:

    PHP 5 引入了析構(gòu)函數(shù)的概念,這類(lèi)似于其它面向?qū)ο蟮恼Z(yǔ)言,如 C++。析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷(xiāo)毀時(shí)執(zhí)行

    我們來(lái)理解一下上面的話

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

    如果程序員不去顯示銷(xiāo)毀對(duì)象,那么在程序執(zhí)行完畢后,這個(gè)對(duì)象就會(huì)被系統(tǒng)銷(xiāo)毀,這個(gè)就是系統(tǒng)銷(xiāo)毀

    3.2 php文件執(zhí)行的流程

    畫(huà)圖:

    3.3 析構(gòu)函數(shù)的基本使用

  • 基本語(yǔ)法
  • class? 類(lèi)名{

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

    ?????? //函數(shù)體

    ?? //析構(gòu)函數(shù)的最重要的作用,就是釋放對(duì)象創(chuàng)建的資源

    ?? //比如 數(shù)據(jù)庫(kù)連接, 文件句柄, 繪圖句柄..

    }

    }

    ?

    說(shuō)明

  • 析構(gòu)函數(shù)都是public
  • __destuct 是關(guān)鍵字,不要修改
  • 析構(gòu)函數(shù)沒(méi)有形式參數(shù)
  • 析構(gòu)函數(shù)是系統(tǒng)調(diào)用
  • 析構(gòu)函數(shù)在如下情況會(huì)被系統(tǒng)調(diào)用
  • php文件執(zhí)行完畢
  • 某個(gè)對(duì)象的所有引用都被刪除后, 馬上就會(huì)調(diào)用析構(gòu)函數(shù)
  • ?

  • 快速入門(mén)案例
  • ?

    3.4 析構(gòu)函數(shù)的小結(jié)

    3.5 析構(gòu)函數(shù)的最佳實(shí)踐

    我們使用析構(gòu)函數(shù)完成對(duì)資源的及時(shí)釋放

    說(shuō)明

  • 關(guān)于在析構(gòu)函數(shù)中釋放資源的問(wèn)題,如果我們對(duì)效率沒(méi)有很高很特殊的要求,完全可以不使用析構(gòu)函數(shù).
  • 如果我們不確定代碼后面是否還會(huì)使用資源(比如鏈接),那么我們建議最好不要使用析構(gòu)函數(shù)
  • 項(xiàng)目有特殊和明確的要求時(shí),我們可以使用析構(gòu)函數(shù),顯示的銷(xiāo)毀對(duì)象是,在析構(gòu)函數(shù)中,釋放資源.
  • 3.6 垃圾回收機(jī)制

    ?

    3.7 類(lèi)定義的完善

    ?

    ?

    第 4 章 魔術(shù)方法

    4.1 魔術(shù)方法一覽

    說(shuō)明

  • 魔術(shù)方法都是系統(tǒng)提供,程序員使用即可.
  • 所有的魔術(shù)方法,前面都是以? __ 開(kāi)頭的 _是兩個(gè)下劃線.
  • 我們?cè)谧远x函數(shù)時(shí),就不要使用 __開(kāi)頭了.
  • 魔術(shù)方法是在滿足某個(gè)條件(一會(huì)一個(gè)一個(gè)的說(shuō)明)時(shí),有系統(tǒng)自動(dòng)的調(diào)用.
  • 4.2 訪問(wèn)控制修飾符的基本入門(mén)介紹

  • 介紹
  • 因?yàn)槟g(shù)方法和訪問(wèn)修飾符關(guān)系密切,因此我們需要先學(xué)習(xí)一下訪問(wèn)控制修飾符的基本知識(shí), 這里我們先講一個(gè)基本的介紹.

  • 文檔的介紹:
  • 對(duì)屬性方法的訪問(wèn)控制,是通過(guò)在前面添加關(guān)鍵字 public(公有),protected(受保護(hù))或 private(私有)來(lái)實(shí)現(xiàn)的。被定義為公有的類(lèi)成員可以在任何地方被訪問(wèn)。被定義為受保護(hù)的類(lèi)成員則可以被其自身以及其子類(lèi)和父類(lèi)訪問(wèn)。被定義為私有的類(lèi)成員則只能被其定義所在的類(lèi)訪問(wèn)

  • 訪問(wèn)控制修飾符可以修飾成員屬性,也可以修飾方法.
  • 有三種 public , protected 和 private
  • 使用代碼來(lái)說(shuō)明
  • 4.3 魔術(shù)方法之-__get 和 __set函數(shù)

  • 基本的介紹
  • 當(dāng)程序員去使用不可以訪問(wèn)的屬性時(shí),系統(tǒng)就會(huì)調(diào)用__get方法.
  • 不可以訪問(wèn)的屬性指的是(1 . 該屬性不存在 2. 直接訪問(wèn)了protected或者private屬性)
  • 當(dāng)程序員去給不可以訪問(wèn)的屬性直接賦值,系統(tǒng)就會(huì)調(diào)用__set方法
  • 舉例說(shuō)明
  • 需求是: 如果對(duì)象有一個(gè)成員變量是private、protectd的,我希望在在類(lèi)的外部通過(guò) : $對(duì)象名->變量名的方式來(lái)賦值和取值,怎么辦?

  • 課堂練習(xí)
  • 4.4 魔術(shù)方法之-__isset 和 __unset函數(shù)

  • 基本介紹
  • 當(dāng)對(duì)不可訪問(wèn)的屬性進(jìn)行了 isset($對(duì)象名->屬性), empty($對(duì)象名->屬性)操作,那么__isset函數(shù)就會(huì)被系統(tǒng)調(diào)用。
  • 不可訪問(wèn)的屬性 仍然和前面說(shuō)的一樣 。
  • 當(dāng)對(duì)不可訪問(wèn)的屬性進(jìn)行了 unset($對(duì)象名->屬性), 那么__unset函數(shù)就會(huì)被系統(tǒng)調(diào)用
  • 代碼說(shuō)明
  • ?

  • 補(bǔ)充說(shuō)明一下語(yǔ)法現(xiàn)象-屬性重載
  • 補(bǔ)充說(shuō)明一下-property_exists()函數(shù)
  • <?php

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

    ????? //property_exists說(shuō)明

    ?

    ????? class A{

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

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

    ?

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

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

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

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

    ????? }

    ?

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

    ?????

    ????? 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(對(duì)象名, 屬性)

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

    ????? //2. 如果該對(duì)象沒(méi)有有這個(gè)屬性, 則繼續(xù)判斷該對(duì)象對(duì)應(yīng)的類(lèi)是否定義過(guò)這個(gè)屬性,如果定義過(guò)仍然返回真,否則才返回假

    ?

    ?

    ?

    ?

    ?

    4.5 魔術(shù)方法之-__toString 函數(shù)

  • 基本介紹:
  • 當(dāng)我們希望將一個(gè)對(duì)象當(dāng)做字符串來(lái)輸出時(shí),就會(huì)觸發(fā)__toString魔術(shù)方法.

  • 代碼說(shuō)明
  • 小練習(xí)
  • 做兩個(gè)怪物!

    ?

    4.6 魔術(shù)方法之-__clone函數(shù)

  • 基本介紹 :
  • 當(dāng)我們需要將一個(gè)對(duì)象完全的賦值一份, 保證兩個(gè)對(duì)象的屬性和屬性值一樣,但是他們的數(shù)據(jù)庫(kù)空間獨(dú)立,則可以使用對(duì)象克隆。

  • 案例說(shuō)明
  • 說(shuō)明

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

  • 基本介紹:
  • 當(dāng)我們調(diào)了一個(gè)不可以訪問(wèn)的成員方法時(shí),__call魔術(shù)方法就會(huì)被調(diào)用.
  • 不可以訪問(wèn)的成員方法的是指(1. 該成員方法不存在, 2. 成員方法是protected或者 private)
  • 需求
  • 我們就是希望,在類(lèi)的外部直接調(diào)用不可訪問(wèn)的成員方法(private , protected).

  • 案例說(shuō)明
  • 課堂小練習(xí)
  • ?

    點(diǎn)評(píng):

    ?

    第 5 章 類(lèi)的自動(dòng)加載

    5.1 看一個(gè)需求

    說(shuō)明

  • 在我們的開(kāi)發(fā)中, 一個(gè)類(lèi)對(duì)應(yīng)一個(gè)文件,其命名方式為 類(lèi)名.class.php
  • 在需要某個(gè)類(lèi)時(shí),通過(guò) include 或者? require 引入即可.
  • 問(wèn)題請(qǐng)思考,如果一個(gè)文件使用到多個(gè)類(lèi),怎么辦?
  • 5.2 使用傳統(tǒng)的方法來(lái)解決

    5.3 對(duì)代碼優(yōu)化,使用類(lèi)的自動(dòng)加載來(lái)完成

    5.4 對(duì)代碼思考,對(duì)代碼進(jìn)行靈活性的處理

  • 分析和思路
  • 對(duì)應(yīng)的代碼
  • common.php 文件

    5.5 使用spl_autoload_register? 的高級(jí)方式(了解)來(lái)完成類(lèi)的自動(dòng)加載

  • 一個(gè)案例
  • ?

    第 6 章 靜態(tài)屬性

    6.1 看一個(gè)開(kāi)發(fā)的需求

    6.2 思路(使用現(xiàn)有的技術(shù)解決)

  • 思路: 定義一個(gè)全局的變量 $total_num, 當(dāng)有一個(gè)小朋友加入游戲時(shí),我們就加1, 當(dāng)我們需要查看有多少小朋友玩時(shí),直接輸出.
  • 代碼實(shí)現(xiàn) :
  • ?

    6.3 對(duì)上面代碼的進(jìn)行分析和優(yōu)化

  • 分析: 雖然可以解決問(wèn)題,但是不是以面向?qū)ο蟮姆绞絹?lái)解決,因此我們需要優(yōu)化
  • 解決方式: 使用靜態(tài)變量來(lái)完成:靜態(tài)變量是屬于所有對(duì)象, 因此可以被所有的對(duì)象共享.
  • 代碼解決:
  • 內(nèi)存的分析圖
  • ?

    6.4 靜態(tài)變量的其它說(shuō)明

  • 基本概念的再說(shuō)明
  • 靜態(tài)屬性是該類(lèi)的所有對(duì)象共享的變量,任何一個(gè)該類(lèi)的對(duì)象去訪問(wèn)它時(shí),取到的都是相同的值,同樣任何一個(gè)該類(lèi)的對(duì)象去修改它時(shí),修改的也是同一個(gè)變量。這個(gè)從前面的圖也可看出來(lái).

  • 定義靜態(tài)屬性
  • 訪問(wèn)修飾符 static 靜態(tài)屬性名;
  • static 訪問(wèn)修飾符 靜態(tài)屬性名;
  • 說(shuō)明上面兩種方式是等價(jià)的.

    6.5 如何訪問(wèn)靜態(tài)屬性

  • 在類(lèi)的內(nèi)部訪問(wèn)
  • 可以使用兩種方式? self::$靜態(tài)屬性名? ,? 類(lèi)名::$靜態(tài)屬性名

    :: 叫 范圍解析符.

    舉例:

  • 在類(lèi)的外部訪問(wèn)
  • 如果要在類(lèi)的外部訪問(wèn)靜態(tài)屬性,靜態(tài)屬性需要是public ,否則也不能直接訪問(wèn), 訪問(wèn)的形式是 類(lèi)名::$屬性名;

  • $this和self的區(qū)別
  • 6.6 靜態(tài)屬性的使用注意事項(xiàng)

    6.7 課后練習(xí)題

    <?php

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

    ????? /*

    ????? 要求:

    ????? 請(qǐng)?jiān)O(shè)計(jì)一個(gè)Person類(lèi), (有 名字, 年齡? 和? 蛋糕 三個(gè)屬性)

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

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

    ????? 問(wèn)兩天后,還剩多少塊蛋糕,(編寫(xiě)一個(gè) showCake() 來(lái)顯示)

    ????? 請(qǐng)計(jì)算,蛋糕一共可以吃多少天.

    ?

    ????? */

    ?

    ?

    ????? class Person{

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

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

    ????? ?????? // 蛋糕一共1000塊,是所有人共享的, 因?yàn)楣蚕淼?#xff0c;因此我們應(yīng)該設(shè)為static

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

    ?

    ????? ?????? //構(gòu)造函數(shù)

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

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

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

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

    ?

    ????? ?????? //編寫(xiě)一個(gè)eat方法

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

    ?

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

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

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

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

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

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

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

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

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

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

    ?

    ????? ?????? //編寫(xiě)一個(gè)方法,顯示還有多少塊蛋糕

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

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

    ????? ?????? ?????? echo '<br> 當(dāng)前還有 ' . self::$cakeNum . ' 蛋糕...';

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

    ?

    ????? ??????

    ?

    ????? }

    ?

    ????? //使用

    ????? //問(wèn)兩天后,還剩多少塊蛋糕,(編寫(xiě)一個(gè) showCake() 來(lái)顯示)

    ????? //1. 創(chuàng)建四個(gè)對(duì)象

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

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

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

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

    ?

    ????? //2. 統(tǒng)計(jì)兩天后

    ????? $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技術(shù)) 】

    ????? ?????? $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 章 靜態(tài)方法

    7.1 基本的介紹

    當(dāng)程序員需要對(duì)靜態(tài)屬性進(jìn)行操作時(shí),可以定義靜態(tài)方法來(lái)處理, 靜態(tài)方法是專(zhuān)門(mén)用于操作靜態(tài)屬性.

  • 靜態(tài)方法的基本語(yǔ)法
  • class 類(lèi){

    ????? 訪問(wèn)修飾符? static? function 函數(shù)名(形參){

    ?????? //函數(shù)體

    }

    }

    ??? ?????? 說(shuō)明

  • 靜態(tài)方法是在類(lèi)中定義的
  • static 是關(guān)鍵字,不能修改.
  • 靜態(tài)方法專(zhuān)門(mén)用于操作靜態(tài)屬性
  • 靜態(tài)方法可以通過(guò)類(lèi)名直接調(diào)用. 形式時(shí)候 類(lèi)名::靜態(tài)方法名(參數(shù) )
  • 快速入門(mén)案例
  • 7.2 靜態(tài)方法的細(xì)節(jié)討論

  • 在類(lèi)外部調(diào)用靜態(tài)方法:? 類(lèi)名::靜態(tài)方法名 或者 對(duì)象名->靜態(tài)方法名 或者 對(duì)象名::靜態(tài)方法(語(yǔ)法支持,但是不推薦)
  • 舉例說(shuō)明:

  • 在類(lèi)內(nèi)部調(diào)用靜態(tài)方法:??? self::靜態(tài)方法名 或者 類(lèi)名::靜態(tài)方法名 通過(guò) $this也可以
  • 舉例說(shuō)明:

  • 注意:靜態(tài)方法中只能訪靜態(tài)屬性,不能訪問(wèn)非靜態(tài)屬性(普通屬性, 沒(méi)有static)
  • 舉例:

  • 普通的成員方法,可以訪問(wèn)靜態(tài)屬性和非靜態(tài)屬性
  • ?

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

  • 先看實(shí)際的需求
  • ?

  • 代碼實(shí)現(xiàn)
  • 第一種版本-ok

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

  • 上面代碼對(duì)應(yīng)的示意圖:
  • 知識(shí)點(diǎn)的補(bǔ)充
  • ?

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

    8.1 基本介紹

    oop編程的三大特征是: 封裝性, 繼承, 多態(tài). 說(shuō)明一下,在php面向?qū)ο缶幊讨?#xff0c;多態(tài)提的并不是很多,因?yàn)閜hp本身就是天生的多態(tài).

    8.2 抽象

    在面向?qū)ο缶幊讨?#xff0c;將一類(lèi)事物的共有的屬性(成員屬性)和行為(成員方法)提取出來(lái),形成一個(gè)模板(類(lèi)), 這種解決問(wèn)題的方法就是抽象.

    8.3 抽象的實(shí)際案例

    代碼說(shuō)明:

    8.4 封裝的基本概念

    8.5 封裝的具體實(shí)現(xiàn)-訪問(wèn)控制符

  • 說(shuō)明: 在php中,提供了三種訪問(wèn)控制符 public , protected 和private, 訪問(wèn)控制的訪問(wèn)是 public >protected > private. 具體我們看一個(gè)圖:(重點(diǎn)
  • 總結(jié):

    public?? ?????? 類(lèi)內(nèi)部、外部和子類(lèi)都可以訪問(wèn);

    protected?? 表示受保護(hù)的,只有本類(lèi)或子類(lèi)可以訪問(wèn);

    private??????? 表示私有的,只有本類(lèi)內(nèi)部可以使用;

    強(qiáng)調(diào): 上面的說(shuō)的訪問(wèn)控制訪問(wèn),對(duì)屬性和成員方法都起作用.

  • 代碼舉例說(shuō)明
  • 8.6 如何訪問(wèn)protected和private屬性的三種形式

  • 使用魔術(shù)方法__get 和 __set 來(lái)實(shí)現(xiàn)對(duì)protected 和 private 屬性的操作
  • 總結(jié)

  • 優(yōu)點(diǎn): 簡(jiǎn)單,一對(duì)__set 和 __get 就可以搞定所有的private , protected屬性
  • 缺點(diǎn):? 不夠靈活,沒(méi)有辦法對(duì)各個(gè)屬性進(jìn)行控制和驗(yàn)證.
  • 對(duì)每一個(gè)private 和 protected 屬性提供一對(duì)get/set方法, 這樣就可以分別控制,各個(gè)屬性,并進(jìn)行驗(yàn)證.
  • 舉例說(shuō)明:

    說(shuō)明

  • 優(yōu)點(diǎn): 可以對(duì)每個(gè)屬性進(jìn)行驗(yàn)證,因此很靈活.
  • 缺點(diǎn): 會(huì)造成有比較多的setXxx 和 getXxx方法,但是這個(gè)沒(méi)有什么大的問(wèn)題.
  • 推薦使用這種方法,在實(shí)際開(kāi)發(fā)中,這種方式比較多.
  • 寫(xiě)一個(gè)成員方法,可以根據(jù)業(yè)務(wù)邏輯,一次性對(duì)多個(gè)屬性進(jìn)行批量操作 。
  • 舉例說(shuō)明:

    <?php

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

    ?

    ????? //Movie(名稱(chēng),導(dǎo)演,成本(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){

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

    ????? ?????? ?????? //簡(jiǎn)單方式

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

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

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

    ?

    ????? ?????? ?????? //結(jié)合setXxx 來(lái)完成

    ????? ?????? ?????? $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){

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

    ????? ?????? ?????? //加入數(shù)據(jù)的驗(yàn)證和判斷

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

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

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

    ????? ?????? ?????? ?????? echo '<br> 輸入成本格式有問(wèn)題 ';

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

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

    ?

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

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

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

    ?

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

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

    ????? ?????? ?????? //加入數(shù)據(jù)的驗(yàn)證和判斷

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

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

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

    ????? ?????? ?????? ?????? echo '<br> 輸入票房格式有問(wèn)題 ';

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

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

    ?

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

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

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

    ?

    ????? }

    ?

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

    ?

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

    ?

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

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

    ?

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

    8.7 在開(kāi)發(fā)中,如何選擇操作方式

  • 如果我們希望直接通過(guò) $對(duì)象名->屬性名的方式來(lái)操作屬性,則使用__set 和 __get 函數(shù)即可
  • 如果我們希望對(duì)各個(gè)屬性分別進(jìn)行驗(yàn)證,則使用setXxx 和 getXxx
  • 如果希望同時(shí)操作多個(gè)屬性,選擇第三種
  • 項(xiàng)目經(jīng)理要求.
  • 8.8 封裝的細(xì)節(jié)說(shuō)明

  • 普通屬性要定義為公有,受保護(hù),私有之一。如果用 var 定義,則被視為公有。靜態(tài)屬性可以不指定訪問(wèn)修飾符,默認(rèn)是public
  • 舉例說(shuō)明:

  • 類(lèi)中的方法可以被定義為公有,私有或受保護(hù)。如果沒(méi)有設(shè)置這些關(guān)鍵字,則該方法默認(rèn)為公有(不管這個(gè)方法是靜態(tài)的,還是非靜態(tài)都滿足這個(gè)規(guī)則)
  • ?

    8.9 對(duì)象運(yùn)算符的連用現(xiàn)象

    要求是 : 通過(guò)一個(gè)學(xué)生對(duì)象,可以訪問(wèn)到該學(xué)生所在班級(jí)的信息.

    代碼實(shí)現(xiàn):

    對(duì)應(yīng)的原理分析圖:

    8.10課后練習(xí)題

    //評(píng)講....

    <?php

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

    ????? /*

    ????? ??????

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

    ????? 編寫(xiě)一個(gè)Dog類(lèi)(名字,年齡,性別,主人)

    ????? 編寫(xiě)一個(gè)Master類(lèi)(名字,年齡,寵物狗)

    ????? 創(chuàng)建一個(gè)Dog對(duì)象和Master對(duì)象,通過(guò)Dog對(duì)象可以找到對(duì)應(yīng)主人的信息,通過(guò)Master對(duì)象可以找到對(duì)應(yīng)寵物狗的信息[提示,需要各寫(xiě)一個(gè)方法.]

    ?????

    ????? */

    ?

    ????? 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;

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

    ????? }

    ?

    ????? //創(chuàng)建一只狗

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

    ?

    ????? //創(chuàng)建一個(gè)人

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

    ?

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

    ????? var_dump($master);

    ?

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

    ????? var_dump($dog);

    ?

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

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

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

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

    9.1 看一個(gè)實(shí)際的需求(問(wèn)題)

    開(kāi)發(fā)一個(gè)學(xué)生考試系統(tǒng),學(xué)生可以考試并且測(cè)評(píng)分?jǐn)?shù),并顯示考了多少分.(小學(xué)生,大學(xué)生.)

    代碼:

    分析問(wèn)題

  • Pupil 類(lèi)和 Graduate 類(lèi),相似度很高,很多相同的屬性和方法.
  • 這時(shí)已經(jīng)出現(xiàn)了代碼的冗余, 這樣不利于類(lèi)的管理和維護(hù).
  • 解決的方法就是繼承.
  • 9.2 繼承的基本思想是

    9.3 使用繼承的方式對(duì)上面的代碼進(jìn)行改寫(xiě)

    1

    9.4 繼承的概念在說(shuō)明

    說(shuō)明

  • 繼承的根本作用就是解決代碼的復(fù)用性,減少冗余度 , 同時(shí)利用類(lèi)的維護(hù)和擴(kuò)展
  • 繼承時(shí)的關(guān)鍵字是 extends , 這個(gè)是固定的,不能修改.
  • 9.5 繼承的細(xì)節(jié)

  • 當(dāng)子類(lèi)繼承了父類(lèi),并不是父類(lèi)所有的屬性和方法,都可以被子類(lèi)訪問(wèn), 子類(lèi)只能訪問(wèn)父類(lèi)的public 和 protected 屬性和方法
  • 舉例:

    說(shuō)明結(jié)論

    • 子類(lèi) 可以訪問(wèn) 父類(lèi)的 public 屬性和方法 (不管是子類(lèi)的內(nèi)部,還是外部)
    • 子類(lèi)可以訪問(wèn)父類(lèi)的protected 的屬性和方法,但是必須在子類(lèi)的內(nèi)部才可以訪問(wèn).
    • 子類(lèi)不能訪問(wèn)父類(lèi)的private 的屬性和方法
    • 在輸出子類(lèi)對(duì)象時(shí),我們dump 可以看到父類(lèi)的私有屬性,但是這個(gè)私有屬性是輸入父類(lèi),在子類(lèi)中仍然無(wú)法訪問(wèn)
  • 繼承的本質(zhì)(重點(diǎn))
  • 我們?cè)诶斫饫^承的時(shí)候,應(yīng)該這樣理解:

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

    看一個(gè)示意圖

    ??? ??????

  • ?繼承的舉例說(shuō)明
  • 代碼說(shuō)明:

  • 關(guān)于繼承查找的順序和執(zhí)行的說(shuō)明
  • 以Book 類(lèi) 繼承了 Goods 為例進(jìn)行說(shuō)明

  • 當(dāng)我們?cè)L問(wèn)子類(lèi)的某個(gè)屬性或者方法時(shí),首先先到子類(lèi)中去查找是否有這個(gè)屬性或者方法,如果有 在繼續(xù)判斷是否可以訪問(wèn),如果可以訪問(wèn)就訪問(wèn),如果不能訪問(wèn),則報(bào)錯(cuò).
  • 當(dāng)我們?cè)L問(wèn)子類(lèi)的某個(gè)屬性或者方法時(shí),首先先到子類(lèi)中去查找是否有這個(gè)屬性或者方法,如果沒(méi)有, 就到該類(lèi)的父類(lèi)(如果有)去查找是否有這個(gè)屬性或者方法,如果有,就繼續(xù)判斷是否可以訪問(wèn),如果可以訪問(wèn)就訪問(wèn),如果不能訪問(wèn),就報(bào)錯(cuò).
  • 如果父類(lèi)還有父類(lèi),則依次類(lèi)推
  • 9.6 繼承的注意事項(xiàng)

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

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

  • 在創(chuàng)建某個(gè)子類(lèi)對(duì)象時(shí),默認(rèn)情況下會(huì)自動(dòng)調(diào)用其父類(lèi)的構(gòu)造函數(shù)(指在子類(lèi)沒(méi)有自定義構(gòu)造函數(shù)情況時(shí))
  • 如果在子類(lèi)中需要訪問(wèn)其父類(lèi)的方法(構(gòu)造方法/成員方法? 方法的訪問(wèn)修飾符是public/protected),可以使用父類(lèi)::方法名(或者 parent::方法名 ) 來(lái)完成。
  • 如果子類(lèi)(擴(kuò)展類(lèi))中的方法和父類(lèi)(基類(lèi))方法相同,我們稱(chēng)為方法重寫(xiě), 關(guān)于方法的重寫(xiě)我們?cè)诤竺嬗性敿?xì)的講解
  • 9.7 類(lèi)定義的進(jìn)一步完善

    9.8 繼承的課后練習(xí)題

    9.9 方法重載

  • 文檔的說(shuō)明
  • PHP所提供的"重載"(overloading)是指動(dòng)態(tài)地"創(chuàng)建"類(lèi)屬性和方法。我們是通過(guò)魔術(shù)方法(magic methods)__call _callStatic來(lái)實(shí)現(xiàn)的

  • 重載的英文 overloading
  • php中,重載是值動(dòng)態(tài)的創(chuàng)建屬性和方法.
  • 通過(guò)magic method 來(lái)實(shí)現(xiàn)
  • 9.10傳統(tǒng)的oop編程中,方法的重載指的是什么含義

  • 介紹
  • 在oop中,可以調(diào)用相同的函數(shù)名, 實(shí)現(xiàn)調(diào)用不同函數(shù)的結(jié)果,比如$obj->getSum($n1), $obj->getSum($n1, $2); 依靠函數(shù)不同的參數(shù)個(gè)數(shù)或者類(lèi)型來(lái)區(qū)分不同函數(shù).

    舉例:

    在php中,不能像上面這樣實(shí)現(xiàn)方法的重載.

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

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

    9.12課堂練習(xí)

    ?

    9.13魔術(shù)方法__callStatic 說(shuō)一下

    當(dāng)我們調(diào)用一個(gè)不可以訪問(wèn)(protected/private/不存在)的靜態(tài)方法時(shí),__callStatic魔術(shù)方法就會(huì)被系統(tǒng)調(diào)用。

    舉例說(shuō)明:

    9.14課后練習(xí)題

    9.15屬性的重載

  • 基本介紹
  • 當(dāng)我們?nèi)ソo一個(gè)不存在的屬性賦值時(shí),類(lèi)會(huì)自動(dòng)的動(dòng)態(tài)的創(chuàng)建一個(gè)對(duì)應(yīng)的屬性,這個(gè)屬性是public 的.

  • 對(duì)應(yīng)屬性重載的處理方式
  • 程序員不干預(yù),使用默認(rèn)機(jī)制來(lái)處理.
  • 禁止屬性重載.
  • 案例:

  • 專(zhuān)門(mén)寫(xiě)一個(gè)數(shù)組屬性和方法,來(lái)管理我們的重載的屬性.
  • 9.16方法的重寫(xiě)

  • 看一個(gè)實(shí)際的問(wèn)題
  • 看一個(gè)案例
  • 小結(jié)

  • 當(dāng)子類(lèi)和父類(lèi)的某個(gè)方法名一樣時(shí),我們就說(shuō)子類(lèi)的方法重寫(xiě)了父類(lèi)的這個(gè)方法
  • 重寫(xiě)(override), 有些文檔手冊(cè)把重寫(xiě)也叫做 覆蓋, 在我們授課中,我們統(tǒng)計(jì)叫方法重寫(xiě).
  • 如果子類(lèi)的方法重寫(xiě)父類(lèi)的方法,要求方法名和參數(shù)個(gè)數(shù)完全一樣,如果父類(lèi)使用了類(lèi)型約束,則子類(lèi)的這個(gè)方法也必須有相同的類(lèi)型.
  • 9.17方法重寫(xiě)的細(xì)節(jié)說(shuō)明

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

    9.18屬性的重寫(xiě)

  • 基本的介紹: 屬性也可以被重寫(xiě),重寫(xiě)的幾點(diǎn)注意事項(xiàng)
  • 只有public 和 protected 的屬性可以被重寫(xiě)
  • 屬性重寫(xiě)時(shí),也不能縮小父類(lèi)的屬性控制訪問(wèn)
  • 舉例
  • 9.19重寫(xiě)的課堂練習(xí)

    ?

    9.20補(bǔ)充一個(gè)知識(shí)點(diǎn)類(lèi)型約束

    PHP 5 可以使用類(lèi)型約束。函數(shù)的參數(shù)可以指定必須為對(duì)象(在函數(shù)原型里面指定類(lèi)的名字),接口數(shù)組(PHP 5.1 起)或者 callable(PHP 5.4 起)。不過(guò)如果使用 NULL作為參數(shù)的默認(rèn)值,那么在調(diào)用函數(shù)的時(shí)候依然可以使用 NULL 作為實(shí)參。

    舉例說(shuō)明一把:

    ?

    第 10 章 多態(tài)[了解]

    10.1基本介紹

    所謂多態(tài),就是在面向?qū)ο缶幊讨?#xff0c;一個(gè)對(duì)象在不同的情況下的多種狀態(tài), 根據(jù)不同的上下文環(huán)境來(lái)決定。

  • php本身就是天生的多態(tài)語(yǔ)言
  • 當(dāng)一個(gè)函數(shù)接收到不同對(duì)象時(shí),會(huì)自動(dòng)的判斷并調(diào)用對(duì)應(yīng)的方法.
  • 多態(tài)利于類(lèi)的維護(hù)和擴(kuò)展
  • 10.2舉例說(shuō)明

    使用代碼來(lái)完成上面的示意圖:

    10.3多態(tài)的課后練習(xí)題

    晚上完成即可.

    ?

    第 11 章 抽象類(lèi)

    11.1看一個(gè)開(kāi)發(fā)的實(shí)際需求

    當(dāng)我們編寫(xiě)一個(gè)父類(lèi), 有個(gè)方法是不確定的,比如

    class Animal {

    ????? public $name;

    ????? public function cry(){

    ?????? echo '<br> 動(dòng)物不知道怎么叫喚...';

    }

    }

    cry 這里是不確定,寫(xiě)了也是白寫(xiě), 沒(méi)有意義,因此, oop中,可以將這樣的方法做成抽象方法,類(lèi)就做成抽象類(lèi).

    11.2抽象類(lèi)的基本概念

  • 基本的概念
  • 基本語(yǔ)法
  • 11.3快速入門(mén)案例

  • 抽象類(lèi)主要用來(lái)被繼承,偏重設(shè)計(jì)
  • 當(dāng)一個(gè)成員方法前使用abstract 來(lái)修飾,該方法就是抽象方法
  • 當(dāng)一個(gè)類(lèi)名前有abstract來(lái)修飾,該類(lèi)就是抽象類(lèi)
  • 11.4抽象類(lèi)的細(xì)節(jié)討論

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

    抽象類(lèi)的最大價(jià)值是設(shè)計(jì),讓其他的人來(lái)繼承抽象類(lèi),并實(shí)現(xiàn)抽象方法.

    11.6抽象類(lèi)的課后練習(xí)

    ?

    第 12 章 接口

    12.1看一個(gè)實(shí)際的需求

    12.2接口的基本介紹

  • 所謂接口:就是將一些抽象方法封裝到一起,在某個(gè)類(lèi)需要使用時(shí),只需要實(shí)現(xiàn)該接口就可以, 說(shuō)的實(shí)現(xiàn)接口就是指將該接口中的所有的抽象方法都實(shí)現(xiàn)了。
  • 基本語(yǔ)法
  • interface 接口名稱(chēng){

    ????? 常量;

    ?? 方法;

    }

    幾點(diǎn)說(shuō)明

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

    12.4快速入門(mén)案例

    12.5接口的最佳實(shí)踐案例

  • 使用接口的方式來(lái)模擬一下下面的運(yùn)用場(chǎng)景
  • 走代碼
  • 12.6接口的應(yīng)用場(chǎng)景

    總結(jié): 當(dāng)我們需要定義一些規(guī)范(方法)時(shí),可以將這些方法封裝到接口中 ,然后讓其他的類(lèi)來(lái)實(shí)現(xiàn)該接口即可.

    12.7接口的細(xì)節(jié)討論

  • 接口不能被實(shí)例化
  • ?

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

  • 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,逗號(hào)隔開(kāi)
  • ?

    舉例說(shuō)明:

    ?

    ?

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

    12.9繼承類(lèi)vs 實(shí)現(xiàn)接口

    ?

    ?

    ?

  • 總結(jié)一下
  • 實(shí)現(xiàn)接口可以看做是對(duì)php單繼承機(jī)制的補(bǔ)充
  • 實(shí)現(xiàn)接口可以在不打破繼承的層級(jí)關(guān)系的前提下,對(duì)類(lèi)的功能進(jìn)行擴(kuò)展
  • ?

    ?

    第 13 章 final關(guān)鍵字

    13.1基本介紹

    當(dāng)程序員不希望某個(gè)成員方法被子類(lèi)重寫(xiě)時(shí),我們可以將該方法修飾為final 方法.

    當(dāng)程序員不希望某個(gè)類(lèi)被繼承,我們可以將該類(lèi)修飾為final 類(lèi).

    final "最終"

    13.2基本語(yǔ)法

    final 類(lèi)名{

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

    ????? ?????? //函數(shù)體??????

    }

    }

    13.3快速入門(mén)案例

    總結(jié)

  • //如果我們不希望子類(lèi)去重寫(xiě)attack方法, 使用final 修飾即可
  • //如果我們不希望子類(lèi)來(lái)繼承某個(gè)類(lèi), 則使用final修飾該類(lèi)即可
  • 13.4final 的使用細(xì)節(jié)討論

  • final不能夠修飾成員屬性
  • final 方法不能被重寫(xiě),但可以被繼承
  • 一般來(lái)說(shuō),final 類(lèi)中不會(huì)出現(xiàn)final 方法,因?yàn)閒inal類(lèi)都不能被繼承,也就不會(huì)去重寫(xiě)override final類(lèi)的方法了
  • final 類(lèi) 是可以被實(shí)例化的
  • ?

    第 14 章 類(lèi)常量(const關(guān)鍵字)

    14.1為什么需要使用當(dāng)類(lèi)常量

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

    當(dāng)不希望一個(gè)成員變量被修改,希望該變量的值是固定不變的。這時(shí)可以用const 去修飾該成員屬性,這樣這個(gè)屬性就自動(dòng)成為常量 , 比如所得稅率, 數(shù)學(xué)中的圓周率等

    14.2類(lèi)常量的基本語(yǔ)法

    類(lèi)常量是在類(lèi)中定義的.

    class? 類(lèi)名{

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

    }

    說(shuō)明

  • const 是關(guān)鍵字,規(guī)定好的而不能修改.
  • 常量名的規(guī)范是 XXX_YYY , 全部大寫(xiě),然后使用下劃線間隔
  • 類(lèi)常量都是public , 但是我們不要使用public 去修飾.
  • 14.3快速入門(mén)案例

    //計(jì)算公司所得稅的案例.

    14.4關(guān)于類(lèi)常量的使用細(xì)節(jié)說(shuō)明

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

    在類(lèi)的外部訪問(wèn):? 類(lèi)名::常量名? 接口名::常量名??

  • 常量的值在定義的時(shí)候就初始化,以后就不能修改
  • 常量可以被子類(lèi)繼承
  • 一個(gè)常量是屬于一個(gè)類(lèi)的,而不是某個(gè)對(duì)象的
  • 關(guān)于常量可以是什么數(shù)據(jù)類(lèi)的討論
  • 結(jié)論: 常量可以是 基本數(shù)據(jù)類(lèi)型(int, float , bool, string), 還是可以是 array ,但是不能是對(duì)象。

  • 類(lèi)常量可以在類(lèi)中,類(lèi)的外部和其它普通函數(shù)中使用
  • ?

    ?

    第 15 章 PHP面向?qū)ο缶幊痰南嚓P(guān)技術(shù)

    基本: 把php面向?qū)ο缶幊痰母鱾€(gè)知識(shí)點(diǎn)都過(guò)一下.

    15.1對(duì)象克隆技術(shù)和分析

    15.2對(duì)象遍歷[了解,應(yīng)付筆試]

  • 看看如何對(duì)對(duì)象進(jìn)行遍歷: 所謂對(duì)象的變量,指的是對(duì)某個(gè)對(duì)象的屬性進(jìn)行遍歷.
  • 舉例
  • 在類(lèi)的外部對(duì)對(duì)象進(jìn)行遍歷, 這時(shí)我們只能遍歷到對(duì)象的public 屬性.

    15.3php的內(nèi)置標(biāo)準(zhǔn)類(lèi)

    看一個(gè)具體的需要: 如果,我們希望把一些數(shù)據(jù),以對(duì)象的屬性的方式存儲(chǔ),同時(shí)我們又不想定義一個(gè)類(lèi),可以考慮使用 PHP內(nèi)置標(biāo)準(zhǔn)類(lèi) stdClass [standard標(biāo)準(zhǔn)]

    php的內(nèi)置標(biāo)準(zhǔn)類(lèi) stdClass , 這個(gè)是系統(tǒng)默認(rèn)提供,不需要程序員去創(chuàng)建,而是直接使用就可以.

    案例說(shuō)明:

    15.4數(shù)據(jù)類(lèi)型轉(zhuǎn)對(duì)象和對(duì)象轉(zhuǎn)數(shù)組的說(shuō)明

    在我們的開(kāi)發(fā)中,有時(shí)會(huì)看到有人將數(shù)組或者基本數(shù)據(jù)類(lèi)轉(zhuǎn)成對(duì)象,那么這個(gè)是怎么回事?

  • 舉例說(shuō)明
  • 15.5對(duì)象序列化和反序列化

  • 基本介紹
  • 所謂對(duì)象序列化是指: 將一個(gè)對(duì)象轉(zhuǎn)換成一個(gè)字符串,這個(gè)字符串包括 屬性名,屬性值,屬性類(lèi)型, 和該對(duì)象對(duì)應(yīng)的類(lèi)名。簡(jiǎn)單的說(shuō)明就把一個(gè)對(duì)象的數(shù)據(jù)和數(shù)據(jù)類(lèi)型轉(zhuǎn)成字符串.

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

    ?

  • 反序列化
  • 所謂反序列化就是指,將一個(gè)序列化的字符串,重新恢復(fù)成對(duì)應(yīng)的對(duì)象.

    說(shuō)明

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

  • 與之相反, unserialize() 會(huì)檢查是否存在一個(gè) __wakeup()方法。如果存在,則會(huì)先調(diào)用 __wakeup 方法,預(yù)先準(zhǔn)備對(duì)象需要的資源。
  • __wakeup() 經(jīng)常用在反序列化操作中,例如重新建立數(shù)據(jù)庫(kù)連接,或執(zhí)行其它初始化操作。

    ??? ?????? ?????? 代碼說(shuō)明:

    15.6類(lèi)與對(duì)象的相關(guān)函數(shù)

    在面向?qū)ο缶幊讨?#xff0c;有一系列的函數(shù),可以來(lái)對(duì)類(lèi)和對(duì)象以及成員方法進(jìn)行操作。我們重點(diǎn)講解5個(gè),其它的函數(shù)就請(qǐng)同學(xué)們自己去看一下即可.

    代碼舉例說(shuō)明:

    15.7traits 的講解(重點(diǎn))

  • 看一個(gè)實(shí)際的需求
  • 代碼實(shí)現(xiàn)
  • traits技術(shù)的細(xì)節(jié)說(shuō)明
  • ?

    第 16 章 反射技術(shù)

    16.1當(dāng)我們echo $對(duì)象時(shí),輸出該對(duì)象的屬性,成員方法等等信息

  • 舉例說(shuō)明:
  • 16.2反射機(jī)制的基本介紹

    PHP 5 具有完整的反射 API,添加了對(duì)類(lèi)、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來(lái)取出函數(shù)、類(lèi)和方法中的文檔注釋。

    16.3反射機(jī)制的使用場(chǎng)景

  • 寫(xiě)底層框架(比如tp框架有一個(gè)控制器調(diào)度原理)
  • 擴(kuò)展類(lèi)的功能
  • 管理大量的未知類(lèi)
  • 16.4看一個(gè)需求-一會(huì)我們一起搞定他

    16.5我們看一個(gè)簡(jiǎn)單的案例-反向代理調(diào)用

  • 使用反射機(jī)制代理帶有某個(gè)對(duì)象的方法
  • 代碼說(shuō)明
  • 16.6反射機(jī)制的綜合小練習(xí)-tp的控制器調(diào)度原理

    走代碼:

    16.7反射練習(xí)

    ?

    16.8小結(jié):

    ?

    ?

    文章來(lái)自泰牛PHP課堂筆記

    ?

    ?

    總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。