Download the PHP package chillerlan/php-settings-container without Composer
On this page you can find all versions of the php package chillerlan/php-settings-container. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download chillerlan/php-settings-container
More information about chillerlan/php-settings-container
Files in chillerlan/php-settings-container
Package php-settings-container
Short Description A container class for immutable settings objects. Not a DI container.
License MIT
Homepage https://github.com/chillerlan/php-settings-container
Informations about the package php-settings-container
chillerlan/php-settings-container
A container class for settings objects - decouple configuration logic from your application! Not a DI container.
SettingsContainerInterfaceprovides fancy property hooks for PHP < 8.4.
Documentation
Installation
requires composer
composer.json (note: replace dev-main with a version constraint, e.g. ^3.0 - see releases for valid versions)
Profit!
Usage
The SettingsContainerInterface (wrapped inSettingsContainerAbstract) provides plug-in functionality for immutable object properties and adds some fancy, like loading/saving JSON, arrays etc.
It takes an iterable as the only constructor argument and calls a method with the trait's name on invocation (MyTrait::MyTrait()) for each used trait.
A PHPStan ruleset to exclude errors generated by accessing magic properties on SettingsContainerInterface can be found in rules-magic-access.neon.
Simple usage
By default, non-existing properties will be ignored and return null:
You can change this behaviour by adding the attribute ThrowOnInvalidProperty to your container class:
Advanced usage
Suppose the following trait from library 1:
And another trait from library 2:
We can now plug the several library options together to a single class/object:
A note on property hooks (PHP 8.4+)
Property hooks are called whenever a property is accessed (except from within the hook itself of course), which means that the custom get/set methods this library allows would conflict when a custom method is defined for a property that also has a hook defined.
To prevent double method calls, the internal methods hasSetHook() and hasGetHook() have been introduced, and are called whenever the magic get/set methods are called: when both, a custom method and a property hook exist, only the property hook will be called.
Public properties will never call the magic get/set, however, their hooks will be called. (un)serializing a SettingsContainerInterface instance will bypass magic get/set and existing property hooks, while JSON de/encode as will call magic get/set or existing hooks explicitly via the toArray() and fromIterable() methods.
API
SettingsContainerAbstract
| method | return | info |
|---|---|---|
__construct(iterable $properties = null) |
- | calls construct() internally after the properties have been set |
__get(string $property) |
mixed | calls $this->{'get_'.$property}() if such a method exists |
__set(string $property, $value) |
void | calls $this->{'set_'.$property}($value) if such a method exists |
__isset(string $property) |
bool | |
__unset(string $property) |
void | |
__toString() |
string | a JSON string |
toArray() |
array | |
fromIterable(iterable $properties) |
SettingsContainerInterface |
|
toJSON(int $jsonOptions = null) |
string | accepts JSON options constants |
fromJSON(string $json) |
SettingsContainerInterface |
|
jsonSerialize() |
mixed | implements the JsonSerializable interface |
serialize() |
string | implements the Serializable interface |
unserialize(string $data) |
void | implements the Serializable interface |
__serialize() |
array | implements the Serializable interface |
__unserialize(array $data) |
void | implements the Serializable interface |
Internal (protected) methods
| method | return | info |
|---|---|---|
construct() |
void | calls a method with trait name as replacement constructor for each used trait |
isPrivate(string $property) |
bool | private properties are excluded from magic calls |
hasSetHook(string $property) |
bool | |
hasGetHook(string $property) |
bool |
Disclaimer
This might be either an absolutely brilliant or completely stupid idea - you decide (in hindsight it was a great idea I guess - property hooks made their way into PHP 8.4).
Also, this is not a dependency injection container. Stop using DI containers FFS.
All versions of php-settings-container with dependencies
ext-json Version *