首页 > 解决方案 > 在 PHP 中写入函数的返回值

问题描述

PHP语言规范说:

变量是原则上可以用作左值的表达式

仅当函数返回可修改的值 byRef 时,函数调用的值才是可修改的左值。

和来自zend_language_parser.y的语法

expr:
   variable T_CONCAT_EQUAL expr

callable_variable:
        simple_variable
            { $$ = zend_ast_create(ZEND_AST_VAR, $1); }
    |   dereferencable '[' optional_expr ']'
            { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
    |   constant '[' optional_expr ']'
            { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
    |   dereferencable '{' expr '}'
            { $$ = zend_ast_create_ex(ZEND_AST_DIM, ZEND_DIM_ALTERNATIVE_SYNTAX, $1, $3); }
    |   dereferencable T_OBJECT_OPERATOR property_name argument_list
            { $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $4); }
    |   function_call { $$ = $1; }
;

variable:
        callable_variable
            { $$ = $1; }
    |   static_member
            { $$ = $1; }
    |   dereferencable T_OBJECT_OPERATOR property_name
            { $$ = zend_ast_create(ZEND_AST_PROP, $1, $3); }
;

那么为什么我不能在 PHP 7.3 中做到这一点呢?

<?php
$a = 'HELLO';
function &foo() { 
    global $a;
    return $a;
}

foo() .= ' WORLD';
echo $a;
PHP Fatal error:  Can't use function return value in write context in ...

从这个问题开始,参考上面的语法:

什么时候可以在简单/复合赋值表达式的左侧进行函数调用?

标签: php

解决方案


虽然您可以从函数返回引用,但您不能直接写入该引用。

您必须先分配参考。

$a = 'HELLO';
function &foo() { 
    global $a;
    return $a;
}

$b =& foo();
$b .= ' WORLD';
echo $a;

推荐阅读