Давно-давно написал восьмерочную версию модуля KML. Большую часть "ООП-обвязки" просто скопипастил оттуда и отсюда, не всегда на 100% понимая что делаю, но модуль работает у меня и еще нескольких десятков человек
Сейчас готовлюсь переходить на девятку. Большая часть несовместимостей была починена автоматически rector'ом, осталась одна загадочная ошибка, которую показывает модуль Upgrade status:
Class Drupal\kml\Encoder\KmlEncoder extends @internal class Drupal\serialization\Encoder\XmlEncoder.
Вот собственно фрагмент кода, о котором идет речь:
namespace Drupal\kml\Encoder;
use Drupal\Core\File\FileSystemInterface;
use Drupal\serialization\Encoder\XmlEncoder as SerializationXmlEncoder;
/**
* Encodes KML data in XML.
*/
class KmlEncoder extends SerializationXmlEncoder {
...
Мне примерно понятно что не так (класс SerializationXmlEncoder помечен как @internal), не очень понятно а) как починить, б) какое это имеет отношение к девятке и в) что будет если просто забить?
Комментарии
А само описание ошибки отсутствует? Или таки что-то ещё было?
Модификатор доступа internal обычно используется для указания, что класс или его методы могут использоваться только в вызовах из этого же файла/компонента. Но это в языках C++ семейства. По-моему, в PHP не имеет значения этот модификатор, поскольку классы грузятся через механизм autoloader'а.
Это полный текст ошибки, которую показывает модуль Upgrade status.
Навскидку можно попробовать создать свою переименованную версию класса
Drupal\serialization\Encoder\XmlEncoder
(т.е. скопировать код оригинала), разместив его в namespace модуля kml. И в нём уже удалить модификатор@internal
. Соответственно, расширять именно этот новый класс при объявленииKmlEncoder
. Просто как способ подавить сообщение об ошибке.Нет такой самоцели - подавить сообщение об ошибке, которая видна (пока) только в отчёте D9 upgrade status. Хочу понять что я делаю не так.
https://www.drupal.org/about/core/policies/core-change-policies/drupal-8...
И вытекающие:
https://www.drupal.org/project/drupal/issues/2873668
https://www.drupal.org/project/drupal/issues/3019332
Возможно, поможет.
PS. Иными словами, @internal в Drupal'е не является модификатором видимости. А только указанием на то, что класс относится к Internal (т.е. не Public) API и не гарантируется его изменение между минорными версиями без специальных уведомлений в change records. То есть - он может быть изменён в любое время.
К PHP это не имеет отношения.
Спасибо, я это видел, но всё равно не очень понял как правильно-то сделать. Но если я правильно понял, это не более чем предупреждение о том, что API может измениться в любой момент, то есть не фатальная ошибка.
Судя по всему, так. И, видимо, вы просто получаете предупреждение, что используете (т.е. расширяете) в своём коде класс, не относящийся к Public API и потенциально подверженный модификации в минорных релизах.
А как именно отчёт D9 upgrade status её отображает: как ошибку или типа notice?
Как warning всё-таки, это я что-то недоглядел:
Забью, пожалуй - у меня еще четыре модуля не готовых, в одном 241 проблема
В контрибах, кстати, полно классов, которые наследуются от internal. Пхпшторм ругается, но всё работает
В целом это скорее не к ООП относится. А к стандартам документации
Я вот как-то особо не вижу смысла в таких комментариях сильно, возможно ошибаюсь
https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md