Syntax error unexpected expecting t paamayim nekudotayim

T_PAAMAYIM_NEKUDOTAYIM sounds really exotic, but most certainly absolutely nonsense to me. I traced it all down to this lines of code: <?php Class Context { protected $config; public

T_PAAMAYIM_NEKUDOTAYIM sounds really exotic, but most certainly absolutely nonsense to me. I traced it all down to this lines of code:

<?php
Class Context {
    protected $config;

    public function getConfig($key) { // Here's the problem somewhere...
    $cnf = $this->config;
    return $cnf::getConfig($key);
    }

    function __construct() {
    $this->config = new Config();
    }
}
?>

In the constructor I create a Config object. Here’s the class:

final class Config {
    private static $instance = NULL;
    private static $config;

    public static function getConfig($key) {
    return self::$config[$key];
    }

    public static function getInstance() {
    if (!self::$instance) {
        self::$instance = new Config();
    }
    return self::$instance;
    }

    private function __construct() {
    // include configuration file
    include __ROOT_INCLUDE_PATH . '/sys/config/config.php'; // defines a $config array
    $this->config = $config;
    }
}

No idea why this doesnt work / what the error means…

asked Dec 27, 2009 at 14:02

openfrog's user avatar

1

T_PAAMAYIM_NEKUDOTAYIM is the double colon scope resolution thingy PHP uses — ::

Quick glance at your code, I think this line:

return $cnf::getConfig($key);

should be

return $cnf->getConfig($key);

The first is the way to call a method statically — this code would be valid if $cnf contained a string that was also a valid class. The -> syntax is for calling a method on an instance of a class/object.

answered Dec 27, 2009 at 14:05

benlumley's user avatar

benlumleybenlumley

11.3k2 gold badges39 silver badges39 bronze badges

10

Just my two cents for future visitors who have this problem.

This is the correct syntax for PHP 5.3, for example if you call static method from the class name:

MyClassName::getConfig($key);

If you previously assign the ClassName to the $cnf variable, you can call the static method from it (we are talking about PHP 5.3):

$cnf = MyClassName;
$cnf::getConfig($key);

However, this sintax doesn’t work on PHP 5.2 or lower, and you need to use the following:

$cnf = MyClassName;
call_user_func(array($cnf, "getConfig", $key, ...otherposibleadditionalparameters... ));

Hope this helps people having this error in 5.2 version (don’t know if this was openfrog’s version).

kontur's user avatar

kontur

4,7821 gold badge36 silver badges61 bronze badges

answered Jun 27, 2013 at 2:07

tomasofen's user avatar

tomasofentomasofen

1,3212 gold badges12 silver badges16 bronze badges

In your example

return $cnf::getConfig($key)

Probably should be:

return $cnf->getConfig($key)

And make getConfig not static

answered Dec 27, 2009 at 14:07

Question Mark's user avatar

Question MarkQuestion Mark

3,5671 gold badge24 silver badges30 bronze badges

if you still need to use the double-colon then make sure your on PHP 5.3+

answered Aug 19, 2013 at 18:31

Justin T. Watts's user avatar

Justin T. WattsJustin T. Watts

5271 gold badge4 silver badges16 bronze badges

1

The error is down to an «inappropriate use» of the double colon operator:

return $cnf::getConfig($key);

as by using the :: you’re attempting to call a static method of the class itself. In your example you want to call a non-static method on an instantiated object.

I think what you want is:

return $cnf->getConfig($key);

answered Dec 27, 2009 at 14:06

richsage's user avatar

richsagerichsage

26.8k8 gold badges57 silver badges65 bronze badges

1

It’s the name for the :: operator

Wikipedia

answered Dec 27, 2009 at 14:06

schnaader's user avatar

schnaaderschnaader

48.7k10 gold badges105 silver badges136 bronze badges

For anyone using Laravel. I was having the same error on Laravel 7.0. The error looked like this

syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting ';' or ','

It was in my Routesweb.php file, which looked like this

use IlluminateSupportFacadesRoute;
use IlluminateHttpRequest;
use // this was an extra **use** statement that gave me the error

Route::get('/', function () {
    return view('save-online.index');
})->name('save-online.index');

Dharman's user avatar

Dharman

29.3k21 gold badges80 silver badges131 bronze badges

answered Sep 29, 2020 at 11:53

Huzaifa's user avatar

HuzaifaHuzaifa

3474 silver badges15 bronze badges

Does anyone have a T_PAAMAYIM_NEKUDOTAYIM?

John Slegers's user avatar

John Slegers

44k22 gold badges200 silver badges168 bronze badges

asked Feb 26, 2009 at 20:34

Peter Turner's user avatar

Peter TurnerPeter Turner

11.1k9 gold badges68 silver badges108 bronze badges

2

It’s Hebrew for «double colon».

Cody Gray's user avatar

Cody Gray

236k50 gold badges486 silver badges567 bronze badges

answered Feb 26, 2009 at 20:37

patricksweeney's user avatar

patricksweeneypatricksweeney

3,8907 gold badges43 silver badges54 bronze badges

2

It’s a name for the :: operator in PHP. It literally means «double colon». For some reason they named it in Hebrew. Check your code syntax, and put a :: where appropriate :-)

Peter Mortensen's user avatar

answered Feb 26, 2009 at 20:37

Ilya Birman's user avatar

Ilya BirmanIlya Birman

9,6143 gold badges26 silver badges31 bronze badges

4

From Wikipedia:

In PHP, the scope resolution operator is also called Paamayim
Nekudotayim (Hebrew: פעמיים נקודתיים‎), which means “double colon” in
Hebrew.

The name «Paamayim Nekudotayim» was introduced in the
Israeli-developed Zend Engine 0.5 used in PHP 3. Although it has been
confusing to many developers who do not speak Hebrew, it is still
being used in PHP 5, as in this sample error message:

$ php -r :: Parse error: syntax error, unexpected
T_PAAMAYIM_NEKUDOTAYIM

As of PHP 5.4, error messages concerning the scope resolution operator
still include this name, but have clarified its meaning somewhat:

$ php -r :: Parse error: syntax error, unexpected ‘::’
(T_PAAMAYIM_NEKUDOTAYIM)

From the official PHP documentation:

The Scope Resolution Operator (also called Paamayim Nekudotayim) or in
simpler terms, the double colon, is a token that allows access to
static, constant, and overridden properties or methods of a class.

When referencing these items from outside the class definition, use
the name of the class.

As of PHP 5.3.0, it’s possible to reference the class using a
variable. The variable’s value can not be a keyword (e.g. self, parent
and static).

Paamayim Nekudotayim would, at first, seem like a strange choice for
naming a double-colon. However, while writing the Zend Engine 0.5
(which powers PHP 3), that’s what the Zend team decided to call it. It
actually does mean double-colon — in Hebrew!

answered Mar 13, 2014 at 20:52

John Slegers's user avatar

John SlegersJohn Slegers

44k22 gold badges200 silver badges168 bronze badges

1

I know Hebrew pretty well, so to clarify the name «Paamayim Nekudotayim» for you, the paraphrased meaning is «double colon», but translated literally:

  • «Paamayim» means «two» or «twice»
  • «Nekudotayim» means «dots» (lit. «holes»)
    • In the Hebrew language, a nekuda means a dot.
    • The plural is nekudot, i.e, dots, which function as vowels
    • The reason it why it’s called Nekudo-tayim is because the suffix «-ayim» also means «two» or «twice», thus :: denotes «two times, two dots», or more commonly known as the Scope Resolution Operator.

answered Dec 10, 2019 at 3:26

Sapphire_Brick's user avatar

6

This is also coming when you apply a constant in PHP to the empty() function:

if (!empty(SOME_CONSTANT)) {

}

That was my case. I solved it by using this:

$string = SOME_CONSTANT;
if (!empty($string)) {

}

Peter Mortensen's user avatar

answered Nov 21, 2014 at 21:19

Harman's user avatar

HarmanHarman

5393 silver badges16 bronze badges

4

Edit: Unfortunately, as of PHP 8.0, the answer is not «No, not anymore». This RFC was not accepted as I hoped, proposing to change T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON; but it was declined.

Note: I keep this answer for historical purposes. Actually, because of the creation of the RFC and the votes ratio at some point, I created this answer. Also, I keep this for hoping it to be accepted in the near future.

answered Jun 26, 2020 at 8:37

MAChitgarha's user avatar

MAChitgarhaMAChitgarha

3,4562 gold badges33 silver badges39 bronze badges

0

This can happen on foreachs when using:

foreach( $array as $key = $value )

instead of

foreach( $array as $key => $value )

answered Oct 8, 2018 at 9:21

GDY's user avatar

GDYGDY

2,8451 gold badge23 silver badges44 bronze badges

1

For me this happened within a class function.

In PHP 5.3 and above $this::$defaults worked fine; when I swapped the code into a server that for whatever reason had a lower version number it threw this error.

The solution, in my case, was to use the keyword self instead of $this:

self::$defaults works just fine.

answered Jul 12, 2016 at 5:29

bozdoz's user avatar

bozdozbozdoz

12.2k7 gold badges65 silver badges95 bronze badges

0

This just happened to me in a string assignment using double quotes. I was missing a closing curly on a POST variable…

"for {$_POST['txtName'] on $date";

should have been

"for {$_POST['txtName']} on $date";

I can’t explain why. I mean, I see the error that would break the code but I don’t see why it references a class error.

answered Sep 25, 2020 at 10:17

Mark Cicchetti's user avatar

This just happened to me in a foreach loop. I had inadvertently typed ($array as $key as $value) and PHP objected to the first as.

Chris Dueck's user avatar

answered Dec 9, 2020 at 10:17

Thomas Murphy's user avatar

php

  • PHP

Интерпретатор php5.2 жалуется Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting T_VARIABLE

public function delete(){
		if(intval($this->curFieldValue['id']))
			static::delID($this->curFieldValue['id']);
	}

на строчку
static::delID($this->curFieldValue['id']);
На php 5.3 всё работает. Как исправить?


  • Вопрос задан

    более трёх лет назад

  • 5006 просмотров


Комментировать


Решения вопроса 1

«Да хоть говнокод»? Лехко!

class BaseClass {
  public static function base_create($class, $params = array()) {
    return new $class($params);
  }
}
class OtherClass extends BaseClass {
  public static function create($params = array()) {
    return self::base_create(__CLASS__, $params);
  }
}

Но лучше обновите пхп. И не используйте статические члены класса


Комментировать

Пригласить эксперта


Ответы на вопрос 2

pavel_salauyou

никак в php 5.2 нет такой конструкции, используйте self::

  • Дочерние классы переопределяют статические методы. Проблем не будет?

  • pavel_salauyou

    незнаю, надо проверить, я вашего кода не вижу.

  • Не работает. Есть куски такого рода:
    public static function who(){
    return __CLASS__;
    }
    static public function create($params = array()){
    $class = static::who();
    return new $class($params);
    }
    Метод who() переопределён в дочерних классах.

  • Как и многие статические константы

  • pavel_salauyou

    это новая фича php 5.3, её просто нет в 5.2 и соответсвенно, без говнокода не сделаешь, думаю проще обновить php)

  • Неужели нету какого-то решения? Может и говно код, но «популярный»(аля патерн), или что либо. Не верю, что все существующие проекты на PHP5.2 проектировались без переопределения статических методов и переменных.

  • pavel_salauyou

    ну это решение не пятиминутное, смотрите исходный код популярных фреймворков, только старых. yii1, zend1, наверно там должно быть

  • facepalm… спасибо, может кто ответит ещё.

Проблема называется «позднее статическое связывание», как в php 5.2 обходились без static;:?

  • Akdmeh

    Как это часто бывает в PHP — костылями.


Похожие вопросы


  • Показать ещё
    Загружается…

12 февр. 2023, в 22:43

5000 руб./за проект

09 февр. 2023, в 13:28

777 руб./за проект

12 февр. 2023, в 21:32

80000 руб./за проект

Минуточку внимания

Общее о синтаксических ошибках


### Заметка:

  1. Если ваш браузер отображает сообщения об ошибках, такие как «SyntaxError: illegal character», то это на самом деле связано не с PHP, а с Javascript и синтаксическими ошибками в нём

  2. Синтаксические ошибки, возникающие в коде vendor: если синтаксическая ошибка возникла после установки или обновления пакета vendor’а — это может быть связано с несовместимостью версии PHP, поэтому проверьте версию vendor’а.
    и требования к настройке вашей платформы.

  3. Используйте IDE, например PHPStorm, который всегда подскажет, что с кодом что-то не так. Обращайте внимание на подсказки:

    введите сюда описание изображения

    введите сюда описание изображения

  4. Иногда возникают ошибки из-за лишних символов в начале файла, в частности BOM. Убедитесь, что файл сохранён в UTF-8 без BOM. (если нужен именно utf8)

  5. Если ваш веб-сайт просто пустой с белым экраном, то, как правило, причиной является синтаксическая ошибка. Включите их отображение с помощью этой инструкции

### Как интерпретировать ошибки парсера

Типичное сообщение об ошибке синтаксиса:

Parse error: syntax error, unexpected T_STRING, expecting ; in file.php on line 217

(Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_STRING, ожидалось ; в файле file.php в строке 217)

Тут указано возможное место синтаксической ошибки. См. упомянутые имя файла и номер строки.

Токен, такой как T_STRING, объясняет, какой символ синтаксический анализатор/токенизатор не смог окончательно обработать. Однако это не обязательно является причиной синтаксической ошибки. Поэтому важно изучить предыдущие строки кода. Часто синтаксические ошибки — это ошибки, произошедшие ранее. Номер строки ошибки — это именно то место, где синтаксический анализатор окончательно отказался от обработки всего этого, а не точная линия ошибки

→ Ссылка

Автор решения: Алексей Шиманский

Unexpected T_STRING

Unexpected identifier «xxx»

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

  1. Строки с неверными кавычками

    Любая неэкранированная и случайная кавычка " или ' образует недопустимое выражение.

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

    В данном примере используются двойные кавычки в двойных. Это неверно. Интерпретатор «увидит» строку "<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;
    

    Нужно взять другой текстовый редактор. Или даже hexeditor. То, что здесь выглядит как простые пробелы и символы новой строки, может содержать невидимые константы. Такое бывает в документах с кодировкой UTF-8 BOM и нужно сделать кодировку UTF-8 без BOM

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

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

    "C:xampphtdocs"
    

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

    "C:\xampp\htdocs\"
    


Unexpected T_VARIABLE

Unexpected ‘$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. Необходимы скобки для замыканий (closure)

                   ⇓
    function() use $var {}
    

    Переменные, которые передаются в замыкания всегда надо оборачивать в круглые скобки

  10. Невидимые пробелы

    Как отмечалось ранее. Могут быть невидимые символы. Проверьте на их наличие (читайте выше ошибки Unexpected T_STRING)

→ Ссылка

Автор решения: Алексей Шиманский

Unexpected 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:xampphtdocs"

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

"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 или переписать под старый стиль: создать отдельно функцию и во вторую передать имя первой.

→ Ссылка

Автор решения: Алексей Шиманский

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 или иную конструкцию/функцию/метод/класс и т.д.

→ Ссылка

Автор решения: Алексей Шиманский

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 для сопоставления скобок и нормально форматируйте код %))

→ Ссылка

Автор решения: Алексей Шиманский

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() {
    

→ Ссылка

Автор решения: Алексей Шиманский

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' => '[email protected]',
        'as' => 'account.save'
    ]);
    

    должно быть

    Route::post('/updateaccount', [  
                                ⇑    
        'uses' => '[email protected]',
        '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) {
  // ...
}   

→ Ссылка

Автор решения: Алексей Шиманский

Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Unexpected T_IS_IDENTICAL
Unexpected T_IS_NOT_EQUAL
Unexpected T_IS_NOT_IDENTICAL
Unexpected T_IS_SMALLER_OR_EQUAL
Unexpected <
Unexpected >

Операторы сравнения, такие как ==, >=, ===, !=, <>, !== and <= or < and > в основном должны использоваться только в выражениях, таких как if. Если синтаксический анализатор жалуется на них, то это часто означает несовпадение в парах скобок, несоответствие скобок ( ) вокруг выражений.

  1. Группировка в выражениях

    В частности, для операторов if с множественными сравнениями, вы должны позаботиться о правильном подсчете открывающих и закрывающих скобок (!!!):

                            ⇓
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          ↑
    

    Здесь условие if случайно завершено скобкой ) и дальше парсер не понимает что происходит

  2. Смешивание isset()/empty() и сравнения

                           ⇓  пропущена закрывающая скобка
    if (empty($_POST["var"] == 1)) {
    

    Или:

                       ⇓
    if (isset($variable !== "value")) {
    

    Это не имеет смысла для PHP, потому что isset и empty — языковые конструкции, которые принимают только имена переменных. Также не имеет смысла сравнивать результат этих конструкций с чем-либо, потому что результат этих конструкций — логический.

  3. Путаница >= больше или равно с оператором массива =>

    Оба оператора выглядят примерно одинаково, поэтому их иногда путают:

             ⇓
    if ($var => 5) { ... }
    

    Нужно помнить, что этот оператор сравнения называется «больше, чем или равно» (greater than or equal), чтобы все было правильно.

  4. Не с чем сравнивать

    Нельзя объединить два сравнения, если они относятся к одной и той же переменной:

                   ⇓
    if ($xyz > 5 && < 100)
    

    Необходимо каждый раз сравнивать значение переменной:

    if ($xyz > 5 && $xyz < 100)
    
  5. Цепочки сравнения

    Также нельзя сравнивать значение переменной одновременно с несколькими значениями. В математике, например, конструкция ниже позволена:

                       ⇓
     $result = (5 < $x < 10);
    

    Однако в PHP такое не допустимо. Следует, как указано выше, сравнивать значение каждый раз, т.е.

     $result = ($x > 5 && $x < 10);
    
  6. Unexpected >
    Unexpected <

    Операторы больше > или меньше < не имеют пользовательского имени токенизатора T_XXX. Чаще всего ошибка возникает, когда не так расставлены кавычки в HTML коде:

                            ⇓
    print "<a href='z">Hello</a>";
                     ↑
    

    В текущем случае получается, что строка сравнивается через > с константой Hello и затем происходит ещё одно сравнение с помощью <. По крайней мере, так это видит PHP. Настоящей причиной и синтаксической ошибкой было преждевременное завершение строки.

    Вложенные теги также вызывают ошибку::

    <?php echo <?php my_func(); ?>
               ↑
    

→ Ссылка

Автор решения: Алексей Шиманский

Unexpected ‘public’ (T_PUBLIC)
Unexpected ‘private’ (T_PRIVATE)
Unexpected ‘protected’ (T_PROTECTED)
Unexpected ‘final’ (T_FINAL)

Ключевые слова public/private/protected/final можно использовать только внутри класса в качестве модификатора для свойств или методов. Ключевое слово final может применяться ещё и для обозначения самого класса как финального.

Ошибка может заключаться в применении этих слов для простых функций вне класса, например

<?php 

public function echoTest() {    
    echo 'test';
}

Это неправильно! Нужно использовать только в классах!

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

→ Ссылка

Автор решения: Алексей Шиманский

Unexpected T_STATIC

Может возникать в классе, когда используется позднее статическое связывание через ключевое слово static

class Employee {
    public static $favSport = "Football";

    public static function watchTV() {
        echo "Watching ".static::$favSport;
    }
}

Частой причиной может быть рання версия языка. Ключевое слово появилось в версии 5.3. Возможно у вас стоИт более ранняя версия.

Также если в классе static применяется в качестве возвращаемого значения:

 public function setDefault(string $option, mixed $value): static 
 

Данное возвращаемое значение можно использовать в языке в версии 8.0+. Проверьте свою версию PHP



Unexpected T_CLASS

Может возникать в классе, когда используется позднее статическое связывание через ключевое слово [::class](https://www.php.net/manual/ru/language.oop5.basic.php#language.oop5.basic.class.class)

$kernel = $app->make(IlluminateContractsHttpKernel::class);

Частой причиной может быть рання версия языка. Ключевое слово появилось в версии 5.5. Возможно у вас стоИт более ранняя версия.

Ещё может быть случайно строка представлена константой. Пример:

$host=""MyHost"";

Тут ошибка заключается в том, что вместо того, чтобы написать одну двойнуй кавычку слева и одну справа, двойные кавычки написаны по две штуки. В итоге получается слева пустая строка и справа, а host это какая-то константа, воспринимаемая как указание на какой-то класс



Unexpected ‘use’ (T_USE)

Может возникать в классе, когда используется ключевое слово use используется для импорта класса, но используется оно не до объявления класса/функции, а внутри него. Пример:

function test() {
    use CoinbaseWalletClient;
    use CoinbaseWalletConfiguration;
    
    ...
}

Все импорты классов должны быть в самом начале файла:

<?php 

use CoinbaseWalletClient;
use CoinbaseWalletConfiguration;

class Test {
    function test() {       
        ...
        ...
    }
}

Исключение составляют трейты, которые могут использовать use внутри класса для импорта трейта (см. документацию)


Ещё проблема может возникать при использовании use для именованных функций. Это неверно! Оно может использоваться только для анонимных функций. Пример:

// НЕВЕРНО!!!
function checkValue($arrPostKey, $value) use ($errors) {
                                         ^^^^
    ...
};

// ВЕРНО
$checkValue = function($arrPostKey, $value) use (&$errors) {
    ...
}

Ещё одна проблема: в перечислении импортов сверху класса была забыта точка с запятой:

use IlluminateHttpRequest;
use Auth;
use AppTask   <-----
use AppProject;    


Unexpected T_DNUMBER

Частая проблема: использовать данные как есть, вместо оборачивания их как строки. Пример:

// НЕВЕРНО
$this->Server = mysql3.000webhost.com;  // как итог: видим 3.000 ... на что и ругается парсер.

// ВЕРНО
$this->Server = 'mysql3.000webhost.com';
                ^---                  ^---

→ Ссылка

  • #1

Код

Код:

foreach ($_COOKIE['item'] as $key => NULL)

вызывает

Код:

Parse error: syntax error, unexpected ')', expecting T_PAAMAYIM_NEKUDOTAYIM in Z:homeshopwwwindex.php on line 548

Кто-нибудь видел в лицо T_PAAMAYIM_NEKUDOTAYIM? :eek:

  • #2

Праведный гнев! Это все евреи (виноваты).

флоппик

флоппик

promotor fidei

Команда форума

Партнер клуба


c0dex

c0dex

web.dev 2002-…

Команда форума

Партнер клуба


zerkms

zerkms

TDD infected

Команда форума


  • #7

Это не оно :)

Активист


  • #8

> T_PAAMAYIM_NEKUDOTAYIM
А читать как?) (индуский?)

Активист


  • #9

А не, евреи)) Двойное двоеточие в переводе))))

Понравилась статья? Поделить с друзьями:
  • Syntax error unexpected end of file yii2
  • Syntax error unexpected end of file prolog
  • Syntax error unexpected end of file laravel
  • String index out of range python как исправить
  • Street power football не удалось подключиться к сети как исправить