whole_func_string: function() {
      if (this.token === this.tok.T_LIST || this.token === "[") {
        const isShort = this.token === "[";
        const result = this.node("list");
        this.next();
        if (!isShort && this.expect("(")) this.next();
        const assignList = this.read_array_pair_list(isShort);
        if (this.expect(isShort ? "]" : ")")) this.next();
        return result(assignList, isShort);
      } else {
        return this.read_variable(false, false, false);
      }
    }
func_code_string: function() {
      if (this.token === this.tok.T_LIST || this.token === "[") {
        const isShort = this.token === "[";
        const result = this.node("list");
        this.next();
        if (!isShort && this.expect("(")) this.next();
        const assignList = this.read_array_pair_list(isShort);
        if (this.expect(isShort ? "]" : ")")) this.next();
        return result(assignList, isShort);
      } else {
        return this.read_variable(false, false, false);
      }
    }
func_documentation_string: Reads a foreach variable statement
  ```ebnf
  foreach_variable =
  variable |
  '&' variable |
  T_LIST '(' assignment_list ')' |
  '[' assignment_list ']'
  ```
  @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L544
  @return {Expression}