wubinworks/magic-object

Object with Magic Getter and Setter.

Maintainers

Package info

github.com/wubinworks/magic-object

Homepage

Chat

pkg:composer/wubinworks/magic-object

Transparency log

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.1 2026-07-21 02:51 UTC

This package is not auto-updated.

Last update: 2026-07-21 04:46:01 UTC


README

The MagicObject class is an excellent choice for manipulating structured data. For example, configuration data represented by JSON, XML, YML, etc.

The MagicObject can also be used for representing a database entry and the class extending it is often called Model.

$obj->setSomething(123);
$obj->getSomething(); // 123

The Magic Getter and Setter can make your code extremely simple and straightforward. For detailed usage, see the full example section.

Requirements

  • php >= 5.3

Installation

composer require wubinworks/magic-object

Usage

Data path naming

The MagicObject stores nested array data and those nested array keys can be represented by "path".

The key's separator is /. The best practice to name a path is to use lowercase letters, digits and underscores for keys only and the keys should begin with a lowercase letter.

For instance, this/is/a/path. The keys are this, is, a and path.

/** @var \Wubinworks\MagicObject\Data\MagicObject $obj */
$obj->setData('this/is/a/path', 'some value');
$obj->getData('this/is/a/path'); // some value

Path and method name conversion

Here is the Magic. The path can be converted to Getter and Setter method name.

/** @var \Wubinworks\MagicObject\Data\MagicObject $obj */
$obj->getData(<snake_case path>)
$obj->get<PascalCase partial method name>()

$obj->setData(<snake_case path>, $value)
$obj->set<PascalCase partial method name>($value)

$obj->hasData(<snake_case path>)
$obj->has<PascalCase partial method name>()

$obj->unsData(<snake_case path>)
$obj->uns<PascalCase partial method name>()

The above example demonstrates how snake_case path is converted to PascalCase partial method name, and vice versa.

Note the key's separator / is converted to _, and vice versa.

For instance, customer/reward_points/expired <==> Customer_RewardPoints_Expired.

You may still be confused, so see the full example below.

Full example

$data = json_decode('{
    "customer": {
        "name": "John Smith",
        "gender": null,
        "age": 25,
        "reward_points": {
            "used": 1000,
            "expired": 2000
        }
    },
    "order_number": 111111111
}', true);
/*
$data = [
    'customer' => [
        'name' => 'John Smith',
        'gender' => null,
        'age' => 25,
        'reward_points' => [
            'used' => 1000,
            'expired' => 2000
        ];
    ],
    'order_number' => 11111111
];
*/

// Feed the object with data. Array with numeric keys are *NOT* supported.
$obj = new \Wubinworks\MagicObject\Data\MagicObject($data);

// Getter

$obj->getData('order_number'); // 11111111
$obj->getOrderNumber(); // 11111111

$obj->getData('customer/reward_points/used'); // 1000
$obj->getCustomer_RewardPoints_Used(); // 1000

// If the path does not exist, null will be returned and no exception will be thrown.
$obj->getData('customer/nonexist_key'); // null
$obj->getCustomer_NonexistKey(); // null

// Get all data
$obj->getData(/** No path parameter */); // $data

// Setter

$obj->setData('order_number', 22222222);
$obj->getData('order_number'); // 22222222
$obj->setOrderNumber(33333333);
$obj->getData('order_number'); // 33333333

$obj->setData('customer/reward_points/used', 7777);
$obj->getData('customer/reward_points/used'); // 7777
$obj->setCustomer_RewardPoints_Used(8888);
$obj->getData('customer/reward_points/used'); // 8888
$obj->setData('customer/new_key', 9999);
$obj->getData('customer/new_key'); // 9999

// Replace all data
// Actually, it is Setter. Note the path parameter of setData is null.

$arr = ['a' => 1, 'b' => 2];
$obj->setData(null, $arr);
$obj->getData(); // $arr

// Has path

$obj->setData(null, $data);
$obj->hasData('customer/gender'); // true
$obj->hasCustomer_Gender(); // true
$obj->hasData('customer/nonexist_key'); // false

// Unset path ("uns" means "unset")
// Always succeeds, even if the path does not exist.
// Note the path parameter of unsData cannot be null and must be string

$obj->unsData('customer/gender');
$obj->hasData('customer/gender'); // false
$obj->unsCustomer_Age();
$obj->hasData('customer/age'); // false

$obj->unsData('customer/nonexist_key');
$obj->unsCustomer_NonexistKey();

Unit testing

Install the require-dev dependencies and run the following command.

vendor/bin/phpunit

If you like this package or this package helped you, please share and give a ★☆star☆★, it's NOT hard!