当前位置: 首页 > news >正文

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手册

相关文章:

  • 特征预处理
  • QML混合编程图像刷新策略
  • JavaSE核心知识点03高级特性
  • JavaScript数据类型及内置函数详解目录
  • 【MYSQL】索引、存储引擎
  • Next.js V15 在异步页面中,获取路由动态参数的几个坑
  • 【二刷力扣】【力扣热题100】今天的题目是:283.移动零
  • 2025.5.22 Axure 基础与线框图制作学习笔记
  • 大数据Spark(六十):Spark On Yarn 配置
  • 软件工程重点复习
  • C++学习之打车软件—高德地图API
  • 图解 | 大模型智能体LLM Agents
  • 网络原理入门详解:从零理解互联网如何工作
  • mysql知识点1--了解数据库
  • c/c++的opencv椒盐噪声
  • 学习日志12 java
  • 【IPMV】图像处理与机器视觉:Lec12 Blob Detector 斑点检测
  • MLA:Transformer的智能变形金刚——解密多头潜在注意力的进化密码
  • DOM事件的传播机制
  • Dify 本地源码安装教程
  • 找个兼职做网站的/网络营销的特点有哪些特点
  • 活动策划案模板/宁波seo网络推广公司排名
  • wordpress电商推广插件/淄博搜索引擎优化
  • 帮客户做网站的公司/系统优化软件排行榜
  • 企业文化宣传册模板/盛大游戏优化大师
  • 工程项目网站/如何进行搜索引擎的优化