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

PHP学习笔记(九)

箭头函数

箭头函数是 PHP 7.4的新语法。是一种更简洁的匿名函数的写法,它们都是closure类的实现。

箭头函数的基本语法为fn(argument_list) => expr

箭头函数支持与匿名函数相同的功能,只是其父作用域的变量总是自动的。

当表达式中使用的变量是在父作用域中定义的,它将被隐式的按值捕获。

在箭头函数嵌套的情况下同样有效

和匿名函数一样,箭头函数同样允许标准的函数声明,包括参数和返回类型、缺省值、变量,以及通过引用传递和返回。

箭头函数会自动绑定上下文变量,相当于对箭头函数内部使用的每一个变量$x 执行了一个use($x)。这意味着不可能修改外部作用域的任何值,实现对值的修改,可用匿名函数来替代。

this  绑定特殊情况

class Example {private $value = 10;public method() {$fn = fn() => $this->value;  // 正确绑定}
}

First class callable 语法

从PHP 8.1开始引入first class callable 语法,作为从callable创建匿名函数的一种方法,取代了使用字符串和数组的现有callable语法。优点是可以进行静态分析,并使用获得可调用对象的作用域。

CallableExpr(...)语法从callable创建Closure CallableExpr 接受任何可以在PHP语法中直接调用的表达式:

CallableExpr(...) 与Close::fromCallable()语义相同。也就是说,与使用字符串和数组的callable不同,CallableExpr(...)尊重其创建时的作用域:

类与对象

PHP具有完整的对象模型。特性包括:访问控制,抽象类和final类与方法,附加的魔术方法,接口,对象复制。

PHP对待对象的方式等同于引用或句柄,即每个变量都持有对象的引用,而不是整个对象的复制。

基本概念

class

每个类的定义都以关键字class开头,后面跟类名,后面跟着一对花括号,里面包含类的属性与方法的定义。

类名可以是任何不是PHP保留字的有效标签。自PHP8.4起,弃用使用单个下划线_ 作为类名。有效类名以字母或下划线开头,后面跟着若干字母、数字或下划线。

一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。

当一个方法在类定义内部被调用时,有个可用的伪变量 $this ,是一个到当前对象的引用。

只读类

自PHP 8.2起 , 可以用readonly 修饰符来标记类。将类标记为readonly只会向每个声明的属性添加readonly 修饰符并禁止创建动态属性,除此之外,不能用AllowDynamicProperties注解来添加对后者的支持,这样会触发编译错误。

由于无类型的属性和静态属性不能用readonly修饰符,所以readonly不会对其声明:

仅当子类也是readonly类时,才可以继承readonly类

new

要创建一个类的实例,必须用new关键字。创建新对象时该对象总是被赋值,除非该对象定义了构造函数并在出错时抛出了一个异常。类应在被实例化之前定义(某些情况下则必须这样)。

如果一个变量包含一个类名的string和new时,将创建该类的一个新实例。若该类属于一个命名空间,则必须使用其完整名称。

PHP 8.0起,支持任意表达式中使用new。如果表达式生成一个string,这将允许更复杂的实例化。表达式必须使用括号括起来。

在类定义内部,可用new self 和new parent 创建新对象。

当把一个对象已经创建的实例赋给一个新变量,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例一样。可用克隆给一个已创建的对象建立一个新实例。

有几种方法可以创建一个对象的实例。

可以通过一个表达式来访问新创建对象的成员:

属性和方法

类的属性和方法存在于不同的“命名空间”中,这意味着同一个类的属性和方法可以使用同样的名字。在类中访问属性和调用方法使用同样的操作符,具体时访问一个属性还是调用一个方法,取决于你的上下文,即用法是变量访问还是函数调用。

这意味着,如果你的类属性被分配给一个匿名函数将无法直接调用它,因为访问类属性的优先级更高,在此场景下需要用括号包裹起来调用。

参考资料

PHP手册

相关文章:

  • 10大Python知识图谱开源项目全解析
  • 白杨SEO:做AI搜索优化的DeepSeek、豆包、Kimi、百度文心一言、腾讯元宝、通义、智谱、天工等AI生成内容信息采集主要来自哪?占比是多少?
  • Spring Boot 中修改 HTTP 响应状态码(即 `response.status`)可以通过以下几种方式实现
  • 新能源产业破局之道:达索 3DE(PLM)系统重构数据管理与工程变更效率
  • 什么是数据分析
  • 2025年 中青杯A题论文发布
  • Redis学习打卡-Day6-Redis 高可用(上)
  • linux debug技术
  • el-form 使用el-row el-col对齐 注意事项
  • 后端开发概念
  • 【MPC控制 - 从ACC到自动驾驶】车辆纵向动力学建模与离散化:MPC的“数字蓝图”
  • 微前端架构:从单体到模块化的前端新革命
  • 【C++】C++异步编程四剑客:future、async、promise和packaged_task详解
  • 使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
  • 可增添功能的鼠标右键优化工具
  • LumaDot (亮度可调的屏幕圆点)
  • 【Linux仓库】权限的量子纠缠:用户/组/other如何编织Linux访问控制网?
  • uniapp+ts 多环境编译
  • WebSockets 在实时通信中的应用与优化
  • H3C-W2000-G2【透明反代理】
  • 网站建设学生选课课程设计报告/直播回放老卡怎么回事
  • 巢湖网站设计/石家庄百度搜索引擎优化
  • 主机做网站服务器怎么设置/搜索引擎推广方式有哪些
  • 永年网站建设/接外包项目的网站
  • 美团外卖网站开发/seo技术团队
  • 重生做二次元网站/搜索引擎关键词广告