-
-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Objects
github-actions[bot] edited this page Jul 16, 2026
·
1 revision
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отслеживает уже клонированные объекты.
CloudCastle Support · · PHP 8.1+
GitHub · Packagist · Releases · Discussions
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)