Вопрос к гуру ООП

Главные вкладки

Аватар пользователя marassa marassa 25 декабря 2021 в 13:49

Давно-давно написал восьмерочную версию модуля KML. Большую часть "ООП-обвязки" просто скопипастил оттуда и отсюда, не всегда на 100% понимая что делаю, но модуль работает у меня и еще нескольких десятков человек Wink
Сейчас готовлюсь переходить на девятку. Большая часть несовместимостей была починена автоматически rector'ом, осталась одна загадочная ошибка, которую показывает модуль Upgrade status:
Class Drupal\kml\Encoder\KmlEncoder extends @internal class Drupal\serialization\Encoder\XmlEncoder.
Вот собственно фрагмент кода, о котором идет речь:

<?php

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), не очень понятно а) как починить, б) какое это имеет отношение к девятке и в) что будет если просто забить? Wink

Комментарии

Аватар пользователя OldWarrior OldWarrior 25 декабря 2021 в 18:32

marassa wrote: осталась одна загадочная ошибка, которую показывает модуль Upgrade status:
Class Drupal\kml\Encoder\KmlEncoder extends @internal class Drupal\serialization\Encoder\XmlEncoder.

А само описание ошибки отсутствует? Или таки что-то ещё было?

Модификатор доступа internal обычно используется для указания, что класс или его методы могут использоваться только в вызовах из этого же файла/компонента. Но это в языках C++ семейства. По-моему, в PHP не имеет значения этот модификатор, поскольку классы грузятся через механизм autoloader'а.

Аватар пользователя marassa marassa 25 декабря 2021 в 18:43

OldWarrior wrote: А само описание ошибки отсутствует? Или таки что-то ещё было?

Это полный текст ошибки, которую показывает модуль Upgrade status.

Аватар пользователя OldWarrior OldWarrior 25 декабря 2021 в 18:53

Навскидку можно попробовать создать свою переименованную версию класса Drupal\serialization\Encoder\XmlEncoder (т.е. скопировать код оригинала), разместив его в namespace модуля kml. И в нём уже удалить модификатор @internal. Соответственно, расширять именно этот новый класс при объявлении KmlEncoder. Просто как способ подавить сообщение об ошибке. Smile

Аватар пользователя marassa marassa 25 декабря 2021 в 18:59

Нет такой самоцели - подавить сообщение об ошибке, которая видна (пока) только в отчёте D9 upgrade status. Хочу понять что я делаю не так.

Аватар пользователя OldWarrior OldWarrior 25 декабря 2021 в 19:14
1

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 это не имеет отношения.

Аватар пользователя marassa marassa 25 декабря 2021 в 19:28

Спасибо, я это видел, но всё равно не очень понял как правильно-то сделать. Но если я правильно понял, это не более чем предупреждение о том, что API может измениться в любой момент, то есть не фатальная ошибка.

Аватар пользователя OldWarrior OldWarrior 25 декабря 2021 в 19:58

Судя по всему, так. И, видимо, вы просто получаете предупреждение, что используете (т.е. расширяете) в своём коде класс, не относящийся к Public API и потенциально подверженный модификации в минорных релизах.

А как именно отчёт D9 upgrade status её отображает: как ошибку или типа notice?

Аватар пользователя marassa marassa 25 декабря 2021 в 20:10
OldWarrior wrote: А как именно отчёт D9 upgrade status её отображает: как ошибку или типа notice?


Как warning всё-таки, это я что-то недоглядел:

Забью, пожалуй - у меня еще четыре модуля не готовых, в одном 241 проблема Wink

Аватар пользователя dashiwa dashiwa 11 января 2022 в 11:13

В целом это скорее не к ООП относится. А к стандартам документации
Я вот как-то особо не вижу смысла в таких комментариях сильно, возможно ошибаюсь

https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md