Могут ли магические константы быть импортированы в PHP - PullRequest
0 голосов
/ 08 июля 2019

Я не могу найти подсказки о том, что я не могу импортировать магические константы.

Пытаться понравиться ...

<?php declare( strict_types = 1 );
namespace CodeKandis\MyVendor;

use function dirname;
use const __DIR__;

require_once dirname( __DIR__ ) . '/vendor/autoload.php';

... приводит к

Parse error: syntax error, unexpected '__DIR__' (T_DIR), expecting identifier (T_STRING) or \\ (T_NS_SEPARATOR) in /public/index.php on line 5

Этот вопрос важен, пока PHPStorm автоматически импортирует магические константы.И если это невозможно, об этом нужно сообщить и исправить.


Редактировать (2019-07-25)

После я открыл проблему это будет исправлено в PHPStorm 2019.3.

1 Ответ

2 голосов
/ 08 июля 2019

В PHP только OOP (классы, интерфейсы, исключения, ошибки ...) должны быть полностью квалифицированными. Если вы не укажете полное имя или не импортируете класс в другое пространство имен, PHP не будет возвращаться к глобальному пространству имен для его поиска.

Вы также можете использовать полностью определенные функции или константы. Функции могут принадлежать пространству имен, и фактически все основные функции принадлежат глобальному пространству имен, т.е. \. Сначала PHP будет искать функцию в текущем пространстве имен, и it будет возвращаться к глобальным функциям или константам, если функция или константа пространства имен не существует. Вы можете выполнить микрооптимизацию, если вы указываете глобальное пространство имен явно, потому что PHP будет смотреть в глобальном пространстве имен напрямую.

namespace A {
    function phpinfo(){
        echo 'I am bogus';
    }
    phpinfo(); // vs. \phpinfo()
}

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

namespace A {
    echo \__LINE__;
}

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

Существуют также другие вещи, которые нельзя импортировать или использовать пространства имен, см .: Список ключевых слов .

Вы не можете использовать любое из следующих слов в качестве констант, имен классов, функций или методов.

namespace A {
    \echo 'hi'; // <-- this line is invalid code
    \die(1); // neither is this, even if it looks and behaves like a function
}

Некоторые люди смущенно ставят скобки после echo или print, рассматривая их как функции, но на самом деле это не так. Те, что указаны в скобках, ведут себя как функции, принимающие параметры, но вы не можете их импортировать.

...