diff options
author | Mario <mario@mariovavti.com> | 2024-03-14 09:35:09 +0000 |
---|---|---|
committer | Mario <mario@mariovavti.com> | 2024-03-14 09:35:09 +0000 |
commit | 6bf61dfa6b585db01b607a79bd64ec9c583a9c10 (patch) | |
tree | 78698101aa58d918568dfc0020650fc337e8d3e0 /vendor/chillerlan/php-settings-container | |
parent | 0e59cfb8390e4c6aee29ef73b53a4dc6b7fb581e (diff) | |
download | volse-hubzilla-6bf61dfa6b585db01b607a79bd64ec9c583a9c10.tar.gz volse-hubzilla-6bf61dfa6b585db01b607a79bd64ec9c583a9c10.tar.bz2 volse-hubzilla-6bf61dfa6b585db01b607a79bd64ec9c583a9c10.zip |
composer update and use the fixed streams php-jcs library until the floats issue will be fixed upstream. see here for reference https://codeberg.org/streams/streams/issues/151
Diffstat (limited to 'vendor/chillerlan/php-settings-container')
14 files changed, 165 insertions, 392 deletions
diff --git a/vendor/chillerlan/php-settings-container/.github/FUNDING.yml b/vendor/chillerlan/php-settings-container/.github/FUNDING.yml deleted file mode 100644 index 16a077f52..000000000 --- a/vendor/chillerlan/php-settings-container/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -ko_fi: codemasher -custom: "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4" diff --git a/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml b/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml deleted file mode 100644 index 8f108f0dd..000000000 --- a/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml +++ /dev/null @@ -1,105 +0,0 @@ -# https://help.github.com/en/categories/automating-your-workflow-with-github-actions -# https://github.com/sebastianbergmann/phpunit/blob/master/.github/workflows/ci.yml - -on: - push: - branches: - - main - pull_request: - branches: - - main - - -name: "CI" - -jobs: - - static-code-analysis: - name: "Static Code Analysis" - - runs-on: ubuntu-latest - - env: - PHAN_ALLOW_XDEBUG: 0 - PHAN_DISABLE_XDEBUG_WARN: 1 - - steps: - - name: "Checkout" - uses: actions/checkout@v3 - - - name: "Install PHP" - uses: shivammathur/setup-php@v2 - with: - php-version: "7.4" - tools: pecl - coverage: none - extensions: ast, json - - - name: "Update dependencies with composer" - run: composer update --no-interaction --no-ansi --no-progress --no-suggest - - - name: "Run phan" - run: php vendor/bin/phan - - build-docs: - name: "Build and publish Docs" - - runs-on: ubuntu-latest - - steps: - - name: "Checkout sources" - uses: actions/checkout@v3 - - - name: "Install PHP" - uses: shivammathur/setup-php@v2 - with: - php-version: "8.1" - coverage: none - tools: phpDocumentor - extensions: json - - - name: "Build Docs" - run: phpdoc --config=phpdoc.xml - - - name: "Publish Docs to gh-pages" - uses: JamesIves/github-pages-deploy-action@v4.3.4 - with: - branch: gh-pages - folder: docs - clean: true - - tests: - name: "Unit Tests" - - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: - - ubuntu-latest - - windows-latest - php-version: - - "7.4" - - "8.0" - - "8.1" - - steps: - - name: "Checkout" - uses: actions/checkout@v3 - - - name: "Install PHP with extensions" - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-version }} - coverage: pcov - extensions: json - - - name: "Install dependencies with composer" - run: composer update --no-ansi --no-interaction --no-progress --no-suggest - - - name: "Run tests with phpunit" - run: php vendor/phpunit/phpunit/phpunit --configuration=phpunit.xml - - - name: "Send code coverage report to Codecov.io" - uses: codecov/codecov-action@v3 diff --git a/vendor/chillerlan/php-settings-container/.gitignore b/vendor/chillerlan/php-settings-container/.gitignore deleted file mode 100644 index 142dd453a..000000000 --- a/vendor/chillerlan/php-settings-container/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/.build -/.idea -/vendor -composer.lock diff --git a/vendor/chillerlan/php-settings-container/.phan/config.php b/vendor/chillerlan/php-settings-container/.phan/config.php deleted file mode 100644 index 468bd9983..000000000 --- a/vendor/chillerlan/php-settings-container/.phan/config.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -/** - * This configuration will be read and overlaid on top of the - * default configuration. Command-line arguments will be applied - * after this file is read. - */ -return [ - // Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`, - // `'7.4'`, `null`. - // If this is set to `null`, - // then Phan assumes the PHP version which is closest to the minor version - // of the php executable used to execute Phan. - // - // Note that the **only** effect of choosing `'5.6'` is to infer - // that functions removed in php 7.0 exist. - // (See `backward_compatibility_checks` for additional options) - 'target_php_version' => '7.4', - - // A list of directories that should be parsed for class and - // method information. After excluding the directories - // defined in exclude_analysis_directory_list, the remaining - // files will be statically analyzed for errors. - // - // Thus, both first-party and third-party code being used by - // your application should be included in this list. - 'directory_list' => [ - 'examples', - 'src', - 'tests', - 'vendor', - ], - - // A regex used to match every file name that you want to - // exclude from parsing. Actual value will exclude every - // "test", "tests", "Test" and "Tests" folders found in - // "vendor/" directory. - 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@', - - // A directory list that defines files that will be excluded - // from static analysis, but whose class and method - // information should be included. - // - // Generally, you'll want to include the directories for - // third-party code (such as "vendor/") in this list. - // - // n.b.: If you'd like to parse but not analyze 3rd - // party code, directories containing that code - // should be added to both the `directory_list` - // and `exclude_analysis_directory_list` arrays. - 'exclude_analysis_directory_list' => [ - 'tests', - 'vendor', - ], -]; diff --git a/vendor/chillerlan/php-settings-container/.scrutinizer.yml b/vendor/chillerlan/php-settings-container/.scrutinizer.yml deleted file mode 100644 index daeb475f4..000000000 --- a/vendor/chillerlan/php-settings-container/.scrutinizer.yml +++ /dev/null @@ -1,14 +0,0 @@ -build: - nodes: - analysis: - tests: - override: - - php-scrutinizer-run - environment: - php: 8.0.0 - -filter: - excluded_paths: - - examples/* - - tests/* - - vendor/* diff --git a/vendor/chillerlan/php-settings-container/README.md b/vendor/chillerlan/php-settings-container/README.md index 579696b6e..32f606fbc 100644 --- a/vendor/chillerlan/php-settings-container/README.md +++ b/vendor/chillerlan/php-settings-container/README.md @@ -1,15 +1,15 @@ # chillerlan/php-settings-container -A container class for immutable settings objects. Not a DI container. PHP 7.4+ -- [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php) provides immutable properties with magic getter & setter and some fancy - decouple configuration logic from your application! +A container class for settings objects - decouple configuration logic from your application! Not a DI container. +- [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php) provides immutable properties with magic getter & setter and some fancy. [![PHP Version Support][php-badge]][php] [![version][packagist-badge]][packagist] [![license][license-badge]][license] +[![Continuous Integration][gh-action-badge]][gh-action] [![Coverage][coverage-badge]][coverage] -[![Scrunitizer][scrutinizer-badge]][scrutinizer] +[![Codacy][codacy-badge]][codacy] [![Packagist downloads][downloads-badge]][downloads] -[![Continuous Integration][gh-action-badge]][gh-action] [php-badge]: https://img.shields.io/packagist/php-v/chillerlan/php-settings-container?logo=php&color=8892BF [php]: https://www.php.net/supported-versions.php @@ -19,23 +19,23 @@ A container class for immutable settings objects. Not a DI container. PHP 7.4+ [license]: https://github.com/chillerlan/php-settings-container/blob/main/LICENSE [coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-settings-container.svg?logo=codecov [coverage]: https://codecov.io/github/chillerlan/php-settings-container -[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-settings-container.svg?logo=scrutinizer -[scrutinizer]: https://scrutinizer-ci.com/g/chillerlan/php-settings-container +[codacy-badge]: https://img.shields.io/codacy/grade/bd2467799e2943d2853ce3ebad5af490/main?logo=codacy +[codacy]: https://www.codacy.com/gh/chillerlan/php-settings-container/dashboard?branch=main [downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-settings-container.svg?logo=packagist [downloads]: https://packagist.org/packages/chillerlan/php-settings-container/stats -[gh-action-badge]: https://github.com/chillerlan/php-settings-container/workflows/CI/badge.svg -[gh-action]: https://github.com/chillerlan/php-settings-container/actions?query=workflow%3A%22CI%22 +[gh-action-badge]: https://img.shields.io/github/actions/workflow/status/chillerlan/php-settings-container/ci.yml?branch=main&logo=github +[gh-action]: https://github.com/chillerlan/php-settings-container/actions/workflows/ci.yml?query=branch%3Amain ## Documentation ### Installation **requires [composer](https://getcomposer.org)** -*composer.json* (note: replace `dev-main` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^2.1` - see [releases](https://github.com/chillerlan/php-settings-container/releases) for valid versions) +*composer.json* (note: replace `dev-main` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^3.0` - see [releases](https://github.com/chillerlan/php-settings-container/releases) for valid versions) ```json { "require": { - "php": "^7.4 || ^8.0", + "php": "^8.1", "chillerlan/php-settings-container": "dev-main" } } @@ -45,31 +45,24 @@ Profit! ## Usage -The `SettingsContainerInterface` (wrapped in`SettingsContainerAbstract` ) provides plug-in functionality for immutable object properties and adds some fancy, like loading/saving JSON, arrays etc. +The `SettingsContainerInterface` (wrapped in`SettingsContainerAbstract`) 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. ### Simple usage ```php class MyContainer extends SettingsContainerAbstract{ - protected $foo; - protected $bar; -} -``` -Typed properties in PHP 7.4+: -```php -class MyContainer extends SettingsContainerAbstract{ protected string $foo; protected string $bar; } ``` ```php -// use it just like a \stdClass +// use it just like a \stdClass (except the properties are fixed) $container = new MyContainer; $container->foo = 'what'; $container->bar = 'foo'; -// which is equivalent to +// which is equivalent to $container = new MyContainer(['bar' => 'foo', 'foo' => 'what']); // ...or try $container->fromJSON('{"foo": "what", "bar": "foo"}'); @@ -90,37 +83,48 @@ var_dump($container->nope); // -> null ### Advanced usage ```php +// from library 1 trait SomeOptions{ - protected $foo; - protected $what; - + protected string $foo; + protected string $what; + // this method will be called in SettingsContainerAbstract::construct() // after the properties have been set - protected function SomeOptions(){ + protected function SomeOptions():void{ // just some constructor stuff... $this->foo = strtoupper($this->foo); } - + + /* + * special prefixed magic setters & getters + */ + // this method will be called from __set() when property $what is set - protected function set_what(string $value){ + protected function set_what(string $value):void{ $this->what = md5($value); } + + // this method is called on __get() for the property $what + protected function get_what():string{ + return 'hash: '.$this->what; + } } +// from library 2 trait MoreOptions{ - protected $bar = 'whatever'; // provide default values + protected string $bar = 'whatever'; // provide default values } ``` ```php $commonOptions = [ // SomeOptions - 'foo' => 'whatever', + 'foo' => 'whatever', // MoreOptions 'bar' => 'nothing', ]; -// now plug the several library options together to a single object +// now plug the several library options together to a single object $container = new class ($commonOptions) extends SettingsContainerAbstract{ use SomeOptions, MoreOptions; }; @@ -129,27 +133,31 @@ var_dump($container->foo); // -> WHATEVER (constructor ran strtoupper on the val var_dump($container->bar); // -> nothing $container->what = 'some value'; -var_dump($container->what); // -> md5 hash of "some value" +var_dump($container->what); // -> hash: 5946210c9e93ae37891dfe96c3e39614 (custom getter added "hash: ") ``` ### API #### [`SettingsContainerAbstract`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerAbstract.php) -method | return | info --------- | ---- | ----------- -`__construct(iterable $properties = null)` | - | calls `construct()` internally after the properties have been set -(protected) `construct()` | void | calls a method with trait name as replacement constructor for each used trait -`__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](http://php.net/manual/json.constants.php) -`fromJSON(string $json)` | `SettingsContainerInterface` | -`jsonSerialize()` | mixed | implements the [`JsonSerializable`](https://www.php.net/manual/en/jsonserializable.jsonserialize.php) interface +| method | return | info | +|--------------------------------------------|------------------------------|---------------------------------------------------------------------------------------------------------------------| +| `__construct(iterable $properties = null)` | - | calls `construct()` internally after the properties have been set | +| (protected) `construct()` | void | calls a method with trait name as replacement constructor for each used trait | +| `__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](http://php.net/manual/json.constants.php) | +| `fromJSON(string $json)` | `SettingsContainerInterface` | | +| `jsonSerialize()` | mixed | implements the [`JsonSerializable`](https://www.php.net/manual/en/jsonserializable.jsonserialize.php) interface | +| `serialize()` | string | implements the [`Serializable`](https://www.php.net/manual/en/serializable.serialize.php) interface | +| `unserialize(string $data)` | void | implements the [`Serializable`](https://www.php.net/manual/en/serializable.unserialize.php) interface | +| `__serialize()` | array | implements the [`Serializable`](https://www.php.net/manual/en/language.oop5.magic.php#object.serialize) interface | +| `__unserialize(array $data)` | void | implements the [`Serializable`](https://www.php.net/manual/en/language.oop5.magic.php#object.unserialize) interface | ## Disclaimer This might be either an utterly genius or completely stupid idea - you decide. However, i like it and it works. diff --git a/vendor/chillerlan/php-settings-container/composer.json b/vendor/chillerlan/php-settings-container/composer.json index 1d89b6c41..8d19b8db4 100644 --- a/vendor/chillerlan/php-settings-container/composer.json +++ b/vendor/chillerlan/php-settings-container/composer.json @@ -1,12 +1,12 @@ { "name": "chillerlan/php-settings-container", - "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+", + "description": "A container class for immutable settings objects. Not a DI container.", "homepage": "https://github.com/chillerlan/php-settings-container", "license": "MIT", "type": "library", "minimum-stability": "stable", "keywords": [ - "php7", "helper", "container", "settings", "configuration" + "helper", "container", "settings", "configuration" ], "authors": [ { @@ -20,12 +20,14 @@ "source": "https://github.com/chillerlan/php-settings-container" }, "require": { - "php": "^7.4 || ^8.0", + "php": "^8.1", "ext-json": "*" }, "require-dev": { - "phan/phan": "^5.3", - "phpunit/phpunit": "^9.5" + "phan/phan": "^5.4", + "phpmd/phpmd": "^2.15", + "phpunit/phpunit": "^10.5", + "squizlabs/php_codesniffer": "^3.9" }, "autoload": { "psr-4": { @@ -34,8 +36,7 @@ }, "autoload-dev": { "psr-4": { - "chillerlan\\SettingsTest\\": "tests/", - "chillerlan\\SettingsExamples\\": "examples/" + "chillerlan\\SettingsTest\\": "tests/" } }, "scripts": { diff --git a/vendor/chillerlan/php-settings-container/docs/Readme.md b/vendor/chillerlan/php-settings-container/docs/Readme.md deleted file mode 100644 index 7749a1e7f..000000000 --- a/vendor/chillerlan/php-settings-container/docs/Readme.md +++ /dev/null @@ -1,13 +0,0 @@ -# Auto generated API documentation - -The API documentation can be auto generated with [phpDocumentor](https://www.phpdoc.org/). -There is an [online version available](https://chillerlan.github.io/php-settings-container/) via the [gh-pages branch](https://github.com/chillerlan/php-settings-container/tree/gh-pages) that is [automatically deployed](https://github.com/chillerlan/php-settings-container/deployments) on each push to main. - -Locally created docs will appear in this directory. If you'd like to create local docs, please follow these steps: - -- [download phpDocumentor](https://github.com/phpDocumentor/phpDocumentor/releases) v3+ as .phar archive -- run it in the repository root directory: - - on Windows `c:\path\to\php.exe c:\path\to\phpDocumentor.phar --config=phpdoc.xml` - - on Linux just `php /path/to/phpDocumentor.phar --config=phpdoc.xml` -- open [index.html](./index.html) in a browser -- profit! diff --git a/vendor/chillerlan/php-settings-container/examples/advanced.php b/vendor/chillerlan/php-settings-container/examples/advanced.php deleted file mode 100644 index f11642c83..000000000 --- a/vendor/chillerlan/php-settings-container/examples/advanced.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/** - * @created 28.08.2018 - * @author smiley <smiley@chillerlan.net> - * @copyright 2018 smiley - * @license MIT - */ - -namespace chillerlan\SettingsExamples; - -use chillerlan\Settings\SettingsContainerAbstract; - -require_once __DIR__.'/../vendor/autoload.php'; - -// from library #1 -trait SomeOptions{ - protected string $foo = ''; - - // this method will be called in SettingsContainerAbstract::__construct() after the properties have been set - protected function SomeOptions(){ - // just some constructor stuff... - $this->foo = strtoupper($this->foo); - } -} - -// from library #2 -trait MoreOptions{ - protected string $bar = 'whatever'; // provide default values -} - -$commonOptions = [ - // SomeOptions - 'foo' => 'whatever', - // MoreOptions - 'bar' => 'nothing', -]; - -// now plug the several library options together to a single object - -/** - * @property string $foo - * @property string $bar - */ -class MySettings extends SettingsContainerAbstract{ - use SomeOptions, MoreOptions; // ... -}; - -$container = new MySettings($commonOptions); - -var_dump($container->foo); // -> WHATEVER (constructor ran strtoupper on the value) -var_dump($container->bar); // -> nothing diff --git a/vendor/chillerlan/php-settings-container/examples/simple.php b/vendor/chillerlan/php-settings-container/examples/simple.php deleted file mode 100644 index acdbe4cb3..000000000 --- a/vendor/chillerlan/php-settings-container/examples/simple.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/** - * @created 28.08.2018 - * @author smiley <smiley@chillerlan.net> - * @copyright 2018 smiley - * @license MIT - */ - -namespace chillerlan\SettingsExamples; - -use chillerlan\Settings\SettingsContainerAbstract; - -require_once __DIR__.'/../vendor/autoload.php'; - -class MyContainer extends SettingsContainerAbstract{ - protected $foo; - protected $bar; -} - -/** @var \chillerlan\Settings\SettingsContainerInterface $container */ -$container = new MyContainer(['foo' => 'what']); -$container->bar = 'foo'; - -var_dump($container->toJSON()); // -> {"foo":"what","bar":"foo"} - -// non-existing properties will be ignored: -$container->nope = 'what'; - -var_dump($container->nope); // -> NULL diff --git a/vendor/chillerlan/php-settings-container/phpdoc.xml b/vendor/chillerlan/php-settings-container/phpdoc.xml deleted file mode 100644 index d440f1d8a..000000000 --- a/vendor/chillerlan/php-settings-container/phpdoc.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<phpdoc> - <parser> - <target>docs</target> - <encoding>utf8</encoding> - <markers> - <item>TODO</item> - </markers> - </parser> - <transformer> - <target>docs</target> - </transformer> - <files> - <directory>src</directory> - <directory>tests</directory> - </files> - <transformations> - <template name="responsive-twig"/> - </transformations> -</phpdoc> diff --git a/vendor/chillerlan/php-settings-container/phpunit.xml b/vendor/chillerlan/php-settings-container/phpunit.xml deleted file mode 100644 index 9271a1bb1..000000000 --- a/vendor/chillerlan/php-settings-container/phpunit.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0"?> -<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd" - bootstrap="vendor/autoload.php" - cacheResultFile=".build/phpunit.result.cache" - colors="true" - verbose="true" -> - <coverage processUncoveredFiles="true"> - <include> - <directory suffix=".php">./src</directory> - </include> - <report> - <clover outputFile=".build/coverage/clover.xml"/> - <xml outputDirectory=".build/coverage/coverage-xml"/> - </report> - </coverage> - <testsuites> - <testsuite name="php-settings-container test suite"> - <directory suffix=".php">./tests/</directory> - </testsuite> - </testsuites> - <logging> - <junit outputFile=".build/logs/junit.xml"/> - </logging> -</phpunit> diff --git a/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php b/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php index 6b7a1ecc2..b54ca909c 100644 --- a/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php +++ b/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php @@ -7,12 +7,13 @@ * @copyright 2018 Smiley * @license MIT */ +declare(strict_types=1); namespace chillerlan\Settings; -use ReflectionClass, ReflectionProperty; - -use function get_object_vars, json_decode, json_encode, method_exists, property_exists; +use InvalidArgumentException, ReflectionClass, ReflectionProperty; +use function array_keys, get_object_vars, is_object, json_decode, + json_encode, method_exists, property_exists, serialize, unserialize; use const JSON_THROW_ON_ERROR; abstract class SettingsContainerAbstract implements SettingsContainerInterface{ @@ -20,7 +21,7 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{ /** * SettingsContainerAbstract constructor. */ - public function __construct(iterable $properties = null){ + public function __construct(iterable|null $properties = null){ if(!empty($properties)){ $this->fromIterable($properties); @@ -49,7 +50,7 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{ /** * @inheritdoc */ - public function __get(string $property){ + public function __get(string $property):mixed{ if(!property_exists($this, $property) || $this->isPrivate($property)){ return null; @@ -67,7 +68,7 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{ /** * @inheritdoc */ - public function __set(string $property, $value):void{ + public function __set(string $property, mixed $value):void{ if(!property_exists($this, $property) || $this->isPrivate($property)){ return; @@ -120,13 +121,19 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{ * @inheritdoc */ public function toArray():array{ - return get_object_vars($this); + $properties = []; + + foreach(array_keys(get_object_vars($this)) as $key){ + $properties[$key] = $this->__get($key); + } + + return $properties; } /** * @inheritdoc */ - public function fromIterable(iterable $properties):SettingsContainerInterface{ + public function fromIterable(iterable $properties):static{ foreach($properties as $key => $value){ $this->__set($key, $value); @@ -138,14 +145,14 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{ /** * @inheritdoc */ - public function toJSON(int $jsonOptions = null):string{ - return json_encode($this, $jsonOptions ?? 0); + public function toJSON(int|null $jsonOptions = null):string{ + return json_encode($this, ($jsonOptions ?? 0)); } /** * @inheritdoc */ - public function fromJSON(string $json):SettingsContainerInterface{ + public function fromJSON(string $json):static{ $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR); return $this->fromIterable($data); @@ -154,9 +161,80 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{ /** * @inheritdoc */ - #[\ReturnTypeWillChange] public function jsonSerialize():array{ return $this->toArray(); } + /** + * Returns a serialized string representation of the object in its current state (except static/readonly properties) + * + * @inheritdoc + * @see \chillerlan\Settings\SettingsContainerInterface::toArray() + */ + public function serialize():string{ + return serialize($this); + } + + /** + * Restores the data (except static/readonly properties) from the given serialized object to the current instance + * + * @inheritdoc + * @see \chillerlan\Settings\SettingsContainerInterface::fromIterable() + */ + public function unserialize(string $data):void{ + $obj = unserialize($data); + + if($obj === false || !is_object($obj)){ + throw new InvalidArgumentException('The given serialized string is invalid'); + } + + $reflection = new ReflectionClass($obj); + + if(!$reflection->isInstance($this)){ + throw new InvalidArgumentException('The unserialized object does not match the class of this container'); + } + + $properties = $reflection->getProperties(~(ReflectionProperty::IS_STATIC | ReflectionProperty::IS_READONLY)); + + foreach($properties as $reflectionProperty){ + $this->{$reflectionProperty->name} = $reflectionProperty->getValue($obj); + } + + } + + /** + * Returns a serialized string representation of the object in its current state (except static/readonly properties) + * + * @inheritdoc + * @see \chillerlan\Settings\SettingsContainerInterface::toArray() + */ + public function __serialize():array{ + + $properties = (new ReflectionClass($this)) + ->getProperties(~(ReflectionProperty::IS_STATIC | ReflectionProperty::IS_READONLY)) + ; + + $data = []; + + foreach($properties as $reflectionProperty){ + $data[$reflectionProperty->name] = $reflectionProperty->getValue($this); + } + + return $data; + } + + /** + * Restores the data from the given array to the current instance + * + * @inheritdoc + * @see \chillerlan\Settings\SettingsContainerInterface::fromIterable() + */ + public function __unserialize(array $data):void{ + + foreach($data as $key => $value){ + $this->{$key} = $value; + } + + } + } diff --git a/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php b/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php index ddacccd29..1c9c12a73 100644 --- a/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php +++ b/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php @@ -7,30 +7,28 @@ * @copyright 2018 Smiley * @license MIT */ +declare(strict_types=1); namespace chillerlan\Settings; -use JsonSerializable; +use JsonSerializable, Serializable; /** * a generic container with magic getter and setter */ -interface SettingsContainerInterface extends JsonSerializable{ +interface SettingsContainerInterface extends JsonSerializable, Serializable{ /** * Retrieve the value of $property * * @return mixed|null */ - public function __get(string $property); + public function __get(string $property):mixed; /** * Set $property to $value while avoiding private and non-existing properties - * - * @param string $property - * @param mixed $value */ - public function __set(string $property, $value):void; + public function __set(string $property, mixed $value):void; /** * Checks if $property is set (aka. not null), excluding private properties @@ -43,32 +41,38 @@ interface SettingsContainerInterface extends JsonSerializable{ public function __unset(string $property):void; /** - * @see SettingsContainerInterface::toJSON() + * @see \chillerlan\Settings\SettingsContainerInterface::toJSON() */ public function __toString():string; /** * Returns an array representation of the settings object + * + * The values will be run through the magic __get(), which may also call custom getters. */ public function toArray():array; /** * Sets properties from a given iterable + * + * The values will be run through the magic __set(), which may also call custom setters. */ - public function fromIterable(iterable $properties):SettingsContainerInterface; + public function fromIterable(iterable $properties):static; /** * Returns a JSON representation of the settings object * @see \json_encode() + * @see \chillerlan\Settings\SettingsContainerInterface::toArray() */ - public function toJSON(int $jsonOptions = null):string; + public function toJSON(int|null $jsonOptions = null):string; /** * Sets properties from a given JSON string * * @throws \Exception * @throws \JsonException + * @see \chillerlan\Settings\SettingsContainerInterface::fromIterable() */ - public function fromJSON(string $json):SettingsContainerInterface; + public function fromJSON(string $json):static; } |