147  /  382
Справочник

Класс объекта

Просмотров: 52001
Дата последнего изменения: 26.07.2023
Татьяна Старкова
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Все объекты сущностей являются наследниками класса Bitrix\Main\ORM\Objectify\EntityObject, при этом у каждой сущности – свой собственный класс для объектов. По умолчанию, такой класс создается автоматически, на лету. Если вы уже сгенерировали аннотации классов ORM, то IDE раскроет этот момент:

Как видно, класс объекта EO_Book находится в том же пространстве имен, что и класс Table, так же назван, но вместо суффикса Table имеет префикс EO_ (аббревиатура EntityObject). Такой префикс добавлен из соображений обратной совместимости: в существующих проектах уже может быть класс Book или конструкция вида

use Some\Another\Book;
что приведет к конфликту повторного использования слова Book. Мы посчитали префикс EO_ достаточно уникальным, тем более в обычном случае использование знака _ противоречит стандартам именования кода, и конфликтов с вручную описанными классами быть не должно.

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

//Файл bitrix/modules/main/lib/test/typography/book.php

namespace Bitrix\Main\Test\Typography;

class Book extends EO_Book
{
}

Ключевой момент - наследование от базового виртуального класса объекта EO_Book.

Сущность нужно уведомить о новом классе следующим образом:

//Файл bitrix/modules/main/lib/test/typography/booktable.php

namespace Bitrix\Main\Test\Typography;

class BookTable extends Bitrix\Main\ORM\Data\DataManager
{
	public static function getObjectClass()
	{
		return Book::class;
	}
	//...
}

Теперь метод fetchObject будет возвращать объекты класса Bitrix\Main\Test\Typography\Book. А после перегенерации аннотаций новый класс начнет показывать IDE:

Определять собственные классы объектов стоит лишь тогда, когда вам требуется явно использовать имя класса или расширить класс своим функционалом. Не рекомендуется использовать имена стандартных классов в своем коде, например instanceof EO_Book, new EO_Book или EO_Book::class. В таких случаях рекомендуется описать свой класс с «красивым» именем, соответствующий стандартам именования, либо использовать обезличенные методы BookTable::getObjectClass(), BookTable::createObject(), BookTable::wakeUpObject() и т.п.

В своем классе можно не только добавлять свой функционал, но и переопределять стандартные именованные методы. Не следует лишь описывать в классе свойства с именами primary, entity и dataClass, поскольку эти имена уже используются базовым классом.



17
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии