RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1437802
Accepted
Алексей Шиманский
Алексей Шиманский
Asked:2022-08-09 22:23:30 +0000 UTC2022-08-09 22:23:30 +0000 UTC 2022-08-09 22:23:30 +0000 UTC

解析/语法错误;意外的 XXX 错误以及如何解决它们

  • 772

程序员经常犯错误。可能会出现语法错误。例如:

PHP Parse 错误:语法错误,第 20 行 index.php 中出现意外的“{”

一个意想不到的符号并不总是真正的罪魁祸首。但是行号给出了从哪里开始搜索的粗略概念。

始终查看代码的上下文。语法错误通常在于提到的或前面的代码行。将您的代码与手册中的语法示例进行比较。


用于故障排除的其他链接:

  • 如何以及通过什么方式在 PHP 代码中查找错误?
  • 这个错误是什么意思?(解析、语法、警告、致命)

下面的答案总结了常见错误,在下面的列表中找到错误并跳转到带有描述的答案。

  • 消除语法错误的一般步骤

  • 意外的 T_STRING
    意外的标识符“xxx”

    意外的 T_VARIABLE
    意外的 '$varname' (T_VARIABLE)

  • 意外的 T_CONSTANT_ENCAPSED_STRING
    意外的 T_ENCAPSED_AND_WHITESPACE

    意外的 $end / 意外的文件结尾

    意外的 T_FUNCTION

  • 意外{
    意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外}
    意外(
    意外)

  • 出乎意料[
    的出乎意料]

  • 意外 T_IF
    意外 T_FOREACH
    意外 T_FOR
    意外 T_WHILE
    意外 T_DO
    意外 T_PRINT
    意外 T_ECHO

    意外 T_LNUMBER

  • 意外?

    意外继续 (T_CONTINUE)
    意外继续 (T_BREAK)
    意外继续 (T_RETURN)

    意外 '='

    意外 T_PAAMAYIM_NEKUDOTAYIM

    意外 T_OBJECT_OPERATOR

    意外 T_DOUBLE_ARROW

    意外 T_BOOLEAN_OR
    意外 T_BOOLEAN_AND


工作中...

  • 意外 T_IS_EQUAL
    意外 T_IS_GREATER_OR_EQUAL
    意外 T_IS_IDENTICAL
    意外 T_IS_NOT_EQUAL
    意外 T_IS_NOT_IDENTICAL
    意外 T_IS_SMALLER_OR_EQUAL
    意外<
    意外>

  • 输入中的意外字符:' \' (ASCII=92) state=1

  • 意外的“公共”(T_PUBLIC)
    意外的“私有”(T_PRIVATE)
    意外的“受保护”(T_PROTECTED)
    意外的“最终”(T_FINAL)

  • 意外的 T_STATIC

  • 意外的 T_CLASS

  • 意外的“使用”(T_USE)

  • 意外的 T_DNUMBER

  • Unexpected ,
    Unpexected .
    Unexpected ;
    Unexpected *
    Unexpected :
    Unexpected ':', 期待 ',' 或 ')'
    Unexpected &
    Unexpected.

php обработка-ошибок
  • 7 7 个回答
  • 160 Views

7 个回答

  • Voted
  1. Алексей Шиманский
    2022-08-09T22:24:40Z2022-08-09T22:24:40Z

    意外的 T_STRING

    意外的标识符“xxx”

    表示找到原始标识符。这可以是不同的:从“裸词”到剩余的常量或函数名,被遗忘的不带引号的字符串,或任何纯文本。示例问题:

    1. 带有无效引号的字符串

      任何未转义和随机的引号"或'形成无效的表达式。

                    ⇓                  ⇓
      echo "<a href="http://example.com">click here</a>";
      

      此示例在 double 中使用双引号。这不是真的。解释器会“看到”字符串"<a href="和字符串">click here</a>"(因为字符串是用引号括起来的),但http://example.com它不会理解它是什么。重要的是要记住使用反斜杠来转义\"双引号或\'单引号 - 以外部用于整个字符串的为准(用于熟悉字符串)。比如外面有双引号,那么里面用单引号比较容易,以免混淆,或者转义双引号。单打也一样。将大文本放入HEREDOC或NOWDOC更容易

    2. 未闭合的行

      如果省略结束引号,则语法错误通常会在以后发生。

                                                              ⇓   тут не закрыли и поэтому интерпретатор считает, что строка идёт дальше
       echo "Some text", $a_variable, "and some runaway string ;
       success("finished");
               ⇯ и тут закрылась..... а что такое `finished");` он не знает
      
    3. 非编程报价

      通常在从书中复制文本时发生。它们可能看起来像这样:

      $text = ’Something something..’ + ”these ain't quotes”;
              ^---                  ^-- ^---               ^---  
      
    4. 缺少分号

             ⇓
      func1()
      function2();
      
    5. 不可见的 Unicode 字符

      如果您从 T_STRING 解析器收到关于完全不可疑代码的投诉,如下所示:

      <?php
          print 123;
      

      您需要使用另一个文本编辑器。甚至是十六进制编辑器。这里看起来像简单的空格和换行符可能包含不可见的常量。这发生在具有编码的文档中UTF-8 BOM,您需要进行编码UTF-8 без BOM

    6. 转义报价

      该符号\具有特殊含义。该符号通常\用于在字符串中转义。为了使包含在相同引号中的字符串中的引号按原样打印,它被转义。那些。行将echo "Jim said \"Hello\"";输出Jim said "hello". 如果您应用该序列\",那么它将被视为试图转义引用。所以下面的行会抛出错误

      "C:\xampp\htdocs\"
      

      转义反斜杠也是正确的:

      "C:\\xampp\\htdocs\\"
      


    意外的 T_VARIABLE

    意外的“$varname”(T_VARIABLE)

    表示存在错误中指定的名称的特定变量不适合当前表达式/语句结构。

    在此处输入图像描述

    错误:

    1. 缺少分号

      通常,省略分号,并且在下一行有一个变量:

             ⇓
      func1()
      $var = 1 + 2;     # parse error in line +2
      
    2. 无效的字符串连接

                                   ⇓  Пропущен знак конкатенации
      echo "Here comes the value: "  $value;
      
    3. 缺少表达式语句

                ⇓
      echo 4 + 7 $var;
      
    4. 在数组或函数的枚举中

                                            ⇓
      $var = array("1" => $val, $val2, $val3 $val4);
      
                                      ⇓
      function myfunc($param1, $param2 $param3, $param4)
      
    5. 在类属性声明中

      只有静态值(唯一定义的)可以分配给属性,而不是表达式。

       class xyz {         ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓ - это выражение, а не статическое значение. Непозволительно
           public $value = $_GET["input"];
      

      如果需要将表达式分配给变量,则必须在构造函数或其他一些初始化方法中完成

    6. 紧跟在标识符之后的变量

                   ⇓
      $this->myFunc$VAR();
      
    7. if、for、foreach 语言结构之前/之后缺少括号

             ⇓
      foreach $array as $key) {
      
                                ⇓
      if ($var = pdo_query($sql) {
          $result = …
      
    8. Else 不期望条件

           ⇓
      else ($var >= 0)
      

      在这里你需要要么大括号,要么申请elseif(如果它不违反逻辑)

    9. 闭包所需的括号

                     ⇓
      function() use $var {}
      

      传递给闭包的变量必须始终用括号括起来

    10. 隐形空间

      如前所述。可能有看不见的字符。检查它们(阅读上面的Unexpected T_STRING错误)

    • 6
  2. Best Answer
    Алексей Шиманский
    2022-08-09T22:23:30Z2022-08-09T22:23:30Z

    关于语法错误的一般信息


    ### 那个笔记:

    1. 如果您的浏览器显示诸如“SyntaxError:非法字符”之类的错误消息,那么这实际上与PHP无关,而是Javascript及其语法错误。

    2. 供应商代码中出现语法错误:如果安装或更新供应商的包后出现语法错误,这可能是由于PHP版本不兼容,因此请检查供应商的版本。以及设置平台的要求。

    3. 使用像PHPStorm这样的IDE,它总是会告诉你代码是否有问题。注意提示:

      在此处输入图像描述

      在此处输入图像描述

    4. 有时会由于文件开头的额外字符(尤其是 BOM)而发生错误。确保文件以没有 BOM 的 UTF-8 保存。(如果你需要 utf8)

    5. 如果您的网站只是空白并带有白屏,则通常是语法错误的原因。使用此指令启用他们的显示

    ### 如何解释解析器错误

    典型的语法错误信息:

    解析错误:语法错误,意外的T_STRING,在第217行的file.php中需要' ;'

    (解析错误:语法错误,意外的T_STRING,预期的 ' ;'在file.php的第217行 )

    这是语法错误的可能位置。请参阅提到的文件名和行号。

    一个标记,例如T_STRING,解释了解析器/标记器无法完成的字符。但是,这不一定是语法错误的原因。因此,研究前面几行代码很重要。语法错误通常是较早发生的错误。错误行号正是解析器最终放弃处理它的地方,而不是确切的错误行

    • 4
  3. Алексей Шиманский
    2022-08-09T22:26:51Z2022-08-09T22:26:51Z

    Unexpected (

    Открывающие круглые скобки обычно следуют за языковыми конструкциями, такими как if/foreach/for/array/list, или начинают арифметическое выражение. Они синтаксически неверны после "strings", предыдущих скобок (), одинокого $ и в некоторых типичных контекстах объявлений. Типичные ошибки:

    1. Выражения в параметрах объявленной функции

      function calcRating($value, $expires = time() + 90000) {
      

      Параметры в объявлении функции могут быть только литеральными значениями или константными выражениями. То есть выражение time() + 90000 нельзя использовать в качестве дефолтного значения параметра функциию. Тем не менее при вызове функции можно свободно использовать выражение:

      myFunction(1 + anotherFunc() * 2)
      
    2. Выражения в свойствах класса

      Как и ошибка выше, нельзя применять выражения для свойств класса, т.е.

      class xyz {                   
          var $default = someFunction("xyz_default");
      

      Если необходимо что-то вычислить, то данные вычисления/выражения стОит помеестить в конструктор класса.

      Единственное, PHP 7 позволяет написать public $property = 1 + 2 + 3;. Но это посзволительно, т.к., по сути, это выражение с константными значениями, не вычисляемое "на лету".

    3. isset(()), empty, key, next, current

      И isset() и empty() являются встроенными языковыми конструкциями языка, а не функциями, им необходим прямой доступ к переменной. Если вы непреднамеренно добавите слишком много скобок, то вы создадите доп. выражение:

                ⇓
      if (isset(($_GET["id"]))) {
      

      Для PHP <= 5.4 будет ошибка Parse error: syntax error, unexpected '('

      Для PHP <= 7.0 будет ошибка Fatal error: Cannot use isset() on the result of an expression

      Начиная с версии 7.0 - ошибки не будет


    Unexpected )

    1. Висячая запятая при вызове функции/метода

                    ⇓
      callfunc(1, 2, );
      

      В новых версиях языка позволены висячие запятые при нициализации массивов или списков (а также в объявлении функций/методов), но не при вызове функций/методов

    2. Незавершённые выражения

      Например если забыли в арифметическом выражении, то синтаксический анализатор сдается. Потому что он не знает как интерпретировать это:

                     ⇓
      $var = 2 * (1 + );
      

      Но если забыли закрывающую скобку вдобавок, то получите жалобу о неожиданной точке с запятой.

    3. Foreach as constant

      Если забыть добавить доллар к переменной:

                         ↓    ⇓
      foreach ($array as wrong) {
      

      PHP здесь иногда говорит, что вместо этого ожидался -> или ?->. Поскольку class->variable мог бы удовлетворить ожидаемому выражению.


    Unexpected {

    Фигурные скобки { и } окружают блоки кода. И синтаксические ошибки о них обычно указывают на какую-то неправильную вложенность.

    1. Unmatched subexpressions in an if (Несовпадающие подвыражения) в if

      Чаще всего несбалансированные ( и ) являются причиной, если парсер жалуется на открывающуюся фигурную скобку {, которая появляется слишком рано. Простой пример:

                                   ⇓
      if (($x == $y) && (2 == true) {
      

      Необходимо посчитать все открывающие и закрывающие скобки и сопоставить их количество. Также используйте IDE, которая помогает в этом и не пишите код без пробелов. Удобочитаемость имеет значение.

    2. { and } в выражениях

      Нельзя оборачивать выражения в скобки.

                 ⇓
      $var = 5 * {7 + $x};    
      

      Придётся выражение вынести в переменную и подставлять уже её:

      $expr = 7 + $x
      $var = 5 * $expr; 
      

    Unexpected }

    Когда получаете ошибку "unexpected }", чаще всего означает, что закрывали блок кода слишком рано.

    1. Последнее выражение в блоке и потеря точки с запятой

      function whatever() {
          doStuff()
      }            ⇧
      
    2. Недопустимая вложенность блоков/Forgotten { (забытая { )

      Блок кода был } закрыт слишком рано, или забыли открытую скобку {:

      function doStuff() {
          if (true)    ⇦
              print "yes";
          }
      }   ⇧
      

      В приведенном выше фрагменте if не было открывающей фигурной скобки {. Таким образом, закрывающая } ниже стала излишней. И поэтому следующая закрывающая }, предназначенная для функции, не была связана с исходной открывающей фигурной скобкой {.


    Unexpected {, expecting (

    Языковые конструкции, требующие условия/объявления и блока кода, вызовут эту ошибку.

    1. Список параметров функции/метода

                       ⇓  нет скобок и параметров
      function whatever {
      }
      
    2. Условные конструкции

        ⇓  нельзя писать if без какого-либо условия
      if {
      }
      

    То же самое для частых используемых конструкций: for/foreach, while/do, etc.

    Как минимум всегда смотрите документацию, чтобы сравнить, правильно ли вы пишите ne или иную конструкцию/функцию/метод/класс и т.д.

    • 3
  4. Алексей Шиманский
    2022-08-09T22:25:46Z2022-08-09T22:25:46Z

    意外的 T_CONSTANT_ENCAPSED_STRING

    Unexpected T_ENCAPSED_AND_WHITESPACE

    Предупреждения T_ENCAPSED… появляются в контексте строки с двойными кавычками, в то время как строки T_CONSTANT… часто возникают в простых выражениях или операторах PHP.

    Ошибки:

    1. Неправильная интерполяция переменных

      echo "Here comes a $wrong['array'] access";
      

      Ключи массива должны быть в кавычках. Но в строках с двойными кавычками (или HEREDOC) это не так. Парсер жалуется на содержащуюся в одинарных кавычках строку.

      Можно использовать PHP2-style для написания ключей мамссивов внутри строки

      echo "This is only $valid[here] ...";
      

      Но лучше изучить фигурный синтаксис и использовать его. Он позволяет писать ключи массива как обычно:

      echo "Use {$array['as_usual']} with curly syntax.";
      
    2. Отсутствует конкатенация

                            ⇓
      echo "Hello " . WORLD  " !";
      
    3. Отсутствует начальная кавычка

               ⇓
      make_url(login', 'open');
      
    4. Пропущена запятая в массиве

      array(               ⇓
           "key" => "value"
           "next" => "....",
      );
      
    5. Пропущена запятая в аргументах функции/метода

                                ⇓
      myfunc(123, "text", "and"   "more")
      
    6. Строка закрыта слишком поздно

                                      ⇓
      mysql_evil("SELECT * FROM stuffs);
      print "'ok'";
            ⇑
      
    7. Отступ в HEREDOC

      До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже вызовет ошибку

      $test = <<<HTML
             <link..>
         HTML;
      ⇑⇑⇑
      


    Unexpected $end

    Unexpected end of file

    Ошибка означает, что код закончился, в то время как парсер ожидает больше кода. (Сообщение немного вводит в заблуждение, если понимать его буквально. Речь идет не о переменной с именем «$end», как иногда предполагают новички. Оно относится к «концу файла»). Причина: несовпадение количества открывающих и закрывающих фигурных скобок.

    Почти всегда речь идет об отсутствующей закрывающей фигурной скобке } для закрытия предшествующих блоков кода. Это говорит о том, что синтаксический анализатор ожидает найти закрывающую скобку }, но на самом деле достиг конца файла.

    • Используйте правильные отступы, чтобы избежать таких проблем. И вообще, в принципе, используйте отступы и форматирование!
    • Используйте IDE с сопоставлением скобок, чтобы выяснить, где } была утеряна. Большинство IDE выделяют совпадающие фигурные скобки, квадратные скобки и круглые скобки. Что позволяет довольно легко проверить соответствие:

    在此处输入图像描述

    Отступ в HEREDOC

    До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже может вызывать ошибку

    $test = <<<HTML
            <link..>
        HTML;
    ⇑⇑⇑ 
    

    Заэкранированная кавычка

    Символ \ имеет особое значение. Часто символ \ применяют для экранирования в строках. Чтобы кавычка внутри строки, которая обёрнута в такие же кавычки, печаталась как есть, то её экранируют. Т.е. строка echo "Jim said \"Hello\""; выведет Jim said "hello". Если применить последовательность \", то она будет расценена как попытка экранирования кавычки. Поэтому строка ниже, выдаст ошибку

    "C:\xampp\htdocs\"
    

    правильно будет экранировать обратные слэши тоже:

    "C:\\xampp\\htdocs\\"
    

    С другой стороны, PHP обычно преобразует пути в стиле Unix (например, "C:/xampp/htdocs/") в правильный путь для Windows.

    Альтернативный синтаксис

    Несколько реже вы можете увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов/кодов в шаблонах. Используя if: и else: отсутствует endif;, например (т.е. закрывающий тег)



    Unexpected T_FUNCTION

    Может возникнуть например в версии PHP ниже 5.3.0, когда не было ещё анонимных функций. В некоторые функции, такие как array_map нужно было передать имя функции обработчика, например $range = array_map( "name_of_function_to_call", $myArray );. Так что минимум надо проверить версию PHP и проверить что именно на вход ожадает текущая функция. И принять решение: повысить версию PHP или переписать под старый стиль: создать отдельно функцию и во вторую передать имя первой.

    • 2
  5. Алексей Шиманский
    2022-08-10T22:33:33Z2022-08-10T22:33:33Z

    Unexpected [

    Часто возникает в старых версиях PHP. В версии PHP >= 5.4 стал возможен сокращённый синтаксис объявления массивов

    $php53 = array(1, 2, 3);  // Старый синтаксис
    $php54 = [1, 2, 3];       // Новый синтаксис PHP >= 5.4
             ⇑
    

    Разыменование массивов также с версии 5.4. Оно позволяет, например, сразу же обратиться к ключу массива, который вернула функция.

    function getData() {
        return ['first' => 1, 'second' => 2];
    }
    getData()['first'];
             ⇑  // До версии 5.4 это невозможно
             
    

    это же касается и встроенных функций, например explode и других, которые возвращают массив

    Обязательно проверьте версию PHP


    Другие варианты:

    • Нельзя в свойствах метода сразу внести данные в ячейку массива

      protected $var["x"] = "Nope";
                    ⇑⇑⇑⇑
      

      Если это необходимо - делайте это в конструкторе или каком-либо инициализирующием методе

    • Случайно опеатались и вместо другой скобки поставили квадратную

      foreach [$a as $b)
              ⇑  
      

      или даже

      function foobar[$a, $b, $c] {
                     ⇑
      
    • Вы пытаетесь использовать ключевое слово global для члена ассоциативного массива. Это недопустимый синтаксис:

      global $var['key'];
      

    Unexpected ]

    • Случайно опеатались и вместо другой скобки поставили квадратную

      foreach [$a as $b)
              ⇑  
      
    • Пытаетесь закончить массив там, где его нет:

      $var = 2];
      

      Часто это возникает во вложенных массивах

      $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                   ⇑
      

      Используйте IDE для сопоставления скобок и нормально форматируйте код %))

    • 1
  6. Алексей Шиманский
    2022-09-02T20:52:53Z2022-09-02T20:52:53Z

    Unexpected T_IF
    Unexpected T_FOREACH
    Unexpected T_FOR
    Unexpected T_WHILE
    Unexpected T_DO
    Unexpected T_ECHO

    Частые проблемы с операторами if, foreach, for, while, list, global, return, do, print, echo

    1. Точка с запятой не там

      Довольно часто пропущена точка с запятой в предыдущей строке

                   ⇓
      $x = myfunc()
      if (true) {
      
    2. Код в классе, находится вне методов

      class xyz {
          if (true) {}  <-- нельзя так! надо писать в методах!!!
          foreach ($var) {}  <-- нельзя так! надо писать в методах!!!
      
    3. Используются зарезервированные ключевые слова в качестве идентификаторов

      Нельзя использовать do, if и другие языковые конструкции в качестве имён функций/методов или имён классов.

    4. СтоИт точка с запятой вместо двоеточия (:) или фигурной скобки ({) после блока управления

      Управляющие структуры обычно заключены в фигурные скобки, но в альтернативном синтаксисе могут использоваться двоеточия. Если там случайно использовать точку с запятой, то преждевременно закрывается этот самый блок:

        foreach ($errors as $error); <-- должно быть  :  или  {
      


    Unexpected T_LNUMBER

    1. Недопустимые имена переменных

      Имена переменных не могут начинаться с цифры. Первый символ должен быть буквенным или символом подчеркивания.

       $1   // Плохо 
       $_1  // Хорошо
      

      *

      • Довольно часто появляется при использовании preg_replace-заполнителей "$1" но в контексте функций непосредственно PHP:

          #                         ↓            ⇓  ↓
          preg_replace("/#(\w+)/e",  strtopupper($1) )
        

        Там, где callback - должны были быть кавычки. Однако их пропустили (P.S. флаг /e устарел, но иногда он всё еще неправильно используется в preg_replace_callback)

      • Хотя токенизатор/парсер не допускает буквального $1 в качестве имени переменной, можно использовать ${1} или ${"1"}. Это синтаксический обходной путь для нестандартных идентификаторов. (Лучше думать об этом как о поиске в локальной области. Но в целом: для таких случаев предпочитайте простые массивы!)

    2. Обращение к нумерованному ключу объекта через стрелочку ->

      Обычно возникает в объектах типа stdClass Object, появляющиеся после json_decode без флага true

                  ↓
           $json->0->value
      

      Правильно будет:

                  ↓↓↓
           $json->{0}->value           
      
    3. Пропущены запятые в объявлении массивов

       #            ↓ ↓
       $xy = array(1 2 3);
      

      Или подобное, но в параметрах функции или конструкций:

      func(1, 2  3);`
                ^----
      
      function xy($z 2);
                    ^-----
      
      for ($i=2 3<$z)
               ^----
      

      Обычно один из знаков, таких как ; или , пропущен при разделении списка выражений.

    4. Ошибка расстановки кавычек, несовпадение кавычек

       #                 ↓ ↓          
       echo "<td colspan="3">something bad</td>";
      

      Подробно описано про кавычки в Unexpected T_STRING errors.

    5. Другие идентификаторы

      Ни функции, ни классы, ни пространства имен не могут начинаться с числа:

                ↓
       function 123shop() {
      
    • 1
  7. Алексей Шиманский
    2022-09-02T20:54:45Z2022-09-02T20:54:45Z

    Unexpected '?'

    Если вы пытаетесь использовать тег <?php внутри другого такого же тега <?php*

    $var = 'hello '<?php echo 'world'; ?>;
    

    * Для PHP версий 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1, 5.0.0 - 5.0.5, 4.4.2 - 4.4.9, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.34, 7.3.0 - 7.3.31, 7.4.0 - 7.4.24


    Если используется оператор null coalescing operator ?? в версиях PHP ниже, чем PHP 7

    <?= $a ?? 2; // Работает в PHP 7+
    <?= (!empty($a)) ? $a : 2; // Работает во всех версиях PHP
    

    Unexpected '?', expecting variable

    Аналогичная ошибка может возникнуть для типов, допускающих значение NULL, например:

    function add(?int $sum): ?int {
    

    Что снова указывает на то, что используется устаревшая версия PHP (то же касается CLI). Проверьте версию PHP через phpinfo();. Необходимо будет либо повысить версию, либо переписать код под старые версии, без использования нового синтаксиса



    Unexpected 'continue' (T_CONTINUE)

    Оператор continue используется только внутри циклических структур для пропуска оставшейся части текущей итерации цикла и, при соблюдении условий, начала следующей итерации. continue не возвращает значения Таким образом continue нельзя использовать в тернарном операторе или любом операторе, требующем возвращаемого значения (return).

    Unexpected 'break' (T_BREAK)

    То же самое касаестся break;. Нельзя использовать в выражениях (те, что могут вернуть значение). Используется внутри for, foreach, while, do-while или switch.

    Unexpected 'return' (T_RETURN)

    Если на предыдущих строках произошла синтакцическая ошибка, то при приходе к слову return будет подобная ошибка. Например:

    is ($value == null) { // Ожидалось что будет if    
        return $this->unban();
    }
    

    или

    mysql_query("INSERT INTO 'users' VALUES ('', '$email', '$name', '".md5 ($password)."')" 
                                                                                           ^^^ нет знаков  );
    return mysql_insert_id();   
    

    При данной ошибке ищите синтаксическую ошибку раньше указанного места в тексте ошибки, а не прямо на этой же строчке.



    Unexpected '='

    Может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны соответствовать следующим правилам:

    Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчёркивания и состоять из букв, цифр и символов подчёркивания в любом количестве. Это можно отобразить регулярным выражением: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

    Замечание: Под буквами здесь подразумеваются символы a-z, A-Z и байты от 128 до 255 (0x80-0xff).



    Unexpected T_PAAMAYIM_NEKUDOTAYIM

    T_PAAMAYIM_NEKUDOTAYIM - это наименование для двойного двоеточия :: на иврите ¯\_(ツ)_/¯

    Происходит использование двойного двоеточия, вместо стрелочки объекта (статический вызов, вместо вызова метода в нестатическом контексте).

    Например в коде указано $cnf::getConfig($key);, а должно быть $cnf->getConfig($key);

    Это было возможно в ранних версиях. Возможно ошибка появилась после переноса куда-либо (например нахостинг). Поэтому проверьте версию PHP и либо установится такую же версию, на которой было разработано приложение, либо измените вызов свойства/метода на вызов их не в статическом виде



    Unexpected T_OBJECT_OPERATOR

    1. В очень старых версиях PHP (4) нельзя делать "method chaining", т.е. консрукция ниже не сработает

      $item->get_enclosure()->get_link()
      
    2. В версиях ниже *PHP 5.4* нельзя вызвать метод у только что созданного объекта

      $purchaseOrder = (new PurchaseOrderFactory)->instance();
      

      можно вначале создать объект, а только потом вызвать у него метод:

      $purchaseFactory = new PurchaseOrderFactory;
      $purchaseOrder = $purchaseFactory->instance();  
      

      Также нужно обратить внимание на круглые скобки, писать new PurchaseOrderFactory->instance(); нельзя, это невалидно!

    3. Пропущен знак доллара у переменной.

      Например написано mysqli->query, а должно быть $mysqli->query или написано this->transform($lessons) а должно быть $this->transform($lessons)



    Unexpected T_DOUBLE_ARROW

    Причины:

    1. Использование `=>` при описании массива, но при этом ключевое слово объявления массива было забыто:

      $statement->execute( ':login'=>$_POST['email'] );
      

      должно быть

      $statement->execute(array(':login' => $_POST['email']));
      
    2. Пропущена запятая перед объявлением массива

      Route::post('/updateaccount'[
                                 ⇑  
          'uses' => 'UserController@postSaveAccount',
          'as' => 'account.save'
      ]);
      

      должно быть

      Route::post('/updateaccount', [  
                                  ⇑    
          'uses' => 'UserController@postSaveAccount',
          'as' => 'account.save'
      ]);
      
    3. Пропущена какой-то закрывающий элемент в пересислении массива

      $saveData = array(
          'mid' => $this->_saveAsUserId,        
          'post_name' => slug($thisShow['title'],
                                                ⇑   Пропущена закрывающая скобка функции slug        
          'post_content' => $thisShow['content'],        
      );
      


    Unexpected T_BOOLEAN_OR Unexpected T_BOOLEAN_AND

    Возникают, как правило, вследствие несовпадения открывающих и закрывающих круглых скобок. Пример

    if(is_file($filechk1) && (is_file($filechk2))) || (is_file($dirchk1) && (is_file($dirchk2))){
                                                 ⇑
        ...
    }
    

    или

    if ($args == !empty && $command != 'reload'){
                 ^^^^^^ Невалидно. должно быть `!empty($args)`
    }
    

    или

    if(isset($_GET['test'] && strcmp($_GET['test'],'test') == 0)
                         ⇑
                         
    

    解决方案:检查所有代码是否匹配括号!如有必要,然后将复杂的结构移动到单独的变量中,以免混淆并使用它们。例子

    if (IS_REGISTRATOR() && (($params.status === 'W' || $params.status === 'D' || $params.status === 'A') && $params.remark && (($params.subres_level == 0 && ($user_info->selected_title->tid == $params.boss || $user_info->selected_title->tid == $doc_signer_tid || !$params.usertid) || $params.subres_level > 0 && $user_info->selected_title->tid == $params.usertid))) { ... }                       
    

    这段代码会更容易阅读,如下所示:

    $docIsInWorkAcceptOrDraft = ...;
    $bossHasSignerPriviledge = ...;
    $userCanSign = ...;
    
    if ($docIsInWorkAcceptOrDraft && $bossHasSignerPriviledge && $userCanSign) {
      // ...
    }   
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5