PHP學習筆記(十)

extends

一個類可以在聲明中用extends關鍵字繼承另一個類的方法和屬性。PHP不支持多重繼承,一個類只能繼承一個基類。

被繼承的方法和屬性可以通過同樣的名字重新聲明被覆蓋,但是如果父類定義或者常量時是使用類final,則不可被覆蓋,可以通過parent::來訪問被覆蓋的方法或屬性。從PHP 8.1起,常量可以聲明為final。

final關鍵字:

final可用于類或方法:

  • final類不能被繼承
  • final方法不能被子類重寫
final class FinalClass { // 這個類不能被繼承final public function finalMethod() { // 這個方法不能被子類重寫// ...}
}
簽名兼容性規則

當覆蓋方法是,簽名必須兼容父類方法。否則會導致Fatal錯誤,PHP 8.0 前是 E_WARNING級錯誤。兼容簽名是指:遵守協變與逆變規則;強制參數可改為可選參數;添加的新參數只能是可選參數;放寬可見性而不是繼續限制。這就是里氏替換原則(LiskovSubstitution Principle)簡稱LSP。不過構造方法和私有(private)方法不需要遵循簽名兼容原則,就算簽名不匹配也不會造成Fatal錯誤。

子類與父類不兼容的例子:通過移除參數、修改可選參數為必填參數。

::class

關鍵詞class也可用于類名的解析。使用ClassName::class可獲取類ClassName的完全限定名稱。這對使用命名空間的類尤其有用。

自PHP 8.0起,::class 也可用于對象。此時解析將會在運行時進行。此操作的運行結果和在對象上調用get_class()相同。

Nullsafe方法和屬性

自PHP8.0起,類屬性和方法可通過“nullsafe”操作符訪問:?-> 。 除了一處不同,nullsafe操作符和以上原來的屬性、方法訪問是一致的:對象引用解析為null是不拋出異常,而是返回null。如果鏈式調用中的一部分,剩余鏈條會直接跳過。

屬性

類的變量成員叫做屬性,或者叫字段。屬性開頭至少用一個修飾符,除了readonly 屬性之外都是可選的,然后自PHP 7.4起可以跟一個類型聲明,然后跟一個普通的變量聲明來組成。屬性中的變量可以初始化,但初始化的值必須是常量值。

在類的成員方法里,可以用-> (對象運算符):$this->property (其中property是該屬性名)這種方式來訪問非靜態屬性。靜態屬性則是用::(雙冒號)self::$property 來訪問。更多靜態屬性與非靜態屬性的區別參見靜態static 關鍵字。

當一個方法在類定義內部被調用時,有一個可用的偽變量$this 。 $this是一個指向當前對象的引用。(通常是該方法所從屬的對象,但如果是另一個對象靜態調用,也可能是另一個)

類型聲明

從PHP 7.4起,屬性定義可以包含類型聲明,但callable除外

類型屬性必須在訪問前初始化,否則會拋出Error

只讀屬性

自PHP 8.1起,可用readonly修飾符聲明屬性,防止初始化后修改屬性。在PHP8.4前,readonly屬性是隱式的私有設置,只能從同一類寫入。從PHP 8.4 開始 , readonly屬性是隱式的protected(set) , 因此可從子類設置,若需要,可以顯式覆蓋。

只讀屬性只能初始化一次,并且只能從聲明它的作用域內初始化。對屬性的任何賦值和修改都會導致Error異常。

除了修改,以下操作也會導致Error異常:

只讀屬性不會妨礙內部可變性。存儲在只讀屬性中的對象(或資源)仍然可以在內部修改:

自PHP 8.3起,使用_clone()方法克隆對象時可以重新初始化readonly屬性

動態屬性

如果嘗試在object上賦值不存在的屬性,PHP將會自動創建相應的屬性。動態創建的屬性將僅能此類實例上使用。

由于PHP 8.2+不推薦動態屬性,可以使用:

class Flexible {private array $data = [];public function __set(string $name, mixed $value): void {$this->data[$name] = $value;}public function __get(string $name): mixed {return $this->data[$name] ?? null;}
}

參考資料

PHP手冊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81223.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rt-linux里的泛rtmutex鎖的調用鏈整體分析

一、背景 linux系統里有非常多的鎖種類,除了spinlock,mutex,rwlock,rwsem,還有rcu及順序鎖,這里面還有不少鎖變種,比如spinlock的帶bh或者irq字樣的lock/unlock,還有nmi里可以用的順…

LLM多平臺統一調用系統-LiteLLM概述

概述 在當今快速發展的AI領域,大語言模型(LLM)已成為技術創新的核心驅動力。然而,隨著市場上涌現出越來越多的LLM提供商(如OpenAI、Anthropic、Google Gemini、AWS Bedrock等),開發者面臨著一個日益復雜的問題&#x…

C#實現MCP Client 與 LLM 連接,抓取網頁內容功能!

該專欄優先在飛書發布,歡迎收藏關注! https://www.feishu.cn/community/article?id7507084665509904403 前面的課程,我們已經用C#實現了,自己的MCP Client。 下面我們一起來實現,MCP Client與LLM 對接。 一、添加依…

并發編程(6)

指令重排序 指令重排序是指在程序執行過程中,為了提高性能,編譯器或處理器會對指令的執行順序進行重新排列。 指令重排序導致可見性消失 在多線程環境下,每個線程都有自己的工作內存,線程對變量的操作是在工作內存中進行的&…

鴻蒙倉頡開發語言實戰教程:頁面跳轉和傳參

前兩天分別實現了商城應用的首頁和商品詳情頁面,今天要分享新的內容,就是這兩個頁面之間的相互跳轉和傳遞參數。 首先我們需要兩個頁面。如果你的項目中還沒有第二個頁面,可以右鍵cangjie文件夾新建倉頡文件: 新建的文件里面沒什…

Java 學習筆記:注解、泛型與 IO 流

目錄 課程目標 Java 注解(Annotation) 1. 概念與作用 2. 自定義注解示例 3. JDK 內置注解 4.注釋 Java 泛型(Generics) 1. 基本語法 2. 通配符與上下限 3. 常見應用場景 Java IO 流 1. 流的分類1.File文件類 2. 字節流與字符流 3. 經典示例:文件拷貝 總結與…

git倉庫代碼操作

1、從gitee下載代碼提交到本地github倉庫,保留提交記錄 # 查看當前分支 git branch# 查看當前遠程倉庫 git remote -v# 確保所有更改已提交 git add . git commit -m "準備提交到GitLab"# 添加GitLab遠程倉庫 git remote add gitlab https://gitlab.com/…

Thinkphp6使用token+Validate驗證防止表單重復提交

htm頁面加 <input type"hidden" name"__token__" value"{:token()}" /> Validate 官方文檔 ThinkPHP官方手冊

Mcu_Bsdiff_Upgrade

系統架構 概述 MCU BSDiff 升級系統通過使用二進制差分技術&#xff0c;提供了一種在資源受限的微控制器上進行高效固件更新的機制。系統不傳輸和存儲完整的固件映像&#xff0c;而是只處理固件版本之間的差異&#xff0c;從而顯著縮小更新包并降低帶寬要求。 該架構遵循一個…

Spring Boot微服務架構(四):微服務的劃分原則

微服務劃分原則&#xff08;CRM系統案例說明&#xff09; 一、微服務劃分的核心原則 單一職責原則&#xff08;SRP&#xff09; 每個微服務只負責一個明確的業務功能服務邊界清晰&#xff0c;避免功能混雜便于獨立開發、測試和部署 業務領域驅動設計&#xff08;DDD&#xff0…

基于CNN卷積神經網絡的帶頻偏QPSK調制信號檢測識別算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代碼包含詳細中文注釋和操作步驟視頻&#xff09…

從機械應答到深度交互,移遠通信如何讓機器人“靈魂覺醒”?

你是否還在因機器人的“答非所問”而無奈&#xff0c;為它們的“反應慢半拍”而抓狂&#xff1f;別慌&#xff01;一場引領機器人實現“靈魂覺醒”的技術革命&#xff0c;正如同暗夜中悄然綻放的繁星&#xff0c;徹底顛覆人們對機器人的傳統認知。 5月20日&#xff0c;移遠通信…

軟件的技術架構、應用架構、業務架構、數據架構、部署架構

一、各架構定義 1. 技術架構&#xff08;Technical Architecture&#xff09; 定義&#xff1a;技術架構關注的是支撐系統運行的底層技術基礎設施和軟件平臺&#xff0c;包括硬件、操作系統、中間件、編程語言、框架、數據庫管理系統等技術組件的選擇和組合方式。它描述了系統…

HTML-前端

目錄 開始學習HTML 什么是 HTML? 剖析一個 HTML 元素 嵌套元素 塊級元素和內聯元素 空元素 屬性 為元素添加屬性 布爾屬性 省略包圍屬性值的引號 使用單引號還是雙引號&#xff1f; 剖析 HTML 文檔 HTML 中的空白 實體引用&#xff1a;在 HTML 中包含特殊字符 HT…

多態的總結

什么是多態&#xff1f; 答&#xff1a;多態是多種形態&#xff0c;是為了完成某種行為時&#xff0c;不同對象會產生不同的形態&#xff08;結合車票例子解釋&#xff09; 2. 什么是重載、重寫(覆蓋)、重定義(隱藏)&#xff1f; 答&#xff1a;重載的條件是&#xff1a;在同一…

VBA 讀取指定范圍內的單元格數據,生成csv文件

目錄 一. 需求二. 宏代碼三. 添加按鈕 一. 需求 ?有如下表格&#xff0c;現在想在Excel中添加一個按鈕 點擊按鈕之后&#xff0c;讀取該表格中的數據&#xff0c;生成csv文件將csv文件輸出到和Excel同級目錄 二. 宏代碼 Application.PathSeparator&#xff1a;路徑分隔符Cr…

【Code Agent Benchmark】論文分享No.15:TAU-Bench

論文名稱&#xff1a;τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains 論文&#xff1a;https://arxiv.org/abs/2406.12045 機構&#xff1a;Sierra Github 鏈接&#xff1a;https://github.com/sierra-research/tau-bench# 簡介 相比于Swe-ben…

Linux下 使用 SSH 完成 Git 綁定 GitHub

文章目錄 1、檢查 SSH2、生成 SSH key3、添加 SSH key4、驗證綁定是否成功 1、檢查 SSH Git Bash 中輸入ssh命令&#xff0c;查看本機是否安裝 SSH&#xff1a; 2、生成 SSH key &#xff08;1&#xff09;輸入 ssh-keygen -t rsa 命令&#xff0c;表示我們指定 RSA 算法生…

Java 8 Stream 流操作全解析

文章目錄 **一、Stream 流簡介****二、Stream 流核心操作****1. 創建 Stream****2. 中間操作&#xff08;Intermediate Operations&#xff09;****filter(Predicate<T>)&#xff1a;過濾數據****1. 簡單條件過濾****2. 多條件組合****3. 過濾對象集合****4. 過濾 null 值…

Java——設計模式(Design Pattern)

設計模式&#xff08;Design Pattern&#xff09;是軟件開發中針對常見問題的經典解決方案&#xff0c;由 GoF&#xff08;Gang of Four&#xff09;在《設計模式&#xff1a;可復用面向對象軟件的基礎》一書中歸納為23 種模式&#xff0c;分為三大類&#xff1a;創建型模式、結…