PHP Library for simplifying getting and setting values in arrays or objects
At its core, this library is composed of 3 function pairs:
get/set-- functions to get and set nested values in an array, object, or class given a field name using dot notationgetValue/setValue-- functions to get and set values in an array, object, or class.getValueByArrayPath/setValueByArrayPath-- used bygetandsetto access the nested values by specifying the path in an array.
Use Composer:
"require": {
"revinate/php-getter-setter": "~0.2"
},To make things easier, include the follow use statement at the top of your files:
use Revinate\GetterSetter as gs;$name = gs\get($data, 'name');$name = gs\get($data, 'count', 0);$updatedData = gs\set($data, 'count', 42);Here is an example unit test to give a bit more context.
public function testExampleJson() {
$json = '{"name":"example","type":"json","value":22}';
$data = json_decode($json);
$name = gs\get($data, 'name');
$missing = gs\get($data, 'missing');
$this->assertEquals('example', $name);
$this->assertNull($missing);
}With setValue, an object will get updated when a field value is set. But it is different with arrays because they are immutable. Only the array returned from setValue will have the updated fields. Watch out for ArrayObjects, they will get updated just like normal objects.
Example Unit Test showing difference between objects and arrays:
public function testExampleArrayVsObject() {
$json = '{"name":"example","type":"json","value":22}';
$object = json_decode($json);
$array = (array)$object;
// The object gets updated as well
$newObject = gs\set($object, 'type', 'Object');
// Only the new array contains the update.
$newArray = gs\set($array, 'type', 'Array');
$this->assertEquals($object, $newObject);
$this->assertNotEquals($array, $newArray);
}getPathValue and setPathValue provide an easy shortcut for getting and setting nested values.
{
"first_name" : "Joe",
"last_name" : "Rock",
"address" : {
"street":"1 Main St.",
"city":"Little Rock",
"state":"Arkansas"
},
"profession":"Stone cutter"
}Example accessing:
$json = $this->getEmployeeJsonData();
$data = json_decode($json);
$this->assertEquals('Arkansas', gs\get($data, 'address.state'));
$this->assertNull(gs\get($data, 'address.zip'));The notation is longer than $data->address->state, but it will not blow up where this will: $data->address->zip.
These functions support getters, setters and magic methods use by many ORM systems like Doctrine.
Example Data Class
class MagicAccessTestClass {
protected $values = array();
function __get($name) {
return $this->values[$name];
}
function __isset($name) {
return isset($this->values[$name]);
}
function __set($name, $value) {
$this->values[$name] = $value;
}
}Sample Usage:
public function testMagicMethods() {
$data = new MagicAccessTestClass();
$data->first_name = 'Joe';
$data->last_name = 'Rock';
gs\set($data, 'profession', 'Stone cutter');
gs\set($data, 'address', new MagicAccessTestClass());
gs\setPathValue($data, 'address.city', 'Little Rock');
$this->assertEquals('Joe', gs\get($data, 'first_name'));
$this->assertEquals('Rock', gs\get($data, 'last_name'));
$this->assertEquals('Little Rock', gs\get($data, 'address.city'));
}