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

PHP final关键字怎么用?

在 PHP 中,final关键字可以防止 class 和 function 被修改或覆盖。它有助于保护代码的重要部分,确保在进行修改时不会意外破坏它们。

final关键字用于 class 的定义、class 中的 method,以及 class 的 constant property 的定义。

final 关键字的作用是什么?

final关键字有两种用法 —

  • 用于 Class:防止该 class 被扩展(继承)。

  • 用于 Method:防止它们在子类中被覆盖。

在本章中,我们将介绍以下主题 —

  • 与 Class 一起使用 final

  • 与 Method 一起使用 final

  • 与 Constant 一起使用 final

  • 实际示例:ellipse 和 circle Class

与 Class 一起使用 final

让我们看看如何使用final关键字创建 class —

final class myclass { /*类成员*/ }

示例:Class 继承错误

class 定义中的final关键字防止该 class 被扩展。换句话说,你不能将 final class 用作父类。如果尝试这样做,PHP 解析器会抛出错误。

<?php final class myclass { /* 类体 */ } class newclass extends myclass { /* 类体 */ } ?>
输出

运行此代码时,将显示错误

PHP Fatal error: Class newclass may not inherit from final class (myclass)

与 Method 一起使用 final

以下是如何使用final关键字创建 method —

class myclass { final function myfunction() { /* 函数体 */ } }

在 method 定义前添加final关键字可以防止它在子类中被覆盖。包含finalmethod 的 class 可以被扩展,但子类不能覆盖它。

示例:Method 覆盖错误

看下面的示例 —

<?php class myclass { final public function hello() { echo "Hello World!"; } } class newclass extends myclass { public function hello() { echo "Hello PHP!"; } } ?>
输出

运行此代码时,将显示错误

PHP Fatal error: Cannot override final method myclass::hello() in hello.php

与 Constant 一起使用 final

从 PHP 8.1.0 开始,你也可以使用final关键字在 class 中声明 constant。

final public const NAME = "My Class";

示例:Final constant 继承错误

如果你尝试在子类中覆盖父类中的 final constant,将遇到错误。

<?php class myclass { final public const NAME = "My Class"; final public function hello() { echo "Hello World!"; } } class newclass extends myclass { public const NAME = "New Class"; } ?>
输出

运行此代码时,将显示错误

Fatal error: newclass::NAME cannot override final constant myclass::NAME

实际示例:ellipse 和 circle Class

以下 PHP 脚本包含一个父类 ellipse,其中 PI constant 和 area() method 都被声明为 final。它们被 circle class 继承。area() function 计算圆的面积。

<?php class ellipse { final public const PI=22/7; private float $a, $b; public function __construct($x, $y) { $this->a = $x; $this->b = $y; } final public function area() : float { return self::PI*$this->a*$this->b; } } class circle extends ellipse { public function __construct(float $x) { parent::__construct($x, $x); } } $c1 = new circle(5); echo "Area: " . $c1->area() . PHP_EOL; ?>

输出

它将产生以下输出

Area: 78.571428571429

注意,class 的实例变量或属性不能被声明为 final。

http://www.jsqmd.com/news/652628/

相关文章:

  • SAP过账期间管理避坑指南:FI、MM、AA、CO模块如何协同与冲突解决
  • CANN Meetup 北京站|本周六赴约!
  • 【SLAM导航实战解析】- 基于已知地图的AMCL定位与move_base路径规划
  • 如何快速掌握Unity AI与路径规划:800+开源项目中的终极实现指南
  • 如何实现@vue/composition-api与TypeScript的完美集成:提升类型安全和开发体验的完整指南
  • 一、组合逻辑设计实战——从波形图到上板验证的多路选择器
  • Quant-UX文件格式深度解析:理解JSON结构实现自定义导入导出
  • 避坑指南:在Ubuntu 16.04虚拟机里搞定Livox Mid-70激光雷达与相机的联合标定
  • 数据可视化实战:如何通过Python定制个性化图表样式
  • 深度探索高效系统优化:专业工具让你的电脑焕然一新
  • 别再为4G视频卡顿发愁!手把手教你用阿里云ECS和coturn搭建专属TURN中继服务器
  • 别再乱选算法了!Halcon圆拟合算子fit_circle_contour_xld的6种算法深度评测与避坑指南
  • SiameseAOE中文-base作品集:抽取结果可视化热力图,直观呈现用户关注焦点分布
  • π型衰减器 vs. 数控衰减器:在LNA和ADC前端,固定衰减为何仍是“真香”选择?
  • Nestjs实战:VsCode调试Node.js项目的进阶配置指南
  • Vue项目里用腾讯地图API把地址转成经纬度,我踩过的坑你别再踩了
  • 深度学习驱动的知识图谱构建:从实体识别到关系推理
  • 中医药店|基于springboot + vue中医药店管理系统(源码+数据库+文档)
  • Autoware.universe避障调参避坑指南:从感知失效到成功绕障的配置文件详解
  • Tern项目配置终极指南:快速搭建企业级JavaScript分析环境
  • Chart.js项目实战:AI技术自主可控监控系统
  • SkeyeVSS开发日志:环境变量 .env 配置项详解
  • RS232、RS485与Modbus:工业通信协议与接口标准的深度解析
  • Linux内存管理(六): 伙伴系统与alloc_pages的分配策略
  • 【Windows】使用启动U盘重装Windows10系统
  • 微信小游戏广告接入避坑指南:从1000用户门槛到Banner广告精准定位(附完整代码)
  • Matplotlib 怎么设置坐标轴刻度?
  • 别再让机器人原地打转了!详解Gazebo中skid_steer_drive_controller插件与URDF坐标系设置的避坑指南
  • Windows远程桌面mstsc命令的隐藏玩法:从编辑RDP文件到多显示器适配
  • Linux基础开发工具(git篇)