新聞中心
本篇文章給大家?guī)砹岁P于php中的相關知識,其中主要介紹了面向對象的相關問題,面向對象編程的本質是增加數據和功能的操作主體即對象,希望對大家有幫助。

推薦學習:《PHP教程》
實踐學習php,thinkphp,Redis,vue,uni-app等技術,推薦開源電商系統likeshop,可以借鑒思路,可去版權免費商用,gitee下載地址:
點擊進項目地址
面向對象:OOP(objected oriented programming)編程
面向過程是一種編程思想
面向對象編程的本質是增加數據和功能的操作主體,即對象
面向對象中的所有的數據和功能多是由主體(對象)來調用和操作
面向對象基礎
面向過程和面向對象區(qū)別
面向對象關鍵字
- 類:class,定義面向對象主體的最外層結構,用來包裹主體的數據和功能(函數)
- 對象:object,某類事務的具體代表,又稱為實例
- 實例化:new,類產生對象的過程
- 類成員:member
- 方法:method,本質是在類class結構中創(chuàng)建的函數,稱之為成員方法或者成員函數
- 屬性:property,本質是在類class結構中創(chuàng)建的變量,稱之為成員變量
- 類常量:const,本質是在類class結構中創(chuàng)建的常量
創(chuàng)建對象
# 輸出object(People)#1 (0) { }
#1表示:對象編號,與類無關,是整個腳本中對象的序號(0)表示:成員變量(屬性)個數{}表示:具體成員變量信息(鍵值對)
類對象
money;$a->money='20';$a->sex='male';unset($a->name);echo '
';# 方法操作$a->display();echo '
';var_dump($a);?> # 輸出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }
注意:類常量不是由對象來進行訪問
訪問修飾限定符
在屬性或者方法前的修飾關鍵字,用來控制屬性或者方法的訪問位置
- public:公有,類內和類外都可以訪問
- protected:受保護,只允許在相關類內部訪問
- private:私有,只允許在定義類內部訪問
屬性必須有訪問修飾限定符,方法可以沒有訪問修飾限定符,默認就是 public
類內部對象
$this,方法內部內置的一個對象,會自動指向來調用的方法的對象
$this 存在于方法內部(僅限內部使用),所以相當于在類的結構內部
- 可以訪問任意訪問修飾限定符修飾的成員
- 私有成員都是通過公有方法來實現訪問(公有方法可以在類外部訪問)
# 輸出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }
$this 代表的是對象,而 $this 所在環(huán)境為類內部的方法內部,所以 $this 對象是在類內部訪問,因此所有的屬性和方法,不受訪問修飾限定符限制
構造方法
-
__construct() 是一種系統內置的魔術方法,該方法的特性是在對象實例化之后,對象立即自動調用
-
構造方法的目的就是為了初始化資源,包括對象屬性和其他資源
-
一旦構造方法定義好后,且構造方法自帶參數,那么就只能使用 new 類名(參數列表) 方式才能正確實例化
-
魔術方法也可以通過對象直接調用的方式調用,不過沒有實際用處
name = $name;
$this->sex = $sex;
}}$a = new Article('xiaowang', 'famale');var_dump($a);?>
析構方法
- __destruct(),對象在被銷毀時自動調用,釋放資源
- 對象銷毀
- 對象無變量指向(變量指向其他數據)
- 對象被主動銷毀(unset銷毀對象變量)
- 腳本執(zhí)行結束(自動釋放資源)
- PHP 腳本執(zhí)行結束會釋放所有資源,所以一般較少用析構方法
# 不銷毀對象,php在運行結束也會釋放資源# end__destruct
對象傳值
定義:將保存對象的變量賦值給另外一個變量
在 PHP 中,對象的傳值是引用傳遞:即一個對象變量賦值給另外一個變量,兩個變量指向同一個對象地址,即只有一個對象
';$a->name="wangxiaohu";var_dump($a,$b);echo '
';?> # 輸出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" }
范圍解析操作符(類常量訪問)
有兩個冒號組成 “::” ,專門用于類實現類成員操作,可以實現類直接訪問類成員
-
范圍解析操作符是用于給類(類名)訪問類成員使用的
類名::類成員
-
范圍解析操作符也可以被對象用來當作類使用(不建議)
$對象名::類成員
-
類常量只能被類訪問
NAME 來進行訪問的$a=new Article();echo $a::NAME;
# 范圍解析操作符兼容對象,找到對象所屬類最終進行訪問,效率降低,靈活性提高?>
類常量是固定的,而對象的屬性是不同對象不同的
靜態(tài)成員
定義:使用 static 關鍵字修飾的類成員,表示該成員屬于類訪問
- 靜態(tài)成員
- 靜態(tài)屬性
- 靜態(tài)方法
- 靜態(tài)成員是明確用來給類訪問的,而不是對象
- 靜態(tài)成員只是多了一個 static 關鍵字修飾,本身也可以被對象訪問
- 靜態(tài)成員同樣可以使用不同的訪問修飾限定符限定,效果一致
self關鍵字
- 在類的內部(方法里面)使用,代替類名的寫法
- self 如同 $this 代表內部對象一樣,能夠在方法內部代替當前類名
- 能夠保障用戶方便修改類名字
- self 關鍵字是代替類名,所以需要配合范圍解析操作符 ::
# 輸出object(Article)
#1 (0) { } object(Article)
#2 (0) { }
類加載
類的訪問必須保證類在內存中已經存在,所以需要再用類之前將類所在的 PHP 文件加載到內存中
-
類的加載分為兩種
- 手動加載:在需要使用類之間通過 include 將包含類的文件引入到內存
- 自動加載:提前定義好類結構和位置,寫好引入類文件代碼,在系統需要類而內存不存在的時候想辦法讓寫好的加載類的代碼執(zhí)行(自動加載是自動運行寫好的加載類的代碼)
-
自動加載兩種方式
- 魔術函數 __autoload:系統自動調用,需要傳入類名,在函數內部實現類的手動加載(PHP7及之后不建議使用此方法)
function __autoload($classname){ # 找到對應的文件路徑和命名規(guī)范,手動加載}- 自定義函數:自己定義類的加載實現,然后通過 spl_autoload_register 注冊到自動加載機制(可注冊多個自動加載)
# 自定義類加載函數function 自定義函數($classname){ # 找到對應的文件和命名規(guī)范,手動加載}#注冊自動加載sql_autoload_register('自定義函數名字')
自動加載要求在聲明類的時候有良好的規(guī)范
- 類名與文件名一致:類名.php 或者 類名.class.php
- 類文件分類放好
例:手動加載
Article.php
mian.php
getName()); # outputstring(16) "Article::getName"自動加載
- __autoload(不建議使用)
一個系統中,可能類文件會放到不同的路徑下,因此一個完整的自動加載函數,應該要進行文件判定功能
- spl_autoload_register
對象克隆
通過已有的對象復制一個新的同樣的對象,但兩者之間并非同一個對象
面向對象高級
面向對象三大特性
封裝、繼承、多態(tài)
類的封裝
類的繼承
inherit,子類合法擁有父類的某些權限
- 繼承必須滿足繼承關系:即存在合理的包含關系
- 繼承的本質是子類通過繼承可以直接使用父類已經存在的數據和數據操作
- PHP 使用 extends 關鍵字表示繼承
子類也稱派生類
父類也稱基類
# 父類class Human{}# 子類繼承class Man extends Human{}
類的多態(tài)
多態(tài)性是指相同的操作或函數、過程可作用于多種類型的對象上并獲得不同的結果
- 需要發(fā)生類的繼承,同時出現方法的重寫(override),即子類擁有與父類同名的方法
- 在實例化對象的時候讓父類對象指向子類對象(強制類型,PHP不支持,PHP 弱類型很靈活)
- 結果:父類對象表現的子類對象的特點
—PHP繼承—
show();
有限繼承
子類在繼承父類的成員時,并非繼承所有內容,而是繼承并使用父類部分內容
- PHP 中繼承的本質是對象繼承
- PHP 中繼承的內容:父類所有公有成員、受保護成員和私有屬性,私有方法不能繼承
- 受保護(protected)成員專于繼承,可以在父類或者子類內部訪問
- 私有成員的訪問只能在所屬類中設定公有或者受保護方法實現訪問
- 構造方法和析構方法可以被子類繼承,
重寫 Override
override,子類中定義了與父類重名的成員
parent 關鍵字
一種明確訪問父類成員的表達方式
方法被重寫后,訪問調用的是子類方法,如果想要訪問父類方法,可以通過在子類方法中使用 parent 來強制訪問父類方法
parent 不能用于訪問父類的屬性(靜態(tài)屬性可以)
PHP 繼承特點
- PHP 只能單繼承,只有一個父類(若繼承多個類,可以使用鏈式繼承)
- PHP 繼承中,只有私有方法不能繼承
- PHP 允許繼承父類中的構造方法和析構方法
靜態(tài)延遲綁定
最終類 Final
使用 final 關鍵字修飾類名,表示此類不可以被繼承
final 關鍵字還能修飾方法,表示方法不能被重寫(通常此時類不會使用 final 關鍵字)
抽象類 Abstract
使用 abstract 關鍵字修飾的類,表示該類只能被繼承,不能被實例化
abstract 關鍵字可以修飾方法,表示方法為抽象方法,抽象方法沒有方法體(沒有{})
抽象方法存在的類必須為抽象類
繼承抽象類的類要么為抽象類,要么實現抽象類里所有的抽象方法
trait 代碼復用
適用于,不同類之間有公共代碼,但是類彼此關系不存在繼承關系,此時可以將公共代碼存儲到 trait 中
trait 內部可以擁有一個類能擁有的成員屬性(包括靜態(tài)),成員方法(包括靜態(tài)和抽象方法),但不能有類常量
trait 用來代碼復用,不能被實例化,不能被繼承
trait 同名
一個類中可能需要引入多個 trait ,而不同 trait 中可能出現同名
接口
Interface,專門用來規(guī)范一些共性類必須實現的方法
- 接口不是類,但是與類有類似的結構
- 接口不能實例化,類可以實現接口
interface 接口名字{}
class 類名 implements 接口名字{}
接口成員
接口成員只能有兩類
- 接口常量:const
- 共有的接口方法(普通方法和靜態(tài)方法)
PHP 重載
overload,指在一個類中可以出現多個同名方法,彼此之間的參數個數和類型不一樣
用來容錯
屬性重載
當對象訪問不存在的或者權限不夠的屬性的時候,自動觸發(fā)魔術方法讓代碼不出錯
屬性重載魔術方法
- __get(屬性名):訪問不存在或者權限不夠的屬性時觸發(fā)
- __set(屬性名,屬性值):設置不存在或者權限不夠的屬性時觸發(fā)
- __isset(屬性名):判定不存在或者權限不夠的屬性是觸發(fā)
- __unset(屬性名):刪除不存在或者權限不夠的屬性時觸發(fā)
- __tostring(): 當作字符串
方法重載
對象或者類訪問不存在或者權限不夠的方法,自動觸發(fā)的魔術方法讓代碼不出錯
- __cal(方法名,方法參數列表):調用不存在或者權限不夠的方法時觸發(fā)
- __callStatic(方法名,方法參數列表):調用不存在或者權限不夠的靜態(tài)方法時觸發(fā)
對象遍歷
將對象中的所有屬性以鍵值對的形式取出并進行訪問
-
對象是一種復合數據類型,對象中真正保存的內容是屬性
-
對象的屬性本質也是一種鍵值對關系:名字 = 值
-
對象遍歷就是利用 foreach 對對象中的屬性進行取出解析
-
對象遍歷遵循訪問修飾限定符的限定:即類外只能遍歷所有共有屬性
foreach(對象變量 as [屬性名變量 =>] 屬性值變量){ #屬性名變量代表取出的每個屬性的名字 #屬性值變量代表取出的每個屬性的值}
Iterator 迭代器
生成器
yield 關鍵字
設計模式
design pattern,是軟件開發(fā)人員在軟件開發(fā)過程中問題的解決方法
單例模式
singleton,是一種類的設計只會最多產生一個對象的設計思想
保證資源唯一性
工廠模式
。。。。。。
命名空間
namespace,指人為的將內存進行分隔,讓不同內存區(qū)域的同名結構共存,從而解決在大型項目能出現重名結構問題
基礎語法:
namespace 關鍵字定義空間
命名規(guī)則
字母、數字、下劃線,不能以數字開頭
命名空間必須寫在所有代碼之前,定義了一個,之后可以定義多個
子空間
subspace,即在已有空間之上,再在內部進行空間劃分
子空間直接通過 namespace+路徑符號 \ 實現
非限定名稱
直接訪問元素本身,代表當前所屬空間(當前目錄)
限定名稱
使用空間名+原名,代表訪問當前空間子空間(當前目錄子目錄)
完全限定名稱
從根目錄(全局空間)開始訪問,使用 \ 作為全局空間開始符號(根目錄)
全局空間元素訪問:使用完全限定名稱訪問
命名空間引入
網站題目:歸納總結PHP對象基礎
文章出自:http://m.fisionsoft.com.cn/article/dhjgdje.html


咨詢
建站咨詢
