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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;创建型模式、结…