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

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

http://www.lryc.cn/news/2387812.html

相关文章:

  • 共现矩阵的SVD降维与低维词向量计算详解
  • 信创 CDC 实战 | OGG、Attunity……之后,信创数据库实时同步链路如何构建?(以 GaussDB 数据入仓为例)
  • PyQt学习系列08-插件系统与模块化开发
  • Redis核心数据结构操作指南:字符串、哈希、列表详解
  • 微服务(SpringCloud)的简单介绍
  • Python 爬虫开发
  • 第十一周作业
  • 猿大师办公助手网页编辑Office/wps支持服务器文件多线程下载吗?
  • 英码科技携带 “无感知AI数字课堂”解决方案,亮相第22届广东教育装备展
  • 各个链接集合
  • 【R语言科研绘图】
  • Linux Shell 切换
  • ProfiNet转Ethernet/IP网关选型策略适配西门子S7-1500与罗克韦尔ControlLogix5580的关键指标对比
  • AWS WebRTC:获取信令服务节点和ICE服务节点
  • [图文]图6.3会计事项-Fowler分析模式的剖析和实现
  • [Linux] 利用systemd实现周期性执行任务(DDNS设置案例)
  • maven 3.0多线程编译提高编译速度
  • Dalvik虚拟机、ART虚拟机与JVM的核心区别
  • Unity 3D AssetBundle加密解密教程
  • 【Linux】shell脚本的常用命令
  • Netty应用:从零搭建Java游戏服务器网络框架
  • Pycharm and Flask 的学习心得(9)
  • Linux初始-环境安装(2)
  • Nginx 安全防护与 HTTPS 部署实战笔记
  • Python Day34 学习
  • 【ASR】基于分块非自回归模型的流式端到端语音识别
  • 国芯思辰|国产FRAM SF25C128助力监控系统高效低功耗解决方案,对标MB85RS128/FM25V01
  • 攻防世界逆向刷题笔记(新手模式9-1?)
  • 【golang】能否在遍历map的同时删除元素
  • 制作一款打飞机游戏58:子弹模式组合