Что это значит? "Ошибка разбора: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM"

T_PAAMAYIM_NEKUDOTAYIM звучит очень экзотично, но, безусловно, для меня это абсолютно чушь. Я проследил все это до следующих строк кода:

<?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();
    }
}
?>

В конструкторе я создаю объект Config. Вот класс:

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;
    }
}

Не знаю, почему это не работает / что означает ошибка...

7 ответов

Решение

T_PAAMAYIM_NEKUDOTAYIM - это разрешение области видимости двойного двоеточия, которое PHP использует -::

Быстрый взгляд на ваш код, я думаю, что эта строка:

return $cnf::getConfig($key);

должно быть

return $cnf->getConfig($key);

Первый - это способ статического вызова метода - этот код был бы действительным, если бы $cnf содержал строку, которая также была допустимым классом. Синтаксис -> предназначен для вызова метода в экземпляре класса / объекта.

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

Это правильный синтаксис для PHP 5.3, например, если вы вызываете статический метод из имени класса:

MyClassName::getConfig($key);

Если вы ранее присвоили ClassName переменной $ cnf, вы можете вызвать из нее статический метод (мы говорим о PHP 5.3):

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

Однако этот синтаксис не работает на PHP 5.2 или ниже, и вам нужно использовать следующее:

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

Надеюсь, что это помогает людям, имеющим эту ошибку в версии 5.2 (не знаю, была ли это версия openfrog).

В вашем примере

return $cnf::getConfig($key)

Наверное, должно быть:

return $cnf->getConfig($key)

И сделать getConfig не статичным

Если вам все еще нужно использовать двойное двоеточие, убедитесь, что вы используете PHP 5.3+

Ошибка связана с "нецелевым использованием" оператора с двойным двоеточием:

return $cnf::getConfig($key);

как с помощью :: Вы пытаетесь вызвать статический метод самого класса. В вашем примере вы хотите вызвать нестатический метод для экземпляра объекта.

Я думаю, что вы хотите, это:

return $cnf->getConfig($key);

Это имя для :: оператор

Википедия

Согласно википедии, это означает оператор разрешения области видимости "двойное двоеточие".

http://en.wikipedia.org/wiki/Scope_resolution_operator

Для всех, кто использует Laravel. У меня была такая же ошибка на Laravel 7.0. Ошибка выглядела так

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

Это было в моем файле Routes\web.php, который выглядел так

use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
use // this was an extra **use** statement that gave me the error

Route::get('/', function () {
    return view('save-online.index');
})->name('save-online.index');
Другие вопросы по тегам