"Smart data structures and dumb code works a lot better than the other way around." (c) Eric S. Raymond
"Bad programmers worry about the code. Good programmers worry about data structures and their relationships." (c) Linus Torvalds
This is yet another PHP implementation of the data container (like DTO / SDO). Some kind of the wrapper around associative array. The main goal of this implementation is to be an accessor for the raw data.
We can use any property of any PHP object:
$obj1 = new class {};
$obj2 = new class {};
$obj1->name = 'first';
$obj2->code = 'OBJ2';
$obj1->sub = $obj2;
$this->assertEquals('first', $obj1->name);
$this->assertEquals('OBJ2', $obj1->sub->code);
We can set/get value of the inner property in PHP style:
$obj->sub->code = $code;
$code = $obj->sub->code;
but we will have "Undefined property" error if $obj->sub
property does not exist.
We need to use accessors to control properties types.
This is Customer
class with string
property:
/**
* @property string $name Customer name.
*/
class Customer
{
public function getName() : string
{
return $this->name;
}
public function setName(string $data)
{
$this->name = $data;
}
}
This is Order
class with Customer
property:
/**
* @property Customer $customer
*/
class Order
{
public function getCustomer() : Customer
{
return $this->customer;
}
public function setCustomer(Customer $data)
{
$this->customer = $data;
}
}
This is code without errors (all types are expected):
$customer = new Customer();
$customer->setName('John Dow');
$order = new Order();
$order->setCustomer($customer);
$this->assertTrue(is_string($order->getCustomer()->getName()));
This code will throw a \TypeError
exception:
$customer = new class {};
$customer->name = 'John Dow';
$order = new Order();
$order->setCustomer($customer);
With paths we will have property value if chain of properties exists or null
otherwise:
$code = $obj->get('sub/code');
$code = $obj->get('/sub/code'); // equals to 'sub/code'
$code = $obj->get('/subs/0/code'); // 'subs' is array
$code = $obj->get('/sub/code/does/not/exist'); // 'null' is returned, no error is occured
Also we can set data property by path:
$obj->set('order/customer/name', 'John Dow');
Add to composer.json
:
"require": {
"flancer32/php_data_object": "0.1.0"
}
$ composer install
$ ./vendor/bin/phpunit -c ./test/unit/phpunit.dist.xml