Allows you to cast a stdClass (or any other class) to some other class.
composer require rfx/cast
So you received a beautiful object that you want to use
stdClass Object
(
[name] => home
[at] => stdClass Object
(
[x] => 4
[y] => 5
)
)
However:
- Your IDE hates it
- All static analysis tools hate it
- No autocompletion
- No type checks
declare(strict_types=1);
// Create class(es) that define(s) those properties
use rfx\Type\Cast;
class Point {
public int $x;
public int $y;
}
class Location {
public string $name;
public Point $at;
}
function getLocation(): Location {
// Get your object (from a json source, some external lib, ...).
// As demonstration we create one here from an array.
$obj = (object)['name' => 'home', 'at' => ['x' => 4, 'y' => 5]];
// Cast it (this works recursively, e.g. Location contains a Point object)
return Cast::as($obj, Location::class);
}
$l = getLocation();
Location Object
(
[name] => home
[at] => Point Object
(
[x] => 4
[y] => 5
)
)
- Your IDE loves you again
- All static analysis tools will help you find problems
- Autocompletion, type checks, etc. work again
If performance is important and:
- you are casting many objects of the same type
- all your objects are shallow (no nesting)
- all the properties are scalar types
then you can use the faster alternative, which is as performant as a normal constructor:
declare(strict_types=1);
// Create a proper class that defines those properties
use rfx\Type\Cast;
class Point {
public string $name;
public int $x;
public int $y;
}
/** @return Point[] */
function getPoints(): array {
// Get your objects (from a json source, some external lib, ...).
// As demonstration we create a million from an array.
$obj = (object)['name' => 'P1', 'x' => 4, 'y' => 5];
$objs = array_fill(0, 1000000, $obj);
// Create a factory
$cf = new Cast(Point::class);
// Cast them all
return array_map([$cf, 'cast'], $objs);
}
$p = getPoints();
This section needs to be written, and some future plans added.