Замена ::class в PHP 5.4

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

Теперь я протестировал его на локальном компьютере с PHP 5.5 (в подсистеме Linux для Windows 10), на личном сервере с PHP 5.6, но рабочий сервер работает под управлением PHP 5.4, что может не может быть повышен по причинам.

Сначала у меня была эта ошибка:

Parse error: syntax error, unexpected 'class' (t_class), expecting identifier (t_string) in …

В поисках решений я нажал этот вопрос, поэтому я зашел в код пакета и нашел следующий фрагмент:

protected static $classmap = [
    'getTransactionResult' => getTransactionResult::class,
    'getTransactionResultResponse' => getTransactionResultResponse::class,
    'transactionResultOutput' => transactionResultOutput::class,
    'cardDetail' => cardDetail::class,
    'wsTransactionDetailOutput' => wsTransactionDetailOutput::class,
    'wsTransactionDetail' => wsTransactionDetail::class,
    'acknowledgeTransaction' => acknowledgeTransaction::class,
    'acknowledgeTransactionResponse' => acknowledgeTransactionResponse::class,
    'initTransaction' => initTransaction::class,
    'wsInitTransactionInput' => wsInitTransactionInput::class,
    'wpmDetailInput' => wpmDetailInput::class,
    'initTransactionResponse' => initTransactionResponse::class,
    'wsInitTransactionOutput' => wsInitTransactionOutput::class
];

Я обнаружил, что определение ::class несовместимо с PHP 5.4, и при попытке сделать что предложил ответ на вопрос, у меня были результаты в этом комментарии к этому ответу.

Итак, до сих пор я прокомментировал строки с проблемами (оба являются arrays, содержащими эти ::class определения), протестировано на рабочем сервере и работает до сих пор. Но я хочу знать, есть ли реальная замена этому определению ::class.

Важное примечание. В примерах, которые я видел в Интернете, говорится о get_class('ClassName'), относящемся к ClassName::class, но не о classMethod::class случаях. Я также столкнулся с этот вопрос, но пример, приведенный в ответе, не дает мне понять, как его использовать.


person noquierouser    schedule 31.08.2016    source источник
comment
Версия PHP 5.4 устарела почти год назад. Теперь запуск в производственной среде опасно небезопасен. Обновить. php.net/eol.php   -  person ceejayoz    schedule 31.08.2016
comment
Вы используете неподдерживаемую устаревающую версию PHP. К сожалению, это означает, что вы страдаете от недостатка поддержки. Наилучшее возможное решение вашей проблемы — обновить PHP или использовать библиотеку, поддерживающую PHP 5.4. На самом деле здесь никто ничего не может сделать для вас, кроме как сказать вам это.   -  person Sherif    schedule 31.08.2016
comment
@ceejayoz Спасибо за быстрый совет, но это то, что я и системный администратор уже знаем. Пока что я, как разработчик, мало что могу с этим поделать, потому что на устаревшем сервере работает слишком много устаревших скриптов. Есть планы на новый рабочий сервер, но в ближайших планах его нет.   -  person noquierouser    schedule 01.09.2016
comment
Я хотел бы отметить, что PHP 5.4 по-прежнему является основной версией, предоставляемой RHEL/CentOS, и они поддерживают исправления безопасности и поддерживают свою версию. Я удивлен, что люди слепо советуют переходить на версии, которые не поддерживаются производителем, ссылаясь на безопасность. На самом деле это совсем наоборот: у поставщика, такого как RedHat, есть бюджет и команда, обеспечивающая резервное копирование исправлений безопасности, в то время как большинство сторонних репозиториев просто создают последнюю версию и не оценивают и не устраняют риски безопасности.   -  person galaxy    schedule 12.05.2019


Ответы (2)


::class вернуть полное пространство имен для этого класса. Вместо этого вы можете написать полное пространство имен. В некоторых новых пакетах гораздо лучше дать пространство имен классу и создать экземпляр в этом классе, если вам это нужно. ::class намного короче и гораздо удобнее.

Например:

protected static $classmap = [
    'getTransactionResult' => 'Namespace\of\the\class',
]

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

person René Höhle    schedule 31.08.2016
comment
Спасибо за ответ. Есть ли способ узнать полное пространство имен для класса? Если я смогу получить полное пространство имен на своем локальном компьютере, я смогу отредактировать код, чтобы он заработал. - person noquierouser; 01.09.2016
comment
@noquierouser Просто проверьте пространство имен класса, открыв файл класса. Он должен быть сверху. Также взгляните на secure.php.net/manual/en/language.namespaces. .php - person schilli; 01.09.2016
comment
У меня все эти use поверх файла. Это те, которые я должен использовать? сбор всех use предложений - person noquierouser; 01.09.2016

Вам просто нужно заменить значения массива полными именами классов. Допустим, класс Example имеет пространство имен foo\bar вместо записи Example::class просто напишите foo\bar\Example.

person schilli    schedule 31.08.2016
comment
Однако это не код OP, это код пакета Composer. В любом процессе сборки/развертывания, управляемом Composer, эти изменения будут сметены. - person ceejayoz; 01.09.2016
comment
@ceejayoz: Но я использую Composer только на своем локальном компьютере, потому что у меня нет SSH-доступа к производству для запуска Composer. Таким образом, редактирование кода пакета является опцией. - person noquierouser; 01.09.2016
comment
@noquierouser Возможно, лучше было бы разветвить проект. - person ceejayoz; 01.09.2016
comment
Примечание @noquierouser: вам не нужен композитор в работе — вы можете запустить его локально и зафиксировать свои зависимости в своем проекте. Есть аргументы от некоторых, предполагающих, что это более устойчивый подход к развертыванию, поскольку таким образом вы не полагаетесь на внешнюю доступность для развертывания. - person scrowler; 01.09.2016