Traits and Helpers#
This page covers reusable building blocks outside the core helper classes:
DTOTraitfor data-transfer object hydrationHookTraitfor key-based get/set transformsnamespaced helper functions (autoloaded by default)
optional global helper functions from
src/functions.php
DTOTrait#
Namespace: Infocyph\ArrayKit\traits\DTOTrait
Main methods:
create(array $values): static(static constructor)fromArray(array $values): static(hydrate current instance)hydrate(array $values, array $mapping = [], bool $coerce = false): statichydrateNested(array $values, array $mapping = [], bool $coerce = false): statictoArray(): array(export public properties)toArrayDeep(): array(recursive export)replaceFromArray(array $values, array $mapping = [], bool $coerce = false): static
Basic DTO Flow#
<?php
use Infocyph\ArrayKit\traits\DTOTrait;
class UserDTO
{
use DTOTrait;
public string $name = '';
public string $email = '';
public int $age = 0;
}
$user = UserDTO::create([
'name' => 'Alice',
'email' => '[email protected]',
'age' => 30,
]);
$arr = $user->toArray();
Incremental Hydration#
<?php
$user = new UserDTO();
$user->fromArray(['name' => 'Bob']);
$user->fromArray(['age' => 32]);
Unknown Keys#
Unknown keys are ignored (no dynamic properties are created):
<?php
$user = UserDTO::create([
'name' => 'Alice',
'unknown_field' => 'ignored',
]);
// toArray() contains only declared properties
HookTrait#
Namespace: Infocyph\ArrayKit\traits\HookTrait
Main methods:
onGet(string $offset, callable $callback): staticonSet(string $offset, callable $callback): static
HookTrait is used internally by:
Infocyph\ArrayKit\Collection\HookedCollectionInfocyph\ArrayKit\Config\ConfigInfocyph\ArrayKit\Config\LazyFileConfig
HookedCollection Integration#
<?php
use Infocyph\ArrayKit\Collection\HookedCollection;
$c = new HookedCollection(['name' => 'alice']);
// get-time transform
$c->onGet('name', fn ($v) => strtoupper((string) $v));
// set-time transform
$c->onSet('role', fn ($v) => "Role: $v");
echo $c['name']; // ALICE
$c['role'] = 'admin';
echo $c['role']; // Role: admin
Config Integration#
<?php
use Infocyph\ArrayKit\Config\Config;
$config = new Config();
$config->onSet('user.email', fn ($v) => trim((string) $v));
$config->onGet('user.email', fn ($v) => strtolower((string) $v));
$config->setWithHooks('user.email', ' [email protected] ');
echo $config->getWithHooks('user.email'); // [email protected]
Multiple Hooks on Same Key#
Hooks run in registration order:
<?php
$config->onSet('username', fn ($v) => trim((string) $v));
$config->onSet('username', fn ($v) => strtolower((string) $v));
$config->setWithHooks('username', ' ALICE '); // becomes "alice"
Helper Functions#
By default, Composer autoloads the namespaced helper functions
(Infocyph\ArrayKit\*). Global helper functions are optional.
Namespaced helpers (autoloaded):
Infocyph\ArrayKit\compare(mixed $retrieved, mixed $value, ?string $operator = null): boolInfocyph\ArrayKit\array_get(array $array, int|string|array|null $key = null, mixed $default = null): mixedInfocyph\ArrayKit\array_set(array &$array, string|array|null $key, mixed $value = null, bool $overwrite = true): boolInfocyph\ArrayKit\collect(mixed $data = []): CollectionInfocyph\ArrayKit\chain(mixed $data): Pipeline
Optional global helpers (manual include):
compare(mixed $retrieved, mixed $value, ?string $operator = null): boolarray_get(array $array, int|string|array|null $key = null, mixed $default = null): mixedarray_set(array &$array, string|array|null $key, mixed $value = null, bool $overwrite = true): boolcollect(mixed $data = []): Collectionchain(mixed $data): Pipeline
To enable optional global helpers:
<?php
require_once __DIR__ . '/vendor/infocyph/arraykit/src/functions.php';
array_get / array_set#
<?php
use function Infocyph\ArrayKit\array_get;
use function Infocyph\ArrayKit\array_set;
$data = ['user' => ['name' => 'Alice']];
$name = array_get($data, 'user.name'); // Alice
$missing = array_get($data, 'user.email', 'n/a'); // n/a
array_set($data, 'user.email', '[email protected]');
array_set($data, [
'user.role' => 'admin',
'user.active' => true,
]);
collect / chain#
<?php
use function Infocyph\ArrayKit\chain;
use function Infocyph\ArrayKit\collect;
$c = collect([1, 2, 3, 4]);
$evens = $c->filter(fn ($v) => $v % 2 === 0)->all(); // [1 => 2, 3 => 4]
$sum = chain([1, 2, 3])->sum(); // 6
compare Helper#
<?php
use function Infocyph\ArrayKit\compare;
compare(10, 5, '>'); // true
compare(10, 10, '==='); // true
compare('5', 5, '!=='); // true
compare(10, 10); // true (default ==)
When to Use These Helpers#
Use
DTOTraitfor lightweight request/response data objects.Use
HookTraitconsumers when you need transparent value transforms.Use namespaced helper functions by default; include global helpers only when explicitly desired.
Laravel Compatibility Layer#
ArrayKit also ships optional Laravel-style wrappers:
Infocyph\ArrayKit\LaravelCompat\ArrInfocyph\ArrayKit\LaravelCompat\Collection
<?php
use Infocyph\ArrayKit\LaravelCompat\Arr;
use Infocyph\ArrayKit\LaravelCompat\Collection as CompatCollection;
$data = ['user' => ['name' => 'Alice']];
Arr::set($data, 'user.role', 'admin');
$name = Arr::get($data, 'user.name');
$c = new CompatCollection([1, 2, 3]);
$all = $c->all();