PHP中能否将箭头函数作为类的属性或方法?怎么实现?
问题解答
能否将箭头函数声明为类的属性或方法?
可以,但需遵循PHP语法规则——直接在类属性声明时赋值箭头函数是不合法的,因为类属性的默认初始化值必须是常量表达式,而箭头函数属于动态表达式,无法在类属性定义阶段直接赋值。
正确实现流程
1. 将箭头函数作为类属性
需在类的构造函数中为属性赋值箭头函数,而非属性声明阶段直接赋值:
namespace Calculate; class calculator{ public $sum; public function __construct(){ // 在构造函数中初始化箭头函数属性 $this->sum = fn(...$args) => array_sum($args); } public function init(){ return $this->sum(5, 10); } } $cal = new calculator(); print $cal->init(); // 输出 15
2. 模拟箭头函数作为类方法(替代方案)
PHP目前不支持直接用箭头函数定义类方法(public fn sum(...) => ...属于语法错误),若想实现类似箭头函数的简洁写法,可在方法内直接定义并调用,或通过构造函数绑定为属性复用:
namespace Calculate; class calculator{ public function init(){ // 方法内定义箭头函数并直接调用 $sum = fn(...$args) => array_sum($args); return $sum(5, 10); } } $cal = new calculator(); print $cal->init(); // 输出 15
为什么你的第一个代码无法运行?
你直接在类属性声明时赋值箭头函数:
public $sum = fn(...$args) => array_sum($args);
这违反了PHP类属性初始化规则:类属性的默认值必须是常量表达式(如字符串、数字、null或类常量等),箭头函数是动态生成的闭包,属于非常量表达式,会触发语法错误,导致程序无法正常执行,自然得不到预期输出。
而全局变量中的箭头函数可以正常工作,是因为全局作用域的变量赋值不受类属性初始化规则限制,可直接赋值动态表达式。
内容的提问来源于stack exchange,提问作者Syed Imran Ertaza
相关产品推荐
相关产品推荐

