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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

《深入PHP:面向对象、模式与实践》(二)

發(fā)布時(shí)間:2024/1/17 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深入PHP:面向对象、模式与实践》(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第4章 高級(jí)特性

本章內(nèi)容提要:

  • 靜態(tài)屬性和方法:通過(guò)類(lèi)而不是對(duì)象來(lái)訪問(wèn)數(shù)據(jù)和功能
  • 抽象類(lèi)和接口:設(shè)計(jì)和實(shí)現(xiàn)分離
  • 錯(cuò)誤處理:異常
  • Final類(lèi)和方法:限制繼承
  • 攔截器方法:自動(dòng)委托
  • 析構(gòu)方法:對(duì)象銷(xiāo)毀前的清理工作
  • 克隆對(duì)象:創(chuàng)建對(duì)象的副本
  • 把對(duì)象解析成字符串:創(chuàng)建摘要型方法
  • 回調(diào):用匿名函數(shù)為組件添加功能

4.1 ?靜態(tài)屬性和方法

靜態(tài)屬性和方法的聲明:使用 static 關(guān)鍵字。

靜態(tài)方法只能訪問(wèn)靜態(tài)屬性,不能訪問(wèn)普通屬性。普通屬性是屬于對(duì)象的。

靜態(tài)屬性和方法的訪問(wèn):使用 :: 來(lái)連接類(lèi)名和靜態(tài)元素。

一個(gè)類(lèi)使用 parent 關(guān)鍵字來(lái)訪問(wèn)父類(lèi)。在當(dāng)前類(lèi)(不是子類(lèi))訪問(wèn)靜態(tài)元素,使用 self 關(guān)鍵字。在類(lèi)外部,使用類(lèi)名訪問(wèn)靜態(tài)元素。

只有在使用 parent 關(guān)鍵字調(diào)用方法的時(shí)候,才能對(duì)一個(gè)非靜態(tài)方法進(jìn)行靜態(tài)形式的調(diào)用。

靜態(tài)元素的特性:

  • 在任何地方都可用(假設(shè)你可以訪問(wèn)該類(lèi))
  • 類(lèi)的每個(gè)實(shí)例都可以訪問(wèn)類(lèi)中定義的靜態(tài)元素
  • 不需要對(duì)象就能訪問(wèn)靜態(tài)元素

書(shū)中介紹了一個(gè)靜態(tài)方法,該方法接受原始數(shù)據(jù),然后返回對(duì)象,就像“工廠”一樣。

4.2 ?常量屬性

常量屬性使用 const 關(guān)鍵字來(lái)聲明。常量屬性不以美元符號(hào)開(kāi)頭,只能用大寫(xiě)字母來(lái)命名。

常量屬性只包含基本數(shù)據(jù)類(lèi)型的值。只能通過(guò)類(lèi)而不能通過(guò)類(lèi)的實(shí)例訪問(wèn)常量屬性。引用常量屬性時(shí)不需要用美元符號(hào)作為前導(dǎo)符。

當(dāng)需要在類(lèi)的所有實(shí)例中都能訪問(wèn)某個(gè)屬性,并且屬性值無(wú)需改變時(shí),應(yīng)該使用常量。

4.3 ?抽象類(lèi)

用 abstract 關(guān)鍵字定義一個(gè)抽象類(lèi)。可以創(chuàng)建抽象類(lèi)的屬性和方法。抽象類(lèi)不能被實(shí)例化。

大多數(shù)情況下,抽象類(lèi)至少包含一個(gè)抽象方法。抽象方法用 abstract 關(guān)鍵字聲明,不能有具體內(nèi)容,要以分號(hào)結(jié)束而不是方法體結(jié)束。

抽象類(lèi)的每個(gè)子類(lèi)都必須實(shí)現(xiàn)抽象類(lèi)中的所有抽象方法,或者把它們自身也聲明為抽象方法。

新的實(shí)現(xiàn)方法的訪問(wèn)控制不能比抽象方法的訪問(wèn)控制更嚴(yán)格。這些方法的調(diào)用方式也必須匹配,即類(lèi)型和所需參數(shù)數(shù)量必須一致。

4.4 ?接口

抽象類(lèi)提供了具體實(shí)現(xiàn)的標(biāo)準(zhǔn),而接口則是純粹的模板。

接口是通過(guò)?interface?關(guān)鍵字來(lái)定義的,就像定義一個(gè)標(biāo)準(zhǔn)的類(lèi)一樣,但其中定義所有的方法都是空的。

接口中定義的所有方法都必須是公有,這是接口的特性。

要實(shí)現(xiàn)一個(gè)接口,使用?implements?操作符。類(lèi)中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤。類(lèi)可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來(lái)分隔多個(gè)接口的名稱(chēng)。

  • 實(shí)現(xiàn)多個(gè)接口時(shí),接口中的方法不能有重名。
  • 接口也可以繼承,通過(guò)使用?extends操作符。
  • 類(lèi)要實(shí)現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式。否則會(huì)導(dǎo)致致命錯(cuò)誤。

接口中也可以定義常量。接口常量和類(lèi)常量的使用完全相同,但是不能被子類(lèi)或子接口所覆蓋。

接口加上類(lèi)型約束,提供了一種很好的方式來(lái)確保某個(gè)對(duì)象包含有某些方法。

本小節(jié)定義了一個(gè) Chargeable 接口,再用 ShopProduct 類(lèi)來(lái)實(shí)現(xiàn),同時(shí)在其方法的參數(shù)中使用了類(lèi)型約束。

4.5 ?延遲靜態(tài)綁定:static 關(guān)鍵字

self::?的限制:使用?self::?或者?__CLASS__?對(duì)當(dāng)前類(lèi)的靜態(tài)引用,取決于定義當(dāng)前方法所在的類(lèi)。

延遲靜態(tài)綁定:使用預(yù)留的 static 關(guān)鍵字,用于在繼承范圍內(nèi)引用靜態(tài)調(diào)用的類(lèi)。

  • 在非靜態(tài)環(huán)境下,所調(diào)用的類(lèi)即為該對(duì)象實(shí)例所屬的類(lèi)。由于?$this->?會(huì)在同一作用范圍內(nèi)嘗試調(diào)用私有方法,而?static::?則可能給出不同結(jié)果。另一個(gè)區(qū)別是?static::?只能用于靜態(tài)屬性。
  • 延遲靜態(tài)綁定的解析會(huì)一直到取得一個(gè)完全解析了的靜態(tài)調(diào)用為止。另一方面,如果靜態(tài)調(diào)用使用?parent::?或者?self::?將轉(zhuǎn)發(fā)調(diào)用信息。

應(yīng)用場(chǎng)景:可以為超類(lèi)引入 組 的概念。

4.6 ?錯(cuò)誤處理

本節(jié)舉了一個(gè)簡(jiǎn)單的 conf 類(lèi)的例子。這個(gè)類(lèi)沒(méi)有任何處理配置信息不存在或不可寫(xiě)的策略,只是假定了 XML 文檔的格式正確并包含了需要的元素。這是很不明智的。

本節(jié)重點(diǎn)強(qiáng)調(diào):應(yīng)該把錯(cuò)誤處理的責(zé)任集中放在類(lèi)的內(nèi)部,而不能依賴(lài)調(diào)用該類(lèi)的程序員和外部代碼。

4.7 ?異常

PHP5 引入了異常(exception)。

異常是從 PHP5 內(nèi)置的 Exception 類(lèi)(或其子類(lèi))實(shí)例化得到的特殊對(duì)象。

Exception 類(lèi)的構(gòu)造方法接受兩個(gè)可選參數(shù):消息字符串和錯(cuò)誤代碼。

1. 拋出異常

可以聯(lián)合使用 throw 關(guān)鍵字和 Exception 對(duì)象來(lái)拋出異常。這會(huì)停止執(zhí)行當(dāng)前方法,并負(fù)責(zé)將錯(cuò)誤返回給調(diào)用代碼。書(shū)中重寫(xiě)了前面 conf 類(lèi)的構(gòu)造方法和 write() 方法。

如果調(diào)用可能會(huì)拋出異常的方法,那么可以把調(diào)用語(yǔ)句放在 try 子句中。try 子句由關(guān)鍵字 try 及其后面的括號(hào)組成。try 字句必須跟著至少一個(gè) catch 子句才能處理錯(cuò)誤。

2. 異常的子類(lèi)化

通過(guò)繼承 Exception 類(lèi),可以創(chuàng)建用戶(hù)自定義的異常類(lèi)。

定義多個(gè) catch 子句時(shí),只需一個(gè) try 子句。調(diào)用哪一個(gè) catch 子句取決于拋出異常的類(lèi)型和參數(shù)中類(lèi)的類(lèi)型提示。

書(shū)中自定義了一個(gè)繼承自 Exception 類(lèi)的 XmlException 類(lèi)、FileException 類(lèi)、ConfException 類(lèi),并在 Conf 類(lèi)中使用了這些自定義類(lèi)。最后寫(xiě)一個(gè) Runner 類(lèi)來(lái)捕捉 Conf 類(lèi)的構(gòu)造方法可能拋出3個(gè)異常中的任意一個(gè),該類(lèi)使用了多個(gè) catch 子句,并注意把 Exception 異常類(lèi)型放在最后一個(gè) catch 子句中。另外的一個(gè)技巧是,可以拋出包裝了當(dāng)前異常的新異常。

當(dāng)異常沒(méi)有被客戶(hù)端代碼捕獲,異常會(huì)被再次拋出,客戶(hù)的調(diào)用代碼會(huì)優(yōu)先捕獲它。如果異常最后也沒(méi)有被捕獲,將會(huì)引發(fā)致命錯(cuò)誤。所以當(dāng)拋出異常時(shí),要強(qiáng)制要求客戶(hù)端代碼對(duì)它進(jìn)行處理。

4.7 ?Final 類(lèi)和方法

final 類(lèi)不能被繼承,即不能有子類(lèi)。final 方法不能被覆寫(xiě)。final 關(guān)鍵字應(yīng)該放在其他修飾詞(例如 protected 或 static)之前。

慎重使用 final 關(guān)鍵字。

4.8 ?使用攔截器

PHP 提供了內(nèi)置的攔截器方法。

  • ?__get( $property ):訪問(wèn)未定義的屬性時(shí)被調(diào)用
  • __set( $property, $value ):給未定義的屬性賦值時(shí)被調(diào)用
  • __isset( $property ):對(duì)未定義的屬性調(diào)用 isset() 時(shí)被調(diào)用
  • __unset( $property ):對(duì)未定義的屬性調(diào)用 unset() 時(shí)被調(diào)用
  • __call( $method, $arg_array ):調(diào)用未定義的方法時(shí)被調(diào)用

書(shū)中寫(xiě)了一個(gè) Person 類(lèi),說(shuō)明了如何使用攔截器方法。還寫(xiě)了一個(gè) PersonWriter 類(lèi),用來(lái)說(shuō)明 __call() 方法如何實(shí)現(xiàn)委托。過(guò)多地使用委托,會(huì)使代碼變得不清晰。應(yīng)慎重使用攔截器方法,并且最好附上說(shuō)明文檔。

4.9 ?析構(gòu)方法

析構(gòu)方法__destruct():只在對(duì)象被垃圾收集器收集前(即對(duì)象從內(nèi)存中刪除之前)自動(dòng)調(diào)用。可以使用析構(gòu)方法進(jìn)行最后必要的清理操作。

書(shū)中給 Person 類(lèi)添加了析構(gòu)方法,并說(shuō)明應(yīng)該謹(jǐn)慎使用析構(gòu)方法等魔術(shù)方法。

4.10 ?使用 __clone() 復(fù)制對(duì)象

在PHP中,對(duì)象的賦值和引用都是通過(guò)引用進(jìn)行的。要獲得一個(gè)對(duì)象的副本,PHP提供了clone關(guān)鍵字。clone使用“值復(fù)制”方式新生成一個(gè)對(duì)象。

在對(duì)象上調(diào)用clone時(shí),可以通過(guò)實(shí)現(xiàn)__clone()方法來(lái)控制我們需要復(fù)制什么。當(dāng)在一個(gè)對(duì)象上調(diào)用clone關(guān)鍵字時(shí),其__clone()方法就會(huì)被自動(dòng)調(diào)用。__clone()是在復(fù)制得到的對(duì)象上運(yùn)行的,而不是在原始對(duì)象上運(yùn)行的。

在復(fù)制對(duì)象屬性時(shí)只復(fù)制引用,并不復(fù)制引用的對(duì)象。如果不希望對(duì)象屬性在被復(fù)制之后被共享,那么可以顯式得在__clone()方法中復(fù)制指向的對(duì)象。

4.11 定義對(duì)象的字符串值

通過(guò)實(shí)現(xiàn)__toString()方法,可以控制輸出對(duì)象的字符串值的格式。__toString()方法應(yīng)當(dāng)返回一個(gè)字符串值。當(dāng)把對(duì)象傳遞給print或echo時(shí),會(huì)自動(dòng)調(diào)用這個(gè)方法,并用方法的返回值來(lái)替代默認(rèn)的輸出內(nèi)容。

4.12 回調(diào)、匿名函數(shù)和閉包

?

轉(zhuǎn)載于:https://www.cnblogs.com/afee666/p/6857552.html

總結(jié)

以上是生活随笔為你收集整理的《深入PHP:面向对象、模式与实践》(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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