您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP對(duì)象基礎(chǔ)實(shí)例分析”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“PHP對(duì)象基礎(chǔ)實(shí)例分析”文章能幫助大家解決問題。
面向過程和面向?qū)ο髤^(qū)別
類:class,定義面向?qū)ο笾黧w的最外層結(jié)構(gòu),用來包裹主體的數(shù)據(jù)和功能(函數(shù))
對(duì)象:object,某類事務(wù)的具體代表,又稱為實(shí)例
實(shí)例化:new,類產(chǎn)生對(duì)象的過程
類成員:member
方法:method,本質(zhì)是在類class結(jié)構(gòu)中創(chuàng)建的函數(shù),稱之為成員方法或者成員函數(shù)
屬性:property,本質(zhì)是在類class結(jié)構(gòu)中創(chuàng)建的變量,稱之為成員變量
類常量:const,本質(zhì)是在類class結(jié)構(gòu)中創(chuàng)建的常量
創(chuàng)建對(duì)象
<?phpclass People{}$man=new People();# 實(shí)例化類,man就是對(duì)象var_dump($man);?> # 輸出object(People)#1 (0) { } #1表示:對(duì)象編號(hào),與類無關(guān),是整個(gè)腳本中對(duì)象的序號(hào)(0)表示:成員變量(屬性)個(gè)數(shù){}表示:具體成員變量信息(鍵值對(duì))
<?phpclass Buyer{ # 常量聲明 const BIG_NAME='BUYER'; # 常量不需要加 $ # 屬性聲明 # $name; # 錯(cuò)誤的,類內(nèi)部屬性必須使用訪問修飾限定符 public $name; public $money=0; # 方法聲明 function display(){ echo __CLASS__; # 魔術(shù)常量,輸出類名 # 方法內(nèi)部變量屬于局部變量 }}# 實(shí)例化$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" }
注意:類常量不是由對(duì)象來進(jìn)行訪問
在屬性或者方法前的修飾關(guān)鍵字,用來控制屬性或者方法的訪問位置
public:公有,類內(nèi)和類外都可以訪問
protected:受保護(hù),只允許在相關(guān)類內(nèi)部訪問
private:私有,只允許在定義類內(nèi)部訪問
屬性必須有訪問修飾限定符,方法可以沒有訪問修飾限定符,默認(rèn)就是 public
$this,方法內(nèi)部內(nèi)置的一個(gè)對(duì)象,會(huì)自動(dòng)指向來調(diào)用的方法的對(duì)象
$this 存在于方法內(nèi)部(僅限內(nèi)部使用),所以相當(dāng)于在類的結(jié)構(gòu)內(nèi)部
可以訪問任意訪問修飾限定符修飾的成員
私有成員都是通過公有方法來實(shí)現(xiàn)訪問(公有方法可以在類外部訪問)
<?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 代表的是對(duì)象,而 $this 所在環(huán)境為類內(nèi)部的方法內(nèi)部,所以 $this 對(duì)象是在類內(nèi)部訪問,因此所有的屬性和方法,不受訪問修飾限定符限制
__construct() 是一種系統(tǒng)內(nèi)置的魔術(shù)方法,該方法的特性是在對(duì)象實(shí)例化之后,對(duì)象立即自動(dòng)調(diào)用
構(gòu)造方法的目的就是為了初始化資源,包括對(duì)象屬性和其他資源
一旦構(gòu)造方法定義好后,且構(gòu)造方法自帶參數(shù),那么就只能使用 new 類名(參數(shù)列表) 方式才能正確實(shí)例化
魔術(shù)方法也可以通過對(duì)象直接調(diào)用的方式調(diào)用,不過沒有實(shí)際用處
<?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(),對(duì)象在被銷毀時(shí)自動(dòng)調(diào)用,釋放資源
對(duì)象銷毀
對(duì)象無變量指向(變量指向其他數(shù)據(jù))
對(duì)象被主動(dòng)銷毀(unset銷毀對(duì)象變量)
腳本執(zhí)行結(jié)束(自動(dòng)釋放資源)
PHP 腳本執(zhí)行結(jié)束會(huì)釋放所有資源,所以一般較少用析構(gòu)方法
<?phpclass Article{ protected $name = 'xiaoli'; private $sex = 'famale'; public function __destruct() { // TODO: Implement __destruct() method. echo __FUNCTION__; }}$a=new Article();# 銷毀對(duì)象$a=1;unset($a);# __destructendecho 'end';?> # 不銷毀對(duì)象,php在運(yùn)行結(jié)束也會(huì)釋放資源# end__destruct
定義:將保存對(duì)象的變量賦值給另外一個(gè)變量
在 PHP 中,對(duì)象的傳值是引用傳遞:即一個(gè)對(duì)象變量賦值給另外一個(gè)變量,兩個(gè)變量指向同一個(gè)對(duì)象地址,即只有一個(gè)對(duì)象
<?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" }
有兩個(gè)冒號(hào)組成 “::” ,專門用于類實(shí)現(xiàn)類成員操作,可以實(shí)現(xiàn)類直接訪問類成員
范圍解析操作符是用于給類(類名)訪問類成員使用的
類名::類成員
范圍解析操作符也可以被對(duì)象用來當(dāng)作類使用(不建議)
$對(duì)象名::類成員
類常量只能被類訪問
<?phpclass Article{ const NAME='ocean';}echo Article::NAME; # 常量是不能通過 Article->NAME 來進(jìn)行訪問的$a=new Article();echo $a::NAME; # 范圍解析操作符兼容對(duì)象,找到對(duì)象所屬類最終進(jìn)行訪問,效率降低,靈活性提高?>
類常量是固定的,而對(duì)象的屬性是不同對(duì)象不同的
定義:使用 static 關(guān)鍵字修飾的類成員,表示該成員屬于類訪問
靜態(tài)成員
靜態(tài)屬性
靜態(tài)方法
靜態(tài)成員是明確用來給類訪問的,而不是對(duì)象
靜態(tài)成員只是多了一個(gè) static 關(guān)鍵字修飾,本身也可以被對(duì)象訪問
靜態(tài)成員同樣可以使用不同的訪問修飾限定符限定,效果一致
<?phpclass Article{ public static $name = 'hlm'; public static $type = 'art'; public static function getName() { return self::$name; }}# 靜態(tài)屬性$a = new Article();echo Article::$name;# 靜態(tài)方法echo Article::getName();?>
在類的內(nèi)部(方法里面)使用,代替類名的寫法
self 如同 $this 代表內(nèi)部對(duì)象一樣,能夠在方法內(nèi)部代替當(dāng)前類名
能夠保障用戶方便修改類名字
self 關(guān)鍵字是代替類名,所以需要配合范圍解析操作符 ::
<?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) { }
類的訪問必須保證類在內(nèi)存中已經(jīng)存在,所以需要再用類之前將類所在的 PHP 文件加載到內(nèi)存中
類的加載分為兩種
手動(dòng)加載:在需要使用類之間通過 include 將包含類的文件引入到內(nèi)存
自動(dòng)加載:提前定義好類結(jié)構(gòu)和位置,寫好引入類文件代碼,在系統(tǒng)需要類而內(nèi)存不存在的時(shí)候想辦法讓寫好的加載類的代碼執(zhí)行(自動(dòng)加載是自動(dòng)運(yùn)行寫好的加載類的代碼)
自動(dòng)加載兩種方式
function __autoload($classname){ # 找到對(duì)應(yīng)的文件路徑和命名規(guī)范,手動(dòng)加載}
# 自定義類加載函數(shù)function 自定義函數(shù)($classname){ # 找到對(duì)應(yīng)的文件和命名規(guī)范,手動(dòng)加載}#注冊(cè)自動(dòng)加載sql_autoload_register('自定義函數(shù)名字')
自定義函數(shù):自己定義類的加載實(shí)現(xiàn),然后通過 spl_autoload_register 注冊(cè)到自動(dòng)加載機(jī)制(可注冊(cè)多個(gè)自動(dòng)加載)
魔術(shù)函數(shù) __autoload:系統(tǒng)自動(dòng)調(diào)用,需要傳入類名,在函數(shù)內(nèi)部實(shí)現(xiàn)類的手動(dòng)加載(PHP7及之后不建議使用此方法)
自動(dòng)加載要求在聲明類的時(shí)候有良好的規(guī)范
類名與文件名一致:類名.php 或者 類名.class.php
類文件分類放好
例:手動(dòng)加載
Article.php
<?phpclass Article{ public function getName(){ return __METHOD__; }}
mian.php
<?php# include 'Article.php';# 直接加載比較消耗資源,而且如果類已經(jīng)在內(nèi)存中存在,直接include會(huì)報(bào)錯(cuò),建議判斷后再加載if(!class_exists('Article')){ include 'Article.php';}$a=new Article();var_dump($a->getName()); # outputstring(16) "Article::getName"
自動(dòng)加載
__autoload(不建議使用)
一個(gè)系統(tǒng)中,可能類文件會(huì)放到不同的路徑下,因此一個(gè)完整的自動(dòng)加載函數(shù),應(yīng)該要進(jìn)行文件判定功能
<?php function __autoload($classname){ # 形參代指 類名 #組織文件路徑,假設(shè)當(dāng)前路徑下,有兩個(gè)文件夾下都有類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();
通過已有的對(duì)象復(fù)制一個(gè)新的同樣的對(duì)象,但兩者之間并非同一個(gè)對(duì)象
封裝、繼承、多態(tài)
類的封裝
類的繼承
inherit,子類合法擁有父類的某些權(quán)限
繼承必須滿足繼承關(guān)系:即存在合理的包含關(guān)系
繼承的本質(zhì)是子類通過繼承可以直接使用父類已經(jīng)存在的數(shù)據(jù)和數(shù)據(jù)操作
PHP 使用 extends 關(guān)鍵字表示繼承
子類也稱派生類
父類也稱基類
# 父類class Human{}# 子類繼承class Man extends Human{}
類的多態(tài)
多態(tài)性是指相同的操作或函數(shù)、過程可作用于多種類型的對(duì)象上并獲得不同的結(jié)果
需要發(fā)生類的繼承,同時(shí)出現(xiàn)方法的重寫(override),即子類擁有與父類同名的方法
在實(shí)例化對(duì)象的時(shí)候讓父類對(duì)象指向子類對(duì)象(強(qiáng)制類型,PHP不支持,PHP 弱類型很靈活)
結(jié)果:父類對(duì)象表現(xiàn)的子類對(duì)象的特點(diǎn)
<?phpclass Human{ public function show(){ echo __METHOD__; }}class Man extends Human{}$m=new Man;$m->show();
有限繼承
子類在繼承父類的成員時(shí),并非繼承所有內(nèi)容,而是繼承并使用父類部分內(nèi)容
PHP 中繼承的本質(zhì)是對(duì)象繼承
PHP 中繼承的內(nèi)容:父類所有公有成員、受保護(hù)成員和私有屬性,私有方法不能繼承
受保護(hù)(protected)成員專于繼承,可以在父類或者子類內(nèi)部訪問
私有成員的訪問只能在所屬類中設(shè)定公有或者受保護(hù)方法實(shí)現(xiàn)訪問
構(gòu)造方法和析構(gòu)方法可以被子類繼承,
override,子類中定義了與父類重名的成員
一種明確訪問父類成員的表達(dá)方式
方法被重寫后,訪問調(diào)用的是子類方法,如果想要訪問父類方法,可以通過在子類方法中使用 parent 來強(qiáng)制訪問父類方法
parent 不能用于訪問父類的屬性(靜態(tài)屬性可以)
PHP 只能單繼承,只有一個(gè)父類(若繼承多個(gè)類,可以使用鏈?zhǔn)嚼^承)
PHP 繼承中,只有私有方法不能繼承
PHP 允許繼承父類中的構(gòu)造方法和析構(gòu)方法
使用 final 關(guān)鍵字修飾類名,表示此類不可以被繼承
final 關(guān)鍵字還能修飾方法,表示方法不能被重寫(通常此時(shí)類不會(huì)使用 final 關(guān)鍵字)
使用 abstract 關(guān)鍵字修飾的類,表示該類只能被繼承,不能被實(shí)例化
abstract 關(guān)鍵字可以修飾方法,表示方法為抽象方法,抽象方法沒有方法體(沒有{})
抽象方法存在的類必須為抽象類
繼承抽象類的類要么為抽象類,要么實(shí)現(xiàn)抽象類里所有的抽象方法
適用于,不同類之間有公共代碼,但是類彼此關(guān)系不存在繼承關(guān)系,此時(shí)可以將公共代碼存儲(chǔ)到 trait 中
trait 內(nèi)部可以擁有一個(gè)類能擁有的成員屬性(包括靜態(tài)),成員方法(包括靜態(tài)和抽象方法),但不能有類常量
trait 用來代碼復(fù)用,不能被實(shí)例化,不能被繼承
一個(gè)類中可能需要引入多個(gè) trait ,而不同 trait 中可能出現(xiàn)同名
Interface,專門用來規(guī)范一些共性類必須實(shí)現(xiàn)的方法
接口不是類,但是與類有類似的結(jié)構(gòu)
接口不能實(shí)例化,類可以實(shí)現(xiàn)接口
interface 接口名字{}
class 類名 implements 接口名字{}
接口成員
接口成員只能有兩類
接口常量:const
共有的接口方法(普通方法和靜態(tài)方法)
overload,指在一個(gè)類中可以出現(xiàn)多個(gè)同名方法,彼此之間的參數(shù)個(gè)數(shù)和類型不一樣
用來容錯(cuò)
屬性重載
當(dāng)對(duì)象訪問不存在的或者權(quán)限不夠的屬性的時(shí)候,自動(dòng)觸發(fā)魔術(shù)方法讓代碼不出錯(cuò)
屬性重載魔術(shù)方法
__get(屬性名):訪問不存在或者權(quán)限不夠的屬性時(shí)觸發(fā)
__set(屬性名,屬性值):設(shè)置不存在或者權(quán)限不夠的屬性時(shí)觸發(fā)
__isset(屬性名):判定不存在或者權(quán)限不夠的屬性是觸發(fā)
__unset(屬性名):刪除不存在或者權(quán)限不夠的屬性時(shí)觸發(fā)
__tostring(): 當(dāng)作字符串
方法重載
對(duì)象或者類訪問不存在或者權(quán)限不夠的方法,自動(dòng)觸發(fā)的魔術(shù)方法讓代碼不出錯(cuò)
__cal(方法名,方法參數(shù)列表):調(diào)用不存在或者權(quán)限不夠的方法時(shí)觸發(fā)
__callStatic(方法名,方法參數(shù)列表):調(diào)用不存在或者權(quán)限不夠的靜態(tài)方法時(shí)觸發(fā)
將對(duì)象中的所有屬性以鍵值對(duì)的形式取出并進(jìn)行訪問
對(duì)象是一種復(fù)合數(shù)據(jù)類型,對(duì)象中真正保存的內(nèi)容是屬性
對(duì)象的屬性本質(zhì)也是一種鍵值對(duì)關(guān)系:名字 = 值
對(duì)象遍歷就是利用 foreach 對(duì)對(duì)象中的屬性進(jìn)行取出解析
對(duì)象遍歷遵循訪問修飾限定符的限定:即類外只能遍歷所有共有屬性
foreach(對(duì)象變量 as [屬性名變量 =>] 屬性值變量){ #屬性名變量代表取出的每個(gè)屬性的名字 #屬性值變量代表取出的每個(gè)屬性的值}
yield 關(guān)鍵字
design pattern,是軟件開發(fā)人員在軟件開發(fā)過程中問題的解決方法
單例模式
singleton,是一種類的設(shè)計(jì)只會(huì)最多產(chǎn)生一個(gè)對(duì)象的設(shè)計(jì)思想
保證資源唯一性
工廠模式
。。。。。。
namespace,指人為的將內(nèi)存進(jìn)行分隔,讓不同內(nèi)存區(qū)域的同名結(jié)構(gòu)共存,從而解決在大型項(xiàng)目能出現(xiàn)重名結(jié)構(gòu)問題
基礎(chǔ)語法:
namespace 關(guān)鍵字定義空間
命名規(guī)則
字母、數(shù)字、下劃線,不能以數(shù)字開頭
命名空間必須寫在所有代碼之前,定義了一個(gè),之后可以定義多個(gè)
子空間
subspace,即在已有空間之上,再在內(nèi)部進(jìn)行空間劃分
子空間直接通過 namespace+路徑符號(hào) \ 實(shí)現(xiàn)
非限定名稱
直接訪問元素本身,代表當(dāng)前所屬空間(當(dāng)前目錄)
限定名稱
使用空間名+原名,代表訪問當(dāng)前空間子空間(當(dāng)前目錄子目錄)
完全限定名稱
從根目錄(全局空間)開始訪問,使用 \ 作為全局空間開始符號(hào)(根目錄)
全局空間元素訪問:使用完全限定名稱訪問
命名空間引入
關(guān)于“PHP對(duì)象基礎(chǔ)實(shí)例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。