歸納總結PHP物件基礎

2022-03-09 19:00:35
本篇文章給大家帶來了關於中的相關知識,其中主要介紹了物件導向的相關問題,物件導向程式設計的本質是增加資料和功能的操作主體即物件,希望對大家有幫助。

推薦學習:《》

實踐學習php,thinkphp,Redis,vue,uni-app等技術,推薦開源電商系統likeshop,可以借鑑思路,可去版權免費商用,gitee下載地址:
點選進專案地址

物件導向:OOP(objected oriented programming)程式設計

程式導向是一種程式設計思想

物件導向程式設計的本質是增加資料和功能的操作主體,即物件

物件導向中的所有的資料和功能多是由主體(物件)來呼叫和操作

物件導向基礎

程式導向和物件導向區別

image-20210130153514844

物件導向關鍵字

  • 類:class,定義物件導向主體的最外層結構,用來包裹主體的資料和功能(函數)
  • 物件:object,某類事務的具體代表,又稱為範例
  • 範例化:new,類產生物件的過程
  • 類成員:member
    • 方法:method,本質是在類class結構中建立的函數,稱之為成員方法或者成員函數
    • 屬性:property,本質是在類class結構中建立的變數,稱之為成員變數
    • 類常數:const,本質是在類class結構中建立的常數

建立物件

<?phpclass People{}$man=new People();# 範例化類,man就是物件var_dump($man);?>
    # 輸出object(People)#1 (0) { }
    #1表示:物件編號,與類無關,是整個指令碼中物件的序號(0)表示:成員變數(屬性)個數{}表示:具體成員變數資訊(鍵值對)

類物件

<?phpclass Buyer{
    # 常數宣告
    const BIG_NAME='BUYER';
    # 常數不需要加 $

    # 屬性宣告
    # $name;
    # 錯誤的,類內部屬性必須使用存取修飾限定符
    public $name;
    public $money=0;
    
    # 方法宣告
    function display(){
        echo __CLASS__;
        # 魔術常數,輸出類名
        # 方法內部變數屬於區域性變數
    }}# 範例化$a = new Buyer();# 屬性操作,增刪改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?>
    # 輸出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }

注意:類常數不是由物件來進行存取

存取修飾限定符

在屬性或者方法前的修飾關鍵字,用來控制屬性或者方法的存取位置

  • public:公有,類內和類外都可以存取
  • protected:受保護,只允許在相關類內部存取
  • private:私有,只允許在定義類內部存取

屬性必須有存取修飾限定符,方法可以沒有存取修飾限定符,預設就是 public

類內部物件

$this,方法內部內建的一個物件,會自動指向來呼叫的方法的物件

$this 存在於方法內部(僅限內部使用),所以相當於在類的結構內部

  • 可以存取任意存取修飾限定符修飾的成員
  • 私有成員都是通過公有方法來實現存取(公有方法可以在類外部存取)
<?phpclass Article{
    protected $name = 'a';
    private $type = 'art';

    public function get_name()
    {
        var_dump($this);
    }}$a = new Article();var_dump($a);?>
    # 輸出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }

$this 代表的是物件,而 $this 所在環境為類內部的方法內部,所以 $this 物件是在類內部存取,因此所有的屬性和方法,不受存取修飾限定符限制

image-20210201090314602

image-20210201090809302

image-20210201095446499

構造方法

  • __construct() 是一種系統內建的魔術方法,該方法的特性是在物件範例化之後,物件立即自動呼叫

  • 構造方法的目的就是為了初始化資源,包括物件屬性和其他資源

  • 一旦構造方法定義好後,且構造方法自帶引數,那麼就只能使用 new 類名(參數列) 方式才能正確範例化

  • 魔術方法也可以通過物件直接呼叫的方式呼叫,不過沒有實際用處

<?phpclass Article{
    public $name='xiaoli';
    private $sex="male";

    public function __construct($name,$sex)
    {
        $this->name = $name;
        $this->sex = $sex;
    }}$a = new Article('xiaowang', 'famale');var_dump($a);?>

解構方法

  • __destruct(),物件在被銷燬時自動呼叫,釋放資源
  • 物件銷燬
    1. 物件無變數指向(變數指向其他資料)
    2. 物件被主動銷燬(unset銷燬物件變數)
    3. 指令碼執行結束(自動釋放資源)
  • PHP 指令碼執行結束會釋放所有資源,所以一般較少用解構方法
<?phpclass Article{
    protected $name = 'xiaoli';
    private $sex = 'famale';

    public function __destruct()
    {
        // TODO: Implement __destruct() method.
        echo __FUNCTION__;
    }}$a=new Article();# 銷燬物件$a=1;unset($a);# __destructendecho 'end';?>
    # 不銷燬物件,php在執行結束也會釋放資源# end__destruct

物件傳值

定義:將儲存物件的變數賦值給另外一個變數

在 PHP 中,物件的傳值是參照傳遞:即一個物件變數賦值給另外一個變數,兩個變數指向同一個物件地址,即只有一個物件

<?phpclass Article{
    public $name = 'xiaoli';
    public $sex = 'famale';}$a=new Article();$b=$a;var_dump($a,$b);echo '<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?>
    # 輸出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article)
    #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article)
    #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article)
    #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" }

範圍解析操作符(類常數存取)

有兩個冒號組成 「::」 ,專門用於類實現類成員操作,可以實現類直接存取類成員

  • 範圍解析操作符是用於給類(類名)存取類成員使用的

    類名::類成員
  • 範圍解析操作符也可以被物件用來當作類使用(不建議)

    $物件名::類成員
  • 類常數只能被類存取

<?phpclass Article{
    const  NAME='ocean';}echo Article::NAME;
    # 常數是不能通過 Article->NAME 來進行存取的$a=new Article();echo $a::NAME;
    # 範圍解析操作符相容物件,找到物件所屬類最終進行存取,效率降低,靈活性提高?>

類常數是固定的,而物件的屬性是不同物件不同的

image-20210201115041335

靜態成員

定義:使用 static 關鍵字修飾的類成員,表示該成員屬於類存取

  • 靜態成員
    • 靜態屬性
    • 靜態方法
  • 靜態成員是明確用來給類存取的,而不是物件
  • 靜態成員只是多了一個 static 關鍵字修飾,本身也可以被物件存取
  • 靜態成員同樣可以使用不同的存取修飾限定符限定,效果一致

image-20210201133428850

<?phpclass Article{
    public static $name = 'hlm';
    public static $type = 'art';

    public static function getName()
    {
        return self::$name;
    }}# 靜態屬性$a = new Article();echo Article::$name;# 靜態方法echo Article::getName();?>

self關鍵字

  • 在類的內部(方法裡面)使用,代替類名的寫法
  • self 如同 $this 代表內部物件一樣,能夠在方法內部代替當前類名
  • 能夠保障使用者方便修改類名字
  • self 關鍵字是代替類名,所以需要配合範圍解析操作符 ::
<?phpclass Article{
    public static function getInstance1()
    {
        return new self();
    }

    public static function getInstance2()
    {
        return new Article();
    }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?>
    # 輸出object(Article)
    #1 (0) { } object(Article)
    #2 (0) { }

類載入

類的存取必須保證類在記憶體中已經存在,所以需要再用類之前將類所在的 PHP 檔案載入到記憶體中

  • 類的載入分為兩種

    • 手動載入:在需要使用類之間通過 include 將包含類的檔案引入到記憶體
    • 自動載入:提前定義好類結構和位置,寫好引入類檔案程式碼,在系統需要類而記憶體不存在的時候想辦法讓寫好的載入類的程式碼執行(自動載入是自動執行寫好的載入類的程式碼)
  • 自動載入兩種方式

    • 魔術函數 __autoload:系統自動呼叫,需要傳入類名,在函數內部實現類的手動載入(PHP7及之後不建議使用此方法)
    function __autoload($classname){
        # 找到對應的檔案路徑和命名規範,手動載入}
    • 自定義函數:自己定義類的載入實現,然後通過 spl_autoload_register 註冊到自動載入機制(可註冊多個自動載入)
    # 自定義類載入函數function 自定義函數($classname){
        # 找到對應的檔案和命名規範,手動載入}#註冊自動載入sql_autoload_register('自定義函數名字')

自動載入要求在宣告類的時候有良好的規範

  • 類名與檔名一致:類名.php 或者 類名.class.php
  • 類檔案分類放好

image-20210201144541271

例:手動載入

image-20210201145934549

Article.php

<?phpclass Article{
    public function getName(){
        return __METHOD__;
    }}

mian.php

<?php# include 'Article.php';# 直接載入比較消耗資源,而且如果類已經在記憶體中存在,直接include會報錯,建議判斷後再載入if(!class_exists('Article')){
    include 'Article.php';}$a=new Article();var_dump($a->getName());
    # outputstring(16) "Article::getName"

自動載入

  • __autoload(不建議使用)

一個系統中,可能類檔案會放到不同的路徑下,因此一個完整的自動載入函數,應該要進行檔案判定功能

<?php
function __autoload($classname){
    # 形參代指 類名
    #組織檔案路徑,假設當前路徑下,有兩個資料夾下都有類c和類m
    $c_file = 'c/' . $classname . '.php';
    if (file_exists($c_file)) {
        include_once($c_file);
        return true;
    } 
    //if 語句如果只有一行不需要加 {}
    //include_once 只載入一次

    $m_file = 'm/' . $classname . '.php';
    if (file_exists($m_file)) {
        include_once($m_file);
        return true;
    }
}


$a=new Article();
$b=new Article();
  • spl_autoload_register
<?phpfunction autoload01($classname){
    if(!class_exists($classname)){
        $file_name=$classname.'.php';
        if(file_exists($file_name)) include_once $file_name;
    }}spl_autoload_register('autoload01');$a=new Article();

物件克隆

通過已有的物件複製一個新的同樣的物件,但兩者之間並非同一個物件

image-20210201161635978

image-20210201161616688

物件導向高階

物件導向三大特性

封裝、繼承、多型

類的封裝

image-20210201171024833

類的繼承

inherit,子類合法擁有父類別的某些許可權

  • 繼承必須滿足繼承關係:即存在合理的包含關係
  • 繼承的本質是子類通過繼承可以直接使用父類別已經存在的資料和資料操作
  • PHP 使用 extends 關鍵字表示繼承

子類也稱派生類

父類別也稱基礎類別

# 父類別class Human{}# 子類繼承class Man extends Human{}

類的多型

多型性是指相同的操作或函數、過程可作用於多種型別的物件上並獲得不同的結果

  • 需要發生類的繼承,同時出現方法的重寫(override),即子類擁有與父類別同名的方法
  • 在範例化物件的時候讓父類別物件指向子類物件(強制型別,PHP不支援,PHP 弱型別很靈活)
  • 結果:父類別物件表現的子類物件的特點

image-20210201190338257

—PHP繼承—

<?phpclass Human{
    public function show(){
        echo __METHOD__;
    }}class Man extends Human{}$m=new Man;$m->show();

有限繼承

子類在繼承父類別的成員時,並非繼承所有內容,而是繼承並使用父類別部分內容

  • PHP 中繼承的本質是物件繼承
  • PHP 中繼承的內容:父類別所有公有成員、受保護成員和私有屬性,私有方法不能繼承
  • 受保護(protected)成員專於繼承,可以在父類別或者子類內部存取
  • 私有成員的存取只能在所屬類中設定公有或者受保護方法實現存取
  • 構造方法和解構方法可以被子類繼承,

重寫 Override

override,子類中定義了與父類別重名的成員

image-20210202091754458

parent 關鍵字

一種明確存取父類別成員的表達方式

image-20210202092320773

方法被重寫後,存取呼叫的是子類方法,如果想要存取父類別方法,可以通過在子類方法中使用 parent 來強制存取父類別方法

parent 不能用於存取父類別的屬性(靜態屬性可以)

PHP 繼承特點

  • PHP 只能單繼承,只有一個父類別(若繼承多個類,可以使用鏈式繼承)
  • PHP 繼承中,只有私有方法不能繼承
  • PHP 允許繼承父類別中的構造方法和解構方法

靜態延遲繫結

image-20210202093514060

image-20210202093932752

最終類 Final

使用 final 關鍵字修飾類名,表示此類不可以被繼承

final 關鍵字還能修飾方法,表示方法不能被重寫(通常此時類不會使用 final 關鍵字)

image-20210202094929480

抽象類 Abstract

使用 abstract 關鍵字修飾的類,表示該類只能被繼承,不能被範例化

abstract 關鍵字可以修飾方法,表示方法為抽象方法,抽象方法沒有方法體(沒有{})

抽象方法存在的類必須為抽象類

繼承抽象類的類要麼為抽象類,要麼實現抽象類裡所有的抽象方法

trait 程式碼複用

image-20210203135531893

適用於,不同類之間有公共程式碼,但是類彼此關係不存在繼承關係,此時可以將公共程式碼儲存到 trait 中

trait 內部可以擁有一個類能擁有的成員屬性(包括靜態),成員方法(包括靜態和抽象方法),但不能有類常數

trait 用來程式碼複用,不能被範例化,不能被繼承

trait 同名

一個類中可能需要引入多個 trait ,而不同 trait 中可能出現同名

image-20210203141318530

介面

Interface,專門用來規範一些共性類必須實現的方法

  • 介面不是類,但是與類有類似的結構
  • 介面不能範例化,類可以實現介面

interface 介面名字{}

class 類名 implements 介面名字{}

image-20210203145047924

介面成員

介面成員只能有兩類

  • 介面常數:const
  • 共有的介面方法(普通方法和靜態方法)

image-20210203145534966

PHP 過載

overload,指在一個類中可以出現多個同名方法,彼此之間的引數個數和型別不一樣

image-20210203190348714

用來容錯

屬性過載

當物件存取不存在的或者許可權不夠的屬性的時候,自動觸發魔術方法讓程式碼不出錯

屬性過載魔術方法

  • __get(屬性名):存取不存在或者許可權不夠的屬性時觸發
  • __set(屬性名,屬性值):設定不存在或者許可權不夠的屬性時觸發
  • __isset(屬性名):判定不存在或者許可權不夠的屬性是觸發
  • __unset(屬性名):刪除不存在或者許可權不夠的屬性時觸發
  • __tostring(): 當作字串

方法過載

物件或者類存取不存在或者許可權不夠的方法,自動觸發的魔術方法讓程式碼不出錯

  • __cal(方法名,方法參數列):呼叫不存在或者許可權不夠的方法時觸發
  • __callStatic(方法名,方法參數列):呼叫不存在或者許可權不夠的靜態方法時觸發

物件遍歷

將物件中的所有屬性以鍵值對的形式取出並進行存取

  • 物件是一種複合資料型別,物件中真正儲存的內容是屬性

  • 物件的屬性本質也是一種鍵值對關係:名字 = 值

  • 物件遍歷就是利用 foreach 對物件中的屬性進行取出解析

  • 物件遍歷遵循存取修飾限定符的限定:即類外只能遍歷所有共有屬性

    foreach(物件變數 as [屬性名變數 =>] 屬性值變數){
        #屬性名變數代表取出的每個屬性的名字
        #屬性值變數代表取出的每個屬性的值}

    image-20210204090232316

Iterator 迭代器

image-20210204090552234

生成器

image-20210204092053300

image-20210204091506575

yield 關鍵字

設計模式

design pattern,是軟體開發人員在軟體開發過程中問題的解決方法

單例模式

singleton,是一種類的設計只會最多產生一個物件的設計思想image-20210204092904886

保證資源唯一性

工廠模式

。。。。。。

名稱空間

namespace,指人為的將記憶體進行分隔,讓不同記憶體區域的同名結構共存,從而解決在大型專案能出現重名結構問題

image-20210204095323759

基礎語法:

namespace 關鍵字定義空間

命名規則

字母、數位、下劃線,不能以數位開頭

名稱空間必須寫在所有程式碼之前,定義了一個,之後可以定義多個

image-20210204100804279

子空間

subspace,即在已有空間之上,再在內部進行空間劃分

子空間直接通過 namespace+路徑符號 \ 實現

非限定名稱

直接存取元素本身,代表當前所屬空間(當前目錄)

限定名稱

使用空間名+原名,代表存取當前空間子空間(當前目錄子目錄)

完全限定名稱

從根目錄(全域性空間)開始存取,使用 \ 作為全域性空間開始符號(根目錄)

全域性空間元素存取:使用完全限定名稱存取

image-20210204140347426

名稱空間引入

image-20210204141027952

推薦學習:《》

以上就是歸納總結PHP物件基礎的詳細內容,更多請關注TW511.COM其它相關文章!