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