Skip to content

Feature Objects

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

🧮 Объекты (Obj)

← Возможности · Главная · Сравнение

CloudCastle\Support\Obj — объектные хелперы: точечный доступ по цепочке свойств и аксессоров, рекурсивное приведение к массиву, глубокое клонирование с сохранением циклов, интроспекция трейтов, безопасное заполнение свойств. Суперсет объектных возможностей illuminate/support (object_get, class_basename, class_uses_recursive) без магии и без тяжёлой рефлексии symfony/property-access.

Принцип работы

  • get($target, 'a.b.c', $default) — каждый сегмент пробуется по порядку: публичное свойство → аксессор getX()/isX()/hasX() → ключ массива / ArrayAccess. Обрыв цепочки возвращает $default. Произвольные методы по имени сегмента не вызываются — путь может прийти из недоверенного ввода, и чтение не должно превращаться в вызов действия (cancel(), delete()…).
  • toArray($object, $maxDepth = 16) — рекурсивное приведение к массиву: JsonSerializable уважается, берутся публичные свойства, глубина ограничена (fail-safe от циклов).
  • deepClone($object) — глубокая копия: вложенные объекты в свойствах и массивах клонируются рекурсивно, циклические ссылки сохраняются внутри копии и не указывают на оригинал.
  • classBasename($class) — короткое имя класса без namespace.
  • classUses($class) — все трейты класса транзитивно: родителей и трейтов трейтов.
  • isInstanceOfAny($object, [$classA, $classB]) — экземпляр хотя бы одного из классов.
  • fill($object, $values) — заполняет только существующие публичные свойства: неизвестные ключи игнорируются (защита от mass assignment).
use CloudCastle\Support\Obj;

Obj::get($order, 'customer.address.city', ''); // 'Москва'
Obj::get($order, 'customer.name');              // через getName()
Obj::get($order, 'customer.cancel');            // null — метод-действие НЕ вызван

$array = Obj::toArray($order);                  // рекурсивно, только публичное

$copy = Obj::deepClone($order);                 // вложенные объекты независимы
$copy->customer->address->city = 'СПб';         // оригинал не изменился

Obj::classBasename(App\Models\User::class);     // 'User'
Obj::classUses($model);                         // все трейты, включая вложенные

Obj::fill($dto, ['status' => 'paid', 'hack' => 1]); // 'hack' игнорирован

Отличия от аналогов

Аспект Obj illuminate data_get symfony property-access
Аксессоры getX/isX/hasX ❌ только свойства
Вызов произвольных методов по пути ❌ намеренно
toArray рекурсивный 🔌 serializer
deepClone с циклами
Zero-config ❌ объект-аксессор

Безопасность

  • Пути из недоверенного ввода безопасны: get не вызывает методы-действия нулевой арности — только белый список аксессоров.
  • Mass assignment закрыт: fill не создаёт новых свойств и не трогает приватные.
  • Циклы не роняют процесс: toArray ограничен глубиной, deepClone отслеживает уже клонированные объекты.

См. также

Clone this wiki locally